2 * Copyright (c) 1990,1991 Regents of The University of Michigan.
5 * Permission to use, copy, modify, and distribute this software and
6 * its documentation for any purpose and without fee is hereby granted,
7 * provided that the above copyright notice appears in all copies and
8 * that both that copyright notice and this permission notice appear
9 * in supporting documentation, and that the name of The University
10 * of Michigan not be used in advertising or publicity pertaining to
11 * distribution of the software without specific, written prior
12 * permission. This software is supplied as is without expressed or
13 * implied warranties of any kind.
15 * Research Systems Unix Group
16 * The University of Michigan
18 * 535 W. William Street
21 * netatalk@itd.umich.edu
24 #ifndef ATALK_DIRECTORY_H
25 #define ATALK_DIRECTORY_H 1
27 #include <sys/types.h>
28 #include <arpa/inet.h>
32 #include <atalk/cnid.h>
33 #include <atalk/bstrlib.h>
34 #include <atalk/queue.h>
35 #include <atalk/unicode.h>
37 /* setgid directories */
39 # if (defined AFS) || (defined FREEBSD)
42 # define DIRBITS S_ISGID
46 /* reserved directory id's */
47 #define DIRDID_ROOT_PARENT htonl(1) /* parent directory of root */
48 #define DIRDID_ROOT htonl(2) /* root directory */
50 /* struct dir.d_flags */
51 #define DIRF_FSMASK (3<<0)
52 #define DIRF_NOFS (0<<0)
53 #define DIRF_AFS (1<<0)
54 #define DIRF_UFS (1<<1)
55 #define DIRF_ISFILE (1<<3) /* it's cached file, not a directory */
56 #define DIRF_OFFCNT (1<<4) /* offsprings count is valid */
57 #define DIRF_CNID (1<<5) /* renumerate id */
60 bstring d_fullpath; /* complete unix path to dir (or file) */
61 bstring d_m_name; /* mac name */
62 bstring d_u_name; /* unix name */
63 /* be careful here! if d_m_name == d_u_name, d_u_name */
64 /* will just point to the same storage as d_m_name !! */
65 ucs2_t *d_m_name_ucs2; /* mac name as UCS2 */
66 qnode_t *qidx_node; /* pointer to position in queue index */
67 time_t d_ctime; /* inode ctime, used and modified by reenumeration */
69 int d_flags; /* directory flags */
70 cnid_t d_pdid; /* CNID of parent directory */
71 cnid_t d_did; /* CNID of directory */
72 uint32_t d_offcnt; /* offspring count */
73 uint16_t d_vid; /* only needed in the dircache, because
74 we put all directories in one cache. */
75 uint32_t d_rights_cache; /* cached rights combinded from mode and possible ACL */
77 /* Stuff used in the dircache */
78 time_t dcache_ctime; /* inode ctime, used and modified by dircache */
79 ino_t dcache_ino; /* inode number, used to detect changes in the dircache */
83 int m_type; /* mac name type (long name, unicode */
84 char *m_name; /* mac name */
85 char *u_name; /* unix name */
86 cnid_t id; /* file id (only for getmetadata) */
87 struct dir *d_dir; /* */
88 int st_valid; /* does st_errno and st set */
93 static inline int path_isadir(struct path *o_path)
95 return o_path->d_dir != NULL;
97 return o_path->m_name == '\0' || /* we are in a it */
98 !o_path->st_valid || /* in cache but we can't chdir in it */
99 (!o_path->st_errno && S_ISDIR(o_path->st.st_mode)); /* not in cache an can't chdir */
103 #endif /* ATALK_DIRECTORY_H */