| TIP: Click on subject to list as thread! | ANSI |
| echo: | |
|---|---|
| to: | |
| from: | |
| date: | |
| subject: | Extended attributes... |
Hallo Francisco !
> Could please someone post here code to attach an extended attribute to a
> file from C? I've tried DosSetPathInfo but I've not been lucky :-)
I derived this from an older 16-Bit example:
[ *d:\sourcecode\answer\h\typedefs.h* ]
#pragma pack ( 1 )
typedef struct _HoldFEA
{
ULONG oNextEntryOffset;
BYTE fEA;
BYTE cbName;
USHORT cbValue;
PCHAR szName;
PCHAR aValue;
struct _HoldFEA *next;
} HOLDFEA, *PHOLDFEA;
#pragma pack ( )
[ *d:\sourcecode\answer\h\typedefs.h* ]
[ *d:\sourcecode\answer\src\getputea.cpp* ]
#define INCL_DOS
#include
#include
#include
#include
#include "typedefs.h"
#define MAX_GEA 500L
#define GetInfoLevel1 1
#define SetInfoLevel2 2
#define Ref_ASCIIZ 1
VOID FreeEAs ( PHOLDFEA pHoldFEA )
{
while ( NULL != pHoldFEA )
{
PHOLDFEA pNext = pHoldFEA->next;
free ( pHoldFEA->szName );
free ( pHoldFEA->aValue );
free ( pHoldFEA );
pHoldFEA = pNext;
}
}
PHOLDFEA QueryEAs ( PCHAR pszPath )
{
PHOLDFEA pHoldFEA = NULL;
PCHAR pAllocc;
PCHAR pBigAlloc;
USHORT cbBigAlloc = 0;
ULONG ulEntryNum = 1;
ULONG ulEnumCnt;
PHOLDFEA pLastIn=NULL;
PHOLDFEA pNewFEA=NULL;
PFEA2 pFEA;
PGEA2LIST pGEAList;
EAOP2 eaopGet;
pAllocc = ( PCHAR ) calloc ( MAX_GEA,
1 );
pFEA = ( PFEA2 ) pAllocc;
pHoldFEA = '\0';
ulEnumCnt = 1;
while ( 1 == ulEnumCnt )
{
ulEnumCnt = 1;
if ( DosEnumAttribute ( Ref_ASCIIZ,
pszPath,
ulEntryNum,
pAllocc,
MAX_GEA,
&ulEnumCnt,
( LONG ) GetInfoLevel1 ) )
break;
if ( 1 != ulEnumCnt )
break;
ulEntryNum++;
pNewFEA = ( PHOLDFEA) calloc ( sizeof ( HOLDFEA ),
1 );
pNewFEA->cbName = pFEA->cbName;
pNewFEA->cbValue= pFEA->cbValue;
pNewFEA->fEA = pFEA->fEA;
pNewFEA->next = '\0';
pNewFEA->szName = ( PCHAR ) calloc ( pFEA->cbName + 1,
1 );
pNewFEA->aValue = ( PCHAR ) calloc ( pFEA->cbValue + 1,
1 );
strcpy ( pNewFEA->szName,
pFEA->szName );
cbBigAlloc = sizeof ( FEA2LIST ) + pNewFEA->cbName+1 + pNewFEA->cbValue;
pBigAlloc = ( PCHAR ) calloc ( cbBigAlloc, 1 );
pGEAList = ( PGEA2LIST ) pAllocc;
pGEAList->cbList = sizeof ( GEA2LIST ) + pNewFEA->cbName; /* +1
for NULL */
pGEAList->list[0].oNextEntryOffset = 0L;
pGEAList->list[0].cbName = pNewFEA->cbName;
strcpy ( pGEAList->list[0].szName,
pNewFEA->szName );
eaopGet.fpGEA2List = ( PGEA2LIST ) pAllocc;
eaopGet.fpFEA2List = ( PFEA2LIST ) pBigAlloc;
eaopGet.fpFEA2List->cbList = cbBigAlloc;
DosQueryPathInfo ( pszPath,
FIL_QUERYEASFROMLIST,
( PVOID ) &eaopGet,
sizeof ( EAOP2 ) );
memcpy ( pNewFEA->aValue,
pBigAlloc + sizeof ( FEA2LIST ) + pNewFEA->cbName,
pNewFEA->cbValue );
free ( pBigAlloc );
if ( pHoldFEA == '\0')
pHoldFEA = pNewFEA;
else
pLastIn->next = pNewFEA;
pLastIn = pNewFEA;
}
free ( pAllocc );
return ( pHoldFEA );
}
VOID WriteEAs ( PCHAR szFileName,
PHOLDFEA pHoldFEA )
{
PDELETELIST pDLnext;
EAOP2 eaopWrite;
CHAR aBuf[MAX_GEA],*aPtr=NULL;
PFEA2 pFEA = ( PFEA2 ) &aBuf[sizeof(ULONG)];
USHORT usMemNeeded, usRet;
PULONG pulPtr = ( PULONG ) aBuf;
eaopWrite.fpFEA2List = ( PFEA2LIST ) aBuf;
pFEA->fEA = 0;
pFEA->cbValue = 0;
while ( pHoldFEA )
{
usMemNeeded = sizeof ( FEA2LIST ) + pHoldFEA->cbName+1 +
pHoldFEA->cbValue;
aPtr = ( PCHAR ) calloc ( usMemNeeded,
1 );
eaopWrite.fpFEA2List = ( PFEA2LIST ) aPtr;
eaopWrite.fpFEA2List->cbList = usMemNeeded;
eaopWrite.fpFEA2List->list[0].fEA = pHoldFEA->fEA;
eaopWrite.fpFEA2List->list[0].cbName = pHoldFEA->cbName;
eaopWrite.fpFEA2List->list[0].cbValue = pHoldFEA->cbValue;
strcpy ( eaopWrite.fpFEA2List->list[0].szName,
pHoldFEA->szName );
memcpy ( eaopWrite.fpFEA2List->list[0].szName + pHoldFEA->cbName+1,
pHoldFEA->aValue,
pHoldFEA->cbValue );
usRet = DosSetPathInfo ( szFileName,
FIL_QUERYEASIZE,
( PVOID ) &eaopWrite,
sizeof ( EAOP2 ),
DSPI_WRTTHRU );
if ( usRet )
{
free ( aPtr );
return;
}
free ( aPtr );
pHoldFEA = pHoldFEA->next;
}
return;
}
[ *d:\sourcecode\answer\src\getputea.cpp* ]
Here's a example how to attach an EA to a file:
#define EA_NAME "OUR_EA.FIRST_ENTRY"
HOLDFEA holdFEA;
PCHAR pValue = ( PCHAR ) malloc ( 2 + 2 + strlen ( pcEAValue ) );
holdFEA.fEA = FALSE;
holdFEA.szName = EA_NAME;
holdFEA.aValue = pValue;
holdFEA.cbName = strlen ( holdFEA.szName );
holdFEA.cbValue = 2 + 2 + strlen ( pcEAValue );
holdFEA.next = NULL;
pC = pValue; * ( PUSHORT ) pC = EAT_ASCII;
pC += 2; * ( PUSHORT ) pC = strlen ( pcEAValue );
pC += 2; memcpy ( pC,
pcEAValue,
strlen ( pcEAValue ) );
WriteEAs ( cFileName,
&holdFEA,
NULL );
Joerg-Stefan
--- Sqed/32 1.11a/development
* Origin: Home of Sqed/32 (2:2432/626)SEEN-BY: 50/99 270/101 620/243 625/100 711/401 409 410 413 430 808 809 934 SEEN-BY: 711/955 712/407 515 517 628 713/888 800/1 @PATH: 2432/626 600 321 200 2433/1200 225 270/101 712/515 711/808 934 |
|
| SOURCE: echomail via fidonet.ozzmosis.com | |
Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.