home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / IO / EAGET.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  2.1 KB  |  92 lines

  1. /* eaget.c (emx+gcc) -- Copyright (c) 1993 by Eberhard Mattes */
  2.  
  3. #define INCL_DOSFILEMGR
  4. #include <os2.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <io.h>
  8. #include <errno.h>
  9. #include <sys/ea.h>
  10. #include "ea.h"
  11.  
  12. int _ea_get (struct _ea *dst, const char *path, int handle,
  13.              const char *name)
  14. {
  15.   const void *fileref;
  16.   ULONG rc, reftype, hf;
  17.   EAOP2 eaop;
  18.   PGEA2LIST pgealist;
  19.   PFEA2LIST pfealist;
  20.   PGEA2 pgea;
  21.   PFEA2 pfea;
  22.   int len, size;
  23.  
  24.   dst->flags = 0;
  25.   dst->size = 0;
  26.   dst->value = NULL;
  27.   if (_osmode != OS2_MODE)
  28.     {
  29.       if (path != NULL)
  30.         {
  31.           if (access (path, 0) != 0)
  32.             return (-1);
  33.         }
  34.       else
  35.         {
  36.           if (tell (handle) == -1)
  37.             return (-1);
  38.         }
  39.       return (0);
  40.     }
  41.   if (path != NULL)
  42.     {
  43.       reftype = ENUMEA_REFTYPE_PATH;
  44.       fileref = path;
  45.     }
  46.   else
  47.     {
  48.       hf = handle;
  49.       reftype = ENUMEA_REFTYPE_FHANDLE;
  50.       fileref = &hf;
  51.     }
  52.   len = strlen (name);
  53.   size = sizeof (GEA2LIST) + len;
  54.   pgealist = alloca (size);
  55.   pgealist->cbList = size;
  56.   pgea = &pgealist->list[0];
  57.   pgea->oNextEntryOffset = 0;
  58.   pgea->cbName = len;
  59.   memcpy (pgea->szName, name, len + 1);
  60.   size = sizeof (FEA2LIST) + 0x10000;
  61.   pfealist = alloca (size);
  62.   pfealist->cbList = size;
  63.   eaop.fpGEA2List = pgealist;
  64.   eaop.fpFEA2List = pfealist;
  65.   eaop.oError = 0;
  66.   if (path == NULL)
  67.     rc = DosQueryFileInfo (handle, FIL_QUERYEASFROMLIST, &eaop,
  68.                            sizeof (eaop));
  69.   else
  70.     rc = DosQueryPathInfo (path, FIL_QUERYEASFROMLIST, &eaop,
  71.                            sizeof (eaop));
  72.   if (rc != 0)
  73.     {
  74.       _ea_set_errno (rc);
  75.       return (-1);
  76.     }
  77.   pfea = &pfealist->list[0];
  78.   if (pfea->cbValue != 0)
  79.     {
  80.       dst->value = malloc (pfea->cbValue);
  81.       if (dst->value == NULL)
  82.         {
  83.           errno = ENOMEM;
  84.           return (-1);
  85.         }
  86.       memcpy (dst->value, pfea->szName + pfea->cbName, pfea->cbValue);
  87.     }
  88.   dst->flags = pfea->fEA;
  89.   dst->size = pfea->cbValue;
  90.   return (0);
  91. }
  92.