home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / util / hier_scanQ.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  2.6 KB  |  133 lines

  1. /* hier_scanQ.c: scan q which may stored in a hierarchy of directories */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/util/RCS/hier_scanQ.c,v 6.0 1991/12/18 20:25:18 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/util/RCS/hier_scanQ.c,v 6.0 1991/12/18 20:25:18 jpo Rel $
  9.  *
  10.  * $Log: hier_scanQ.c,v $
  11.  * Revision 6.0  1991/12/18  20:25:18  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include "util.h"
  17. #include <pwd.h>
  18. #include <isode/usr.dirent.h>
  19. #include <sys/stat.h>
  20.  
  21. #define SIZE_INCR    1000
  22.  
  23. #ifndef S_ISDIR
  24. #define S_ISDIR(m)    (((m) & S_IFMT) == S_IFDIR)
  25. #endif
  26.  
  27. static void addtolist();
  28.  
  29. free_hier(arr, num)
  30. char    **arr;
  31. int    num;
  32. {
  33.     int    i;
  34.     for (i = 0; i < num; i++)
  35.         free(arr[i]);
  36.     free((char *) arr);
  37. }
  38.  
  39. static int isNum(str)
  40. char    *str;
  41. {
  42.     int    retval = 0;
  43.     
  44.     while (str != NULLCP && *str != '\0'
  45.            && (retval = isdigit(*str))) str++;
  46.     return retval;
  47. }
  48.  
  49. hier_scanQ(dname, base, pnum, parr, psize, nonMsg)
  50. char    *dname;
  51. char    *base;
  52. int    *pnum;
  53. char    ***parr;
  54. int    *psize;
  55. IFP    nonMsg;
  56. {
  57.     struct dirent *dp;
  58.     DIR *dirp;
  59.     char    ndname[BUFSIZ];
  60.  
  61.     if ((dirp = opendir(dname)) == NULL) {
  62.         PP_SLOG (LLOG_EXCEPTIONS, dname,
  63.              ("Can't open directory"));
  64.         return;
  65.     }
  66.  
  67.     while ((dp = readdir (dirp)) != NULL) {
  68.         if (strncmp (dp->d_name, "msg.", strlen("msg.")) == 0)
  69.             addtolist(dp->d_name, base, pnum, parr, psize);
  70.         else {
  71.             (void) sprintf (ndname, "%s/%s",
  72.                     dname, dp -> d_name);
  73.  
  74.             if (isNum (dp->d_name)) {
  75.                 char    nbase[BUFSIZ];
  76.                 struct stat st;
  77.  
  78.                 if (stat (ndname, &st) != NOTOK
  79.                     && S_ISDIR(st.st_mode)) {
  80.                     if (base)
  81.                         (void) sprintf (nbase, 
  82.                                 "%s/%s",
  83.                                 base, 
  84.                                 dp -> d_name);
  85.                     else
  86.                         (void) sprintf (nbase, 
  87.                                 dp -> d_name);
  88.                     hier_scanQ(ndname, nbase, pnum, 
  89.                            parr, psize, nonMsg);
  90.                 } else if (nonMsg != NULLIFP)
  91.                     (*nonMsg) (ndname);
  92.  
  93.             } else if (nonMsg != NULLIFP && 
  94.                    lexequ(dp->d_name, ".") != 0 &&
  95.                    lexequ(dp->d_name, "..") != 0)
  96.                 (*nonMsg) (ndname);
  97.         }
  98.     }
  99.  
  100.     (void) closedir (dirp);
  101. }
  102.  
  103. static void addtolist (name, base, pnum, parr, psize)
  104. char    *name;
  105. char    *base;
  106. int    *pnum;
  107. char    ***parr;
  108. int    *psize;
  109. {
  110.     char    *np;
  111.     char    fname[BUFSIZ];
  112.  
  113.     if (base)
  114.         (void) sprintf (np = fname, "%s/%s", base, name);
  115.     else
  116.         np = name;
  117.  
  118.     if (*psize == *pnum) {
  119.         if (*psize == 0) {
  120.             *psize = SIZE_INCR;
  121.             *parr = (char **) smalloc ((int)sizeof (char *) * (*psize));
  122.         } else {
  123.             *psize += SIZE_INCR;
  124.             *parr = (char **) realloc ((char *) (*parr),
  125.                            (unsigned)sizeof (char *) * (*psize));
  126.             if (*parr == NULLVP)
  127.                 PP_OPER (NULLCP,
  128.                      ("FATAL: Out of memory"));
  129.         }
  130.     }
  131.     (*parr)[(*pnum)++] = strdup (np);
  132. }
  133.