• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/netatalk-3.0.5/include/atalk/
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# ifdef AFS
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
59struct 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
82struct 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
93static 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 */
104