TIP: Click on subject to list as thread! ANSI
echo: os2prog
to: Francisco Sedano
from: Joerg-Stefan Sell
date: 1996-06-22 02:28:22
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™.