ndir
rick
rick
Tue Oct 26 21:15:29 AEST 1982
sed 's/^ //' >_ <<\*-*-END-*-*
sed 's/^ //' >_ <<\*-*-END-*-*
*-*-END-*-*
sed 's/^ //' >closedir.c <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
static char sccsid[] = "@(#)closedir.c 4.2 3/10/82";
#include <sys/types.h>
#include <ndir.h>
/*
* close a directory.
*/
void
closedir(dirp)
register DIR *dirp;
{
close(dirp->dd_fd);
dirp->dd_fd = -1;
dirp->dd_loc = 0;
free(dirp);
}
*-*-END-*-*
sed 's/^ //' >ndir.h <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
/* @(#)ndir.h 4.4 3/30/82 */
/*
* This sets the "page size" for directories.
* Requirements are DEV_BSIZE <= DIRBLKSIZ <= MINBSIZE with
* DIRBLKSIZ a power of two.
* Dennis Ritchie feels that directory pages should be atomic
* operations to the disk, so we use DEV_BSIZE.
*/
#define DIRBLKSIZ 512
/*
* This limits the directory name length. Its main constraint
* is that it appears twice in the user structure. (u. area)
*/
#define MAXNAMLEN 255
struct direct {
u_long d_ino;
short d_reclen;
short d_namlen;
char d_name[MAXNAMLEN + 1];
/* typically shorter */
};
struct _dirdesc {
int dd_fd;
long dd_loc;
long dd_size;
char dd_buf[DIRBLKSIZ];
};
/*
* useful macros.
*/
#undef DIRSIZ
#define DIRSIZ(dp) \
((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
~(sizeof(ino_t) - 1))
typedef struct _dirdesc DIR;
#ifndef NULL
#define NULL 0
#endif
/*
* functions defined on directories
*/
extern DIR *opendir();
extern struct direct *readdir();
extern long telldir();
extern void seekdir();
#define rewinddir(dirp) seekdir((dirp), 0)
extern void closedir();
*-*-END-*-*
sed 's/^ //' >opendir.c <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
static char sccsid[] = "@(#)opendir.c 4.2 3/10/82";
#include <sys/types.h>
#include <sys/stat.h>
#include <ndir.h>
/*
* open a directory.
*/
DIR *
opendir(name)
char *name;
{
register DIR *dirp;
struct stat sbuf;
dirp = (DIR *)malloc(sizeof(DIR));
dirp->dd_fd = open(name, 0);
if (dirp->dd_fd == -1) {
free(dirp);
return NULL;
}
fstat(dirp->dd_fd, &sbuf);
if ((sbuf.st_mode & S_IFDIR) == 0) {
free(dirp);
return NULL;
}
dirp->dd_loc = 0;
return dirp;
}
*-*-END-*-*
sed 's/^ //' >readdir.c <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
static char sccsid[] = "@(#)readdir.c 4.2 3/12/82";
#include <sys/types.h>
#include <ndir.h>
/*
* read an old stlye directory entry and present it as a new one
*/
#define ODIRSIZ 14
struct olddirect {
ino_t od_ino;
char od_name[ODIRSIZ];
};
/*
* get next entry in a directory.
*/
struct direct *
readdir(dirp)
register DIR *dirp;
{
register struct olddirect *dp;
static struct direct dir;
for (;;) {
if (dirp->dd_loc == 0) {
dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
DIRBLKSIZ);
if (dirp->dd_size <= 0)
return NULL;
}
if (dirp->dd_loc >= dirp->dd_size) {
dirp->dd_loc = 0;
continue;
}
dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
dirp->dd_loc += sizeof(struct olddirect);
if (dp->od_ino == 0)
continue;
dir.od_ino = dp->d_ino;
strncpy(dir.d_name, dp->od_name, ODIRSIZ);
dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
dir.d_namlen = strlen(dir.d_name);
dir.d_reclen = DIRSIZ(&dir);
return (&dir);
}
}
*-*-END-*-*
sed 's/^ //' >seekdir.c <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
static char sccsid[] = "@(#)seekdir.c 4.3 2/25/82";
#include <sys/types.h>
#include <ndir.h>
/*
* seek to an entry in a directory.
* Only values returned by ``telldir'' should be passed to seekdir.
*/
void
seekdir(dirp, loc)
register DIR *dirp;
long loc;
{
long curloc, base, offset;
struct direct *dp;
curloc = telldir(dirp);
if (loc == curloc)
return;
base = loc & ~(DIRBLKSIZ - 1);
offset = loc & (DIRBLKSIZ - 1);
if (dirp->dd_loc != 0 && (curloc & ~(DIRBLKSIZ - 1)) == base) {
dirp->dd_loc = offset;
return;
}
lseek(dirp->dd_fd, base, 0);
dirp->dd_loc = 0;
while (dirp->dd_loc < offset) {
dp = readdir(dirp);
if (dp == NULL)
return;
}
}
*-*-END-*-*
sed 's/^ //' >telldir.c <<\*-*-END-*-*
/* Copyright (c) 1982 Regents of the University of California */
static char sccsid[] = "@(#)telldir.c 4.1 2/21/82";
#include <sys/types.h>
#include <ndir.h>
/*
* return a pointer into a directory
*/
long
telldir(dirp)
DIR *dirp;
{
return (lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc);
}
*-*-END-*-*
More information about the Comp.sources.unix
mailing list