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