# 2.11BSD#431 - /usr/src/lib/libc/gen/scandir.c

##### Functions

    alphasort         X
    scandir           X

       1: /*
       2:  * Copyright (c) 1983 Regents of the University of California.
       3:  * All rights reserved.  The Berkeley software License Agreement
       4:  * specifies the terms and conditions for redistribution.
       5:  */
       6:
       7: #if defined(LIBC_SCCS) && !defined(lint)
       8: static char sccsid[] = "@(#)scandir.c	5.2 (Berkeley) 3/9/86";
       9: #endif LIBC_SCCS and not lint
      10:
      11: /*
      12:  * Scan the directory dirname calling select to make a list of selected
      13:  * directory entries then sort using qsort and compare routine dcomp.
      14:  * Returns the number of entries and a pointer to a list of pointers to
      15:  * struct direct (through namelist). Returns -1 if there were any errors.
      16:  */
      17:
      18: #include <sys/types.h>
      19: #include <sys/stat.h>
      20: #include <sys/dir.h>
      21:
      22: scandir(dirname, namelist, select, dcomp)
      23:     char *dirname;
      24:     struct direct *(*namelist[]);
      25:     int (*select)(), (*dcomp)();
      26: {
      27:     register struct direct *d, *p, **names;
      28:     register int nitems;
      29:     register char *cp1, *cp2;
      30:     struct stat stb;
      31:     int arraysz;
      32:     DIR *dirp;
      33:
      34:     if ((dirp = opendir(dirname)) == NULL)
      35:         return(-1);
      36:     if (fstat(dirp->dd_fd, &stb) < 0)
      37:         return(-1);
      38:
      39:     /*
      40: 	 * estimate the array size by taking the size of the directory file
      41: 	 * and dividing it by a multiple of the minimum size entry.
      42: 	 */
      43:     arraysz = (stb.st_size / 24);
      44:     names = (struct direct **)malloc(arraysz * sizeof(struct direct *));
      45:     if (names == NULL)
      46:         return(-1);
      47:
      48:     nitems = 0;
      49:     while ((d = readdir(dirp)) != NULL) {
      50:         if (select != NULL && !(*select)(d))
      51:             continue;   /* just selected names */
      52:         /*
      53: 		 * Make a minimum size copy of the data
      54: 		 */
      55:         p = (struct direct *)malloc(DIRSIZ(d));
      56:         if (p == NULL)
      57:             return(-1);
      58:         p->d_ino = d->d_ino;
      59:         p->d_reclen = d->d_reclen;
      60:         p->d_namlen = d->d_namlen;
      61:         for (cp1 = p->d_name, cp2 = d->d_name; *cp1++ = *cp2++; );
      62:         /*
      63: 		 * Check to make sure the array has space left and
      64: 		 * realloc the maximum size.
      65: 		 */
      66:         if (++nitems >= arraysz) {
      67:             if (fstat(dirp->dd_fd, &stb) < 0)
      68:                 return(-1); /* just might have grown */
      69:             arraysz = stb.st_size / 12;
      70:             names = (struct direct **)realloc((char *)names,
      71:                 arraysz * sizeof(struct direct *));
      72:             if (names == NULL)
      73:                 return(-1);
      74:         }
      75:         names[nitems-1] = p;
      76:     }
      77:     closedir(dirp);
      78:     if (nitems && dcomp != NULL)
      79:         qsort(names, nitems, sizeof(struct direct *), dcomp);
      80:     *namelist = names;
      81:     return(nitems);
      82: }
      83:
      84: /*
      85:  * Alphabetic order comparison routine for those who want it.
      86:  */
      87: alphasort(d1, d2)
      88:     struct direct **d1, **d2;
      89: {
      90:     return(strcmp((*d1)->d_name, (*d2)->d_name));
      91: }

#### Defined functions

alphasort defined in line 87; used 4 times

- in /usr/src/usr.bin/at/atq.c line 71, 119
- in /usr/src/usr.bin/at/atrm.c line 59, 129

scandir defined in line 22; used 5 times

- in /usr/src/usr.bin/at/atq.c line 118
- in /usr/src/usr.bin/at/atrm.c line 129
- in /usr/src/usr.bin/at/atrun.c line 79
- in /usr/src/usr.sbin/lpr/cmds.c line 203
- in /usr/src/usr.sbin/lpr/rmjob.c line 74

#### Defined variables

sccsid defined in line 8; never used

Last modified: 1987-03-12 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 587 |