]> arthur.barton.de Git - netatalk.git/blob - include/atalk/directory.h
Writing metadata xattr on directories with sticky bit set, FR#94
[netatalk.git] / include / atalk / directory.h
1 /*
2  * Copyright (c) 1990,1991 Regents of The University of Michigan.
3  * All Rights Reserved.
4  *
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.
14  *
15  *      Research Systems Unix Group
16  *      The University of Michigan
17  *      c/o Mike Clark
18  *      535 W. William Street
19  *      Ann Arbor, Michigan
20  *      +1-313-763-0525
21  *      netatalk@itd.umich.edu
22  */
23
24 #ifndef ATALK_DIRECTORY_H
25 #define ATALK_DIRECTORY_H 1
26
27 #include <sys/types.h>
28 #include <arpa/inet.h>
29 #include <dirent.h>
30 #include <stdint.h>
31
32 #include <atalk/cnid.h>
33 #include <atalk/bstrlib.h>
34 #include <atalk/queue.h>
35 #include <atalk/unicode.h>
36
37 /* setgid directories */
38 #ifndef DIRBITS
39 # if (defined AFS) || (defined FREEBSD)
40 #  define DIRBITS 0
41 # else /* AFS */
42 #  define DIRBITS S_ISGID
43 # endif /* AFS */
44 #endif /* DIRBITS */
45
46 /* reserved directory id's */
47 #define DIRDID_ROOT_PARENT    htonl(1)  /* parent directory of root */
48 #define DIRDID_ROOT           htonl(2)  /* root directory */
49
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 */
58
59 struct dir {
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 */
68
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 */
76
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 */
80 };
81
82 struct path {
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 */
89     int         st_errno;
90     struct stat st;
91 };
92
93 static inline int path_isadir(struct path *o_path)
94 {
95     return o_path->d_dir != NULL;
96 #if 0
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 */
100 #endif
101 }
102
103 #endif /* ATALK_DIRECTORY_H */