diff options
Diffstat (limited to 'gnu/usr.bin/cvs/os2/dirent.c')
-rw-r--r-- | gnu/usr.bin/cvs/os2/dirent.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/gnu/usr.bin/cvs/os2/dirent.c b/gnu/usr.bin/cvs/os2/dirent.c new file mode 100644 index 00000000000..01bd92f56e7 --- /dev/null +++ b/gnu/usr.bin/cvs/os2/dirent.c @@ -0,0 +1,180 @@ +/* + * Author: Bob Withers + * Copyright (c) 1993, All Rights Reserved + * + * NOTICE + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted + * provided that the above copyright notice appears in all copies and + * that both the copyright notice and this permission notice appear in + * supporting documentation. + * + * The author makes no representations about the suitability of this + * software for any purpose. This software is provided ``as is'' + * without express or implied warranty. + */ + +#include <stdlib.h> +#include <string.h> + +#define INCL_DOSFILEMGR +#define INCL_DOSERRORS +#include <os2.h> + +#include "dirent.h" + + +#define DIRENT_INCR 25 + + +DIR *opendir(char *filename) +{ + auto size_t len; + auto DIR *dirp; + auto char *p; + auto HDIR hdir; + +#ifdef OS2_16 + auto USHORT rc; /* for 16 bit OS/2 */ + auto FILEFINDBUF ff; + auto USHORT cnt; +#else + auto APIRET rc; /* for 32 bit OS/2 */ + auto FILEFINDBUF3 ff; + auto ULONG cnt; +#endif /* OS2_16 */ + + if (NULL == filename || '\0' == filename[0]) + filename = "."; + + dirp = malloc(sizeof(*dirp)); + if (NULL == dirp) + return(NULL); + + len = strlen(filename); + dirp->dirname = malloc(len + 5); + if (NULL == dirp->dirname) + { + free(dirp); + return(NULL); + } + + dirp->max_ent = 0; + dirp->tot_ent = 0; + dirp->cur_ent = 0; + dirp->entp = NULL; + strcpy(dirp->dirname, filename); + for (p = dirp->dirname; *p; ++p) + { + if ('/' == *p) + *p = '\\'; + } + + if ('\\' != dirp->dirname[len - 1]) + strcat(dirp->dirname, "\\"); + + strcat(dirp->dirname, "*.*"); + + hdir = HDIR_SYSTEM; + cnt = 1; + rc = DosFindFirst(dirp->dirname, &hdir, + FILE_NORMAL | FILE_READONLY | FILE_HIDDEN | + FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED, + &ff, sizeof(ff), &cnt, FIL_STANDARD); + + while (NO_ERROR == rc) + { + auto struct dirent *entp; + + if (dirp->tot_ent >= dirp->max_ent) + { + auto struct dirent **p; + + dirp->max_ent += DIRENT_INCR; + p = realloc(dirp->entp, dirp->max_ent * sizeof(entp)); + if (NULL == p) + { + rc = ERROR_NOT_ENOUGH_MEMORY; + break; + } + + dirp->entp = p; + } + + entp = malloc(sizeof(*entp) + (size_t) ff.cchName); + if (NULL == entp) + { + rc = ERROR_NOT_ENOUGH_MEMORY; + break; + } + + entp->d_ino = 0; + entp->d_off = dirp->tot_ent; + entp->d_namlen = (unsigned short) ff.cchName; + memcpy(entp->d_name, ff.achName, entp->d_namlen); + entp->d_name[entp->d_namlen] = '\0'; + dirp->entp[dirp->tot_ent++] = entp; + + cnt = 1; + rc = DosFindNext(hdir, &ff, sizeof(ff), &cnt); + } + + DosFindClose(hdir); + if (ERROR_NO_MORE_FILES == rc) + return(dirp); + + closedir(dirp); + return(NULL); +} + + +struct dirent *readdir(DIR *dirp) +{ + if (dirp->cur_ent < 0 || dirp->cur_ent >= dirp->tot_ent) + return(NULL); + + return(dirp->entp[dirp->cur_ent++]); +} + + +long telldir(DIR *dirp) +{ + return((long) dirp->cur_ent); +} + + +void seekdir(DIR *dirp, long loc) +{ + dirp->cur_ent = (int) loc; + return; +} + + +void rewinddir(DIR *dirp) +{ + dirp->cur_ent = 0; + return; +} + + +void closedir(DIR *dirp) +{ + if (dirp) + { + if (dirp->dirname) + free(dirp->dirname); + + if (dirp->entp) + { + register int i; + + for (i = 0; i < dirp->tot_ent; ++i) + free(dirp->entp[i]); + + free(dirp->entp); + } + } + + return; +} |