Files
fstester/getter/os2_32/EA.C

92 lines
2.1 KiB
C++
Raw Normal View History

/* Public domain code from Info/Zip
* Written by Kai Uew Rommel
* from zip30/os2/os2zip.c
* Modified by Natalia Portillo
*/
#include <stdlib.h>
#include <string.h>
#define INCL_NOPM
#define INCL_DOSNLS
#define INCL_DOSERRORS
#include "ea.h"
2019-01-27 20:33:59 +00:00
#include <os2.h>
void GetEAs(char *path, char **bufptr, size_t *size)
{
FILESTATUS4 fs;
PDENA2 pDENA, pFound;
EAOP2 eaop;
PGEA2 pGEA;
PGEA2LIST pGEAlist;
PFEA2LIST pFEAlist;
ULONG ulAttributes;
ULONG nLength;
ULONG nBlock;
2019-01-27 20:33:59 +00:00
if(DosQueryPathInfo(path, FIL_QUERYEASIZE, (PBYTE)&fs, sizeof(fs))) return;
nBlock = max(fs.cbList, 65535);
2019-01-27 20:33:59 +00:00
if((pDENA = malloc((size_t)nBlock)) == NULL) return;
ulAttributes = -1;
if(DosEnumAttribute(ENUMEA_REFTYPE_PATH, path, 1, pDENA, nBlock, &ulAttributes, ENUMEA_LEVEL_NO_VALUE) ||
ulAttributes == 0 || (pGEAlist = malloc((size_t)nBlock)) == NULL)
{
free(pDENA);
return;
}
pGEA = pGEAlist->list;
memset(pGEAlist, 0, nBlock);
pFound = pDENA;
while(ulAttributes--)
{
pGEA->cbName = pFound->cbName;
strcpy(pGEA->szName, pFound->szName);
nLength = sizeof(GEA2) + strlen(pGEA->szName);
nLength = ((nLength - 1) / sizeof(ULONG) + 1) * sizeof(ULONG);
pGEA->oNextEntryOffset = ulAttributes ? nLength : 0;
2019-01-27 20:33:59 +00:00
pGEA = (PGEA2)((PCH)pGEA + nLength);
pFound = (PDENA2)((PCH)pFound + pFound->oNextEntryOffset);
}
if(pGEA == pGEAlist->list) // No attributes to save
{
free(pDENA);
free(pGEAlist);
return;
}
pGEAlist->cbList = (PCH)pGEA - (PCH)pGEAlist;
2019-01-27 20:33:59 +00:00
pFEAlist = (PVOID)pDENA; // reuse buffer
pFEAlist->cbList = nBlock;
eaop.fpGEA2List = pGEAlist;
eaop.fpFEA2List = pFEAlist;
eaop.oError = 0;
2019-01-27 20:33:59 +00:00
if(DosQueryPathInfo(path, FIL_QUERYEASFROMLIST, (PBYTE)&eaop, sizeof(eaop)))
{
free(pDENA);
free(pGEAlist);
return;
}
*size = pFEAlist->cbList;
*bufptr = (char *)pFEAlist;
free(pDENA);
free(pGEAlist);
}