BSD 4_3 development
[unix-history] / usr / contrib / nntp / rrn / ndir.c
CommitLineData
25a197fc
C
1/* $Header: ndir.c,v 4.3.1.3 85/05/23 11:19:24 lwall Exp $
2 *
3 * $Log: ndir.c,v $
4 * Revision 4.3.1.3 85/05/23 11:19:24 lwall
5 * Oops, shouldn't have included sys/types.h again.
6 *
7 * Revision 4.3.1.2 85/05/15 14:46:00 lwall
8 * Changed short to ino_t, which may be ushort on some systems.
9 *
10 * Revision 4.3.1.1 85/05/10 11:35:34 lwall
11 * Branch for patches.
12 *
13 * Revision 4.3 85/05/01 11:42:55 lwall
14 * Baseline for release with 4.3bsd.
15 *
16 */
17
18#include "EXTERN.h"
19#include "common.h"
20#include "INTERN.h"
21#include "ndir.h"
22
23#ifdef USENDIR
24/*
25 * support for Berkeley directory reading routine on a V7 file system
26 */
27
28/*
29 * open a directory.
30 */
31DIR *
32opendir(name)
33char *name;
34{
35 register DIR *dirp;
36 register int fd;
37
38 if ((fd = open(name, 0)) == -1)
39 return NULL;
40 if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
41 close (fd);
42 return NULL;
43 }
44 dirp->dd_fd = fd;
45 dirp->dd_loc = 0;
46 return dirp;
47}
48
49/*
50 * read an old style directory entry and present it as a new one
51 */
52#ifndef pyr
53#define ODIRSIZ 14
54
55struct olddirect {
56 ino_t od_ino;
57 char od_name[ODIRSIZ];
58};
59#else an Pyramid in the ATT universe
60#define ODIRSIZ 248
61
62struct olddirect {
63 long od_ino;
64 short od_fill1, od_fill2;
65 char od_name[ODIRSIZ];
66};
67#endif
68
69/*
70 * get next entry in a directory.
71 */
72struct direct *
73readdir(dirp)
74register DIR *dirp;
75{
76 register struct olddirect *dp;
77 static struct direct dir;
78
79 for (;;) {
80 if (dirp->dd_loc == 0) {
81 dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
82 DIRBLKSIZ);
83 if (dirp->dd_size <= 0)
84 return NULL;
85 }
86 if (dirp->dd_loc >= dirp->dd_size) {
87 dirp->dd_loc = 0;
88 continue;
89 }
90 dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
91 dirp->dd_loc += sizeof(struct olddirect);
92 if (dp->od_ino == 0)
93 continue;
94 dir.d_ino = dp->od_ino;
95 strncpy(dir.d_name, dp->od_name, ODIRSIZ);
96 dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
97 dir.d_namlen = strlen(dir.d_name);
98 dir.d_reclen = DIRSIZ(&dir);
99 return (&dir);
100 }
101}
102
103/*
104 * close a directory.
105 */
106void
107closedir(dirp)
108register DIR *dirp;
109{
110 close(dirp->dd_fd);
111 dirp->dd_fd = -1;
112 dirp->dd_loc = 0;
113 free(dirp);
114}
115#endif USENDIR