Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!usc!csun!csuna!abcscnge From: abcscnge@csuna.csun.edu (Scott "The Pseudo-Hacker" Neugroschl) Newsgroups: comp.unix.questions Subject: Curdir(3) source (apologies if this is the wrong group) Message-ID: <2120@csuna.csun.edu> Date: 6 Aug 89 18:12:14 GMT Reply-To: abcscnge@csuna.csun.edu (Scott Neugroschl) Distribution: usa Organization: California State University, Northridge Lines: 175 Several people have mailed and asked for the source to my curdir function, so (as it is now easier to post than reply), here it is. I apologize if this is the wrong news group, please do not flame... I am posting here because this is where I made the original comment... ---- cut here ---- /* ** if your system does not support the directory(3X) functions, i.e. no ** , then define _NO_DIRENT_H_ at the top of the file. */ #include #include #include #ifndef _NO_DIRENT_H_ #include #else #include typedef int DIR; struct dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[DIRSIZ+2]; }; static DIR *opendir(); static struct dirent *readdir(); static long telldir(); static void seekdir(); static int closedir(); #define rewinddir(dirp) seekdir(dirp,0L); #endif curdir(str) char str[]; { static char tmpstr[BUFSIZ]; static char openpath[BUFSIZ+BUFSIZ]; static char tmpnam[BUFSIZ+BUFSIZ]; struct stat buf, rootbuf, tmpstat; DIR *dirp; struct dirent *dp; int l; if (stat("/",&rootbuf) == -1) return(-1); if (stat(".",&buf) == -1) return(-1); openpath[0] = tmpstr[0] = '\0'; strcpy(openpath,".."); while (buf.st_dev != rootbuf.st_dev || buf.st_ino != rootbuf.st_ino) { if ((dirp = opendir(openpath)) == NULL) return(-1); while ((dp = readdir(dirp)) != NULL) { sprintf(tmpnam,"%s/%s",openpath,dp->d_name); if (stat(tmpnam,&tmpstat) == -1) { closedir(dirp); return(-1); } if (tmpstat.st_dev == buf.st_dev && tmpstat.st_ino == buf.st_ino) break; } closedir(dirp); if (dp == NULL) return(-1); append(dp->d_name,tmpstr); if (stat(openpath,&buf) == -1) return(-1); sprintf(openpath,"../%s",openpath); } strcpy(str,"/"); strcat(str,tmpstr); if (str[l = (strlen(str) - 1)] == '/') str[l] = '\0'; return(0); } static append(head,tail) char *head, *tail; { char tmpbuf[BUFSIZ+BUFSIZ]; strcpy(tmpbuf,head); strcat(tmpbuf,"/"); strcat(tmpbuf,tail); strcpy(tail,tmpbuf); } #ifdef _NO_DIRENT_H static off_t curoff = ((off_t) 0); static DIR *opendir(name) int name; { char *malloc(); DIR *dp; struct stat buf; /* no file, or not a directory */ if (stat(name,&buf) == -1 || (buf.st_mode & S_IFMT) != S_IFDIR) return(NULL); /* no memory? */ if ((dp = (DIR *)malloc(sizeof(DIR))) == NULL) return(NULL); /* can't open? */ if ((*dp = open(name,0)) == -1) { free(dp); return(NULL); } curoff = (off_t)0; return(dp); } static struct dirent *readdir(dirp) register DIR *dirp; { static struct dirent dp; struct direct dir; if (read(*dirp,&dir,sizeof(dir)) != sizeof(dir)) return(NULL); dp.d_ino = (long) dir.d_ino; dp.d_off = curoff; curoff += sizeof(dir); dp.d_reclen = sizeof(dir); strncpy(dp.d_name,dir.d_name,DIRSIZ); dp.d_name[DIRSIZ] = '\0'; return(&dp); } static long telldir(dp) register DIR *dp; { long lseek(); return((long)(curoff = (off_t) lseek(*dp,0L,1))); } static void seekdir(dp,offset) register DIR *dp; register long offset; { long lseek(); curoff = (off_t)lseek(*dp,offset,0); } static int closedir(dp) register DIR *dp; { close(*dp); free(dp); return(0); } #endif --- cut here --- -- Scott "The Pseudo-Hacker" Neugroschl UUCP: ...!sm.unisys.com!csun!csuna.csun.edu!abcscnge -- Beat me, Whip me, make me code in Ada -- Disclaimers? We don't need no stinking disclaimers!!!