1
/****************************************************************************
5
This file contains the C definitions and declarations for the
6
Directory.c directory iteration code.
8
This code is intended to be used as a convenient, machine
9
independent interface to iterate through the contents of a
12
****************************************************************************/
17
* Department of Computer Science
18
* University Of Illinois at Urbana-Champaign
19
* 1304 West Springfield Avenue
31
#include <sys/param.h>
32
#include <sys/types.h>
36
#if defined(SYSV) || defined(SVR4)
37
#define getwd(path) getcwd(path, MAXPATHLEN)
49
ERROR, ONE OF THESE MUST BE DEFINED
51
#define MAX_NAME_LENGTH MAXNAMLEN
54
#define MAX_NAME_LENGTH _SYS_NAME_MAX
67
#define PERM_EXECUTE 1
71
#define F_TYPE_CHAR_SPECIAL 3
72
#define F_TYPE_BLOCK_SPECIAL 4
73
#define F_TYPE_SYM_LINK 5
74
#define F_TYPE_SOCKET 6
77
/*--------------------------------------------------------------------------*
79
D A T A T Y P E A C C E S S M A C R O S
81
*--------------------------------------------------------------------------*/
83
/* Directory: Directory Iterator */
85
#define DirectoryDir(dp) ((dp)->filep)
86
#define DirectoryPath(dp) ((dp)->path)
88
/* FileInfo: Information About A File Or Link */
90
#define FileInfoProt(fi) ((fi)->protections)
91
#define FileInfoOrigMode(fi) ((fi)->orig_mode)
92
#define FileInfoUserID(fi) ((fi)->user_id)
93
#define FileInfoGroupID(fi) ((fi)->group_id)
94
#define FileInfoFileSize(fi) ((fi)->size)
95
#define FileInfoLastAccess(fi) ((fi)->last_access)
96
#define FileInfoLastModify(fi) ((fi)->last_modify)
97
#define FileInfoLastStatusChange(fi) ((fi)->last_status_change)
99
#define FIProt(fi) FileInfoProt(fi)
100
#define FIOrigMode(fi) FileInfoOrigMode(fi)
101
#define FIUserID(fi) FileInfoUserID(fi)
102
#define FIGroupID(fi) FileInfoGroupID(fi)
103
#define FIFileSize(fi) FileInfoFileSize(fi)
104
#define FILastAccess(fi) FileInfoLastAccess(fi)
105
#define FILastModify(fi) FileInfoLastModify(fi)
106
#define FILastStatusChange(fi) FileInfoLastStatusChange(fi)
108
/* FType: File Type Macros */
110
#define FTypeIsDir(ft) ((ft) == F_TYPE_DIR)
111
#define FTypeIsFile(ft) ((ft) == F_TYPE_FILE)
112
#define FTypeIsCharSpecial(ft) ((ft) == F_TYPE_CHAR_SPECIAL)
113
#define FTypeIsBlockSpecial(ft) ((ft) == F_TYPE_BLOCK_SPECIAL)
114
#define FTypeIsSymLink(ft) ((ft) == F_TYPE_SYM_LINK)
115
#define FTypeIsSocket(ft) ((ft) == F_TYPE_SOCKET)
116
#define FTypeIsFifo(ft) ((ft) == F_TYPE_FIFO)
118
/* DirEntry: Information About A Item In A Directory */
120
#define DirEntryFileName(fi) ((fi)->filename)
121
#define DirEntryType(fi) ((fi)->file_type)
122
#define DirEntrySelfInfo(fi) (&((fi)->self_info))
123
#define DirEntryActualInfo(fi) (&((fi)->actual_info))
125
#define DirEntryIsBrokenLink(fi) ((fi)->broken_link)
126
#define DirEntryIsDirectoryLink(fi) ((fi)->directory_link)
127
#define DirEntryIsDir(fi) (FTypeIsDir(DirEntryType(fi)))
128
#define DirEntryIsFile(fi) (FTypeIsFile(DirEntryType(fi)))
129
#define DirEntryIsCharSpecial(fi) (FTypeIsCharSpecial(DirEntryType(fi)))
130
#define DirEntryIsBlockSpecial(fi) (FTypeIsBlockSpecial(DirEntryType(fi)))
131
#define DirEntryIsSymLink(fi) (FTypeIsSymLink(DirEntryType(fi)))
132
#define DirEntryIsSocket(fi) (FTypeIsSocket(DirEntryType(fi)))
133
#define DirEntryIsFifo(fi) (FTypeIsFifo(DirEntryType(fi)))
134
#define DirEntryLeadsToDir(fi) (DirEntryIsDir(fi) || \
135
DirEntryIsDirectoryLink(fi))
137
#define DirEntryProt(d) FIProt(DirEntrySelfInfo(d))
138
#define DirEntryOrigMode(d) FIOrigMode(DirEntrySelfInfo(d))
139
#define DirEntryUserID(d) FIUserID(DirEntrySelfInfo(d))
140
#define DirEntryGroupID(d) FIGroupID(DirEntrySelfInfo(d))
141
#define DirEntryFileSize(d) FIFileSize(DirEntrySelfInfo(d))
142
#define DirEntryLastAccess(d) FILastAccess(DirEntrySelfInfo(d))
143
#define DirEntryLastModify(d) FILastModify(DirEntrySelfInfo(d))
144
#define DirEntryLastStatusChange(d) FILastStatusChange(DirEntrySelfInfo(d))
146
/*--------------------------------------------------------------------------*
148
D A T A T Y P E D E F I N I T I O N S
150
*--------------------------------------------------------------------------*/
152
/* Directory: Directory Iterator */
157
char path[MAXPATHLEN + 2];
160
typedef DIRECTORY Directory;
162
/* FileInfo: Information About A File Or Link */
173
time_t last_status_change;
176
typedef FILE_INFO FileInfo;
178
/* DirEntry: Information About A Item In A Directory */
182
char filename[MAX_NAME_LENGTH + 1];
185
short directory_link;
187
FileInfo actual_info;
190
typedef DIR_ENTRY DirEntry;
192
/*--------------------------------------------------------------------------*
194
L O W L E V E L D I R E C T O R Y I N T E R F A C E
196
*--------------------------------------------------------------------------*/
198
#if (!NeedFunctionPrototypes)
201
void DirectoryRestart();
202
void DirectoryClose();
203
long DirectoryTellPosition();
204
void DirectorySetPosition();
205
int DirectoryReadNextEntry();
206
char * DirectoryPathExpand();
211
int DirectoryOpen(char *dir_name, Directory *dp);
212
void DirectoryRestart(Directory *dp);
213
void DirectoryClose(Directory *dp);
214
long DirectoryTellPosition(Directory *dp);
215
void DirectorySetPosition(Directory *dp, long int pos);
216
int DirectoryReadNextEntry(Directory *dp, DirEntry *de);
217
char * DirectoryPathExpand(char *old_path, char *new_path);
218
void DirEntryDump(FILE *fp, DirEntry *de);