]>
Commit | Line | Data |
---|---|---|
1c79356b A |
1 | /* |
2 | * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * The contents of this file constitute Original Code as defined in and | |
7 | * are subject to the Apple Public Source License Version 1.1 (the | |
8 | * "License"). You may not use this file except in compliance with the | |
9 | * License. Please obtain a copy of the License at | |
10 | * http://www.apple.com/publicsource and read it before using this file. | |
11 | * | |
12 | * This Original Code and all software distributed under the License are | |
13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the | |
17 | * License for the specific language governing rights and limitations | |
18 | * under the License. | |
19 | * | |
20 | * @APPLE_LICENSE_HEADER_END@ | |
21 | */ | |
22 | /* Copyright (c) 1998, Apple Computer, Inc. All rights reserved. */ | |
23 | /* | |
24 | * Header file for synthfs data structures | |
25 | * | |
26 | * Change History: | |
27 | * | |
28 | * 17-Aug-1999 Pat Dirks New today. | |
29 | * | |
30 | */ | |
31 | ||
32 | #ifndef __SYNTHFS_H__ | |
33 | #define __SYNTHFS_H__ | |
34 | ||
35 | #include <sys/param.h> | |
36 | #include <sys/lock.h> | |
37 | #include <sys/queue.h> | |
38 | #include <sys/attr.h> | |
39 | ||
40 | ||
41 | #if DEBUG | |
42 | extern void Debugger(const char *message); /* Private to pexpert... */ | |
43 | #endif | |
44 | __END_DECLS | |
45 | ||
46 | /* XXX Get rid of this as soon as sys/malloc.h can be updated to define a real M_SYNTHFS */ | |
47 | #define M_SYNTHFS M_TEMP | |
48 | ||
49 | /* XXX Get rid of this as soon as sys/vnode.h can be updated to define a real VT_SYNTHFS */ | |
50 | #define VT_SYNTHFS (VT_OTHER+1) | |
51 | ||
52 | ||
53 | struct synthfs_mntdata | |
54 | { | |
55 | struct mount *synthfs_mp; /* filesystem vfs structure */ | |
56 | struct vnode *synthfs_rootvp; | |
57 | dev_t synthfs_mounteddev; | |
58 | unsigned long synthfs_nextid; | |
59 | unsigned long synthfs_filecount; | |
60 | unsigned long synthfs_dircount; | |
61 | unsigned long synthfs_encodingsused; | |
62 | LIST_HEAD(synthfs_fsvnodelist, vnode) synthfs_fsvnodes; | |
63 | }; | |
64 | ||
65 | /* | |
66 | * Various sorts of synthfs vnodes: | |
67 | */ | |
68 | enum synthfsnodetype { | |
69 | SYNTHFS_DIRECTORY = 1, | |
70 | SYNTHFS_FILE, | |
71 | SYNTHFS_SYMLINK | |
72 | }; | |
73 | ||
74 | struct synthfs_dir_node { | |
75 | unsigned long d_entrycount; | |
76 | TAILQ_HEAD(synthfs_d_subnodelist, synthfsnode) d_subnodes; | |
77 | ||
78 | }; | |
79 | ||
80 | struct synthfs_file_node { | |
81 | off_t f_size; | |
82 | }; | |
83 | ||
84 | struct synthfs_symlink_node { | |
85 | int s_length; | |
86 | char *s_symlinktarget; /* Dynamically allocated */ | |
87 | }; | |
88 | ||
89 | ||
90 | struct synthfsnode | |
91 | { | |
92 | TAILQ_ENTRY(synthfsnode) s_sibling; /* synthfsnodes in a given directory */ | |
93 | enum synthfsnodetype s_type; | |
94 | struct synthfsnode *s_parent; | |
95 | struct vnode *s_vp; | |
96 | char *s_name; | |
97 | struct lock__bsd__ s_lock; | |
98 | unsigned long s_nodeflags; /* Internal synthfs flags: IN_CHANGED, IN_MODIFIED, etc. */ | |
99 | unsigned long s_pflags; /* File system flags: IMMUTABLE, etc. */ | |
100 | unsigned long s_nodeid; | |
101 | unsigned long s_generation; | |
102 | mode_t s_mode; | |
103 | short s_linkcount; | |
104 | uid_t s_uid; | |
105 | gid_t s_gid; | |
106 | dev_t s_rdev; | |
107 | struct timeval s_createtime; | |
108 | struct timeval s_accesstime; | |
109 | struct timeval s_modificationtime; | |
110 | struct timeval s_changetime; | |
111 | struct timeval s_backuptime; | |
112 | unsigned long s_flags; /* inode flags: IMMUTABLE, APPEND, etc. */ | |
113 | unsigned long s_script; | |
114 | unsigned long s_finderInfo[8]; | |
115 | union { | |
116 | struct synthfs_dir_node d; | |
117 | struct synthfs_file_node f; | |
118 | struct synthfs_symlink_node s; | |
119 | } s_u; | |
120 | }; | |
121 | ||
122 | #define ROOT_DIRID 2 | |
123 | #define FIRST_SYNTHFS_ID 0x10 | |
124 | ||
125 | /* These flags are kept in flags. */ | |
126 | #define IN_ACCESS 0x0001 /* Access time update request. */ | |
127 | #define IN_CHANGE 0x0002 /* Change time update request. */ | |
128 | #define IN_UPDATE 0x0004 /* Modification time update request. */ | |
129 | #define IN_MODIFIED 0x0008 /* Node has been modified. */ | |
130 | #define IN_RENAME 0x0010 /* Node is being renamed. */ | |
131 | //#define IN_SHLOCK 0x0020 /* File has shared lock. */ | |
132 | //#define IN_EXLOCK 0x0040 /* File has exclusive lock. */ | |
133 | //#define IN_ALLOCATING 0x1000 /* vnode is in transit, wait or ignore */ | |
134 | //#define IN_WANT 0x2000 /* Its being waited for */ | |
135 | ||
136 | #define SYNTHFSTIMES(sp, t1, t2) { \ | |
137 | if ((sp)->s_nodeflags & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \ | |
138 | (sp)->s_nodeflags |= IN_MODIFIED; \ | |
139 | if ((sp)->s_nodeflags & IN_ACCESS) { \ | |
140 | (sp)->s_accesstime = *(t1); \ | |
141 | }; \ | |
142 | if ((sp)->s_nodeflags & IN_UPDATE) { \ | |
143 | (sp)->s_modificationtime = *(t2); \ | |
144 | } \ | |
145 | if ((sp)->s_nodeflags & IN_CHANGE) { \ | |
146 | (sp)->s_changetime = time; \ | |
147 | }; \ | |
148 | (sp)->s_nodeflags &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \ | |
149 | } \ | |
150 | } | |
151 | ||
152 | #define ATTR_REF_DATA(attrrefptr) (((char *)(attrrefptr)) + ((attrrefptr)->attr_dataoffset)) | |
153 | ||
154 | #define STOV(SP) ((SP)->s_vp) | |
155 | ||
156 | #define VTOS(VP) ((struct synthfsnode *)((VP)->v_data)) | |
157 | ||
158 | #define VTOVFS(VP) ((VP)->v_mount) | |
159 | #define STOVFS(HP) ((SP)->s_vp->v_mount) | |
160 | #define SFSTOVFS(SFSMP) ((SFSMP)->sfs_mp) | |
161 | ||
162 | #define VTOSFS(VP) ((struct synthfs_mntdata *)((VP)->v_mount->mnt_data)) | |
163 | #define STOTFS(SP) ((struct synthfs_mntdata *)(SP)->s_vp->v_mount->mnt_data) | |
164 | #define VFSTOSFS(MP) ((struct synthfs_mntdata *)(MP)->mnt_data) | |
165 | ||
166 | #if DEBUG | |
167 | #define DBG_TRACE(P) printf P; | |
168 | #define DBG_INIT(P) printf P; | |
169 | #define DBG_VOP(P) printf P; | |
170 | //#define DBG_ASSERT(a) { if (!(a)) { panic("File "__FILE__", line %d: assertion '%s' failed.\n", __LINE__, #a); } } | |
171 | #define DBG_ASSERT(a) { if (!(a)) { Debugger("Oops - File __FILE__ , line __LINE__: assertion '"#a"' failed."); } } | |
172 | #else | |
173 | #define DBG_TRACE(P) | |
174 | #define DBG_INIT(P) | |
175 | #define DBG_VOP(P) | |
176 | #define DBG_ASSERT(a) | |
177 | #endif | |
178 | ||
179 | extern int (**synthfs_vnodeop_p)(void *); | |
180 | ||
181 | __BEGIN_DECLS | |
182 | int synthfs_mount __P((struct mount *, char *, caddr_t, struct nameidata *, struct proc *)); | |
183 | int synthfs_start __P((struct mount *, int, struct proc *)); | |
184 | int synthfs_unmount __P((struct mount *, int, struct proc *)); | |
185 | int synthfs_root __P((struct mount *, struct vnode **)); | |
186 | int synthfs_quotactl __P((struct mount *, int, uid_t, caddr_t, struct proc *)); | |
187 | int synthfs_statfs __P((struct mount *, struct statfs *, struct proc *)); | |
188 | int synthfs_sync __P((struct mount *, int, struct ucred *, struct proc *)); | |
189 | int synthfs_vget __P((struct mount *, void *ino, struct vnode **)); | |
190 | int synthfs_fhtovp __P((struct mount *, struct fid *, struct mbuf *, struct vnode **, int *, struct ucred **)); | |
191 | int synthfs_vptofh __P((struct vnode *, struct fid *)); | |
192 | int synthfs_init __P((struct vfsconf *)); | |
193 | int synthfs_sysctl __P((int *, u_int, void *, size_t *, void *, size_t, struct proc *)); | |
194 | ||
195 | int synthfs_create __P((struct vop_create_args *)); | |
196 | int synthfs_open __P((struct vop_open_args *)); | |
197 | int synthfs_mmap __P((struct vop_mmap_args *)); | |
198 | int synthfs_access __P((struct vop_access_args *)); | |
199 | int synthfs_getattr __P((struct vop_getattr_args *)); | |
200 | int synthfs_setattr __P((struct vop_setattr_args *)); | |
201 | int synthfs_rename __P((struct vop_rename_args *)); | |
202 | int synthfs_select __P((struct vop_select_args *)); | |
203 | int synthfs_remove __P((struct vop_remove_args *)); | |
204 | int synthfs_mkdir __P((struct vop_mkdir_args *)); | |
205 | int synthfs_rmdir __P((struct vop_rmdir_args *)); | |
206 | int synthfs_symlink __P((struct vop_symlink_args *)); | |
207 | int synthfs_readlink __P((struct vop_readlink_args *)); | |
208 | int synthfs_readdir __P((struct vop_readdir_args *)); | |
209 | int synthfs_cached_lookup __P((struct vop_cachedlookup_args *)); | |
210 | int synthfs_lookup __P((struct vop_cachedlookup_args *)); | |
211 | int synthfs_pathconf __P((struct vop_pathconf_args *)); | |
212 | int synthfs_update __P((struct vop_update_args *)); | |
213 | ||
214 | int synthfs_lock __P((struct vop_lock_args *)); | |
215 | int synthfs_unlock __P((struct vop_unlock_args *)); | |
216 | int synthfs_islocked __P((struct vop_islocked_args *)); | |
217 | ||
218 | int synthfs_inactive __P((struct vop_inactive_args*)); | |
219 | int synthfs_reclaim __P((struct vop_reclaim_args*)); | |
220 | ||
221 | void synthfs_setupuio __P((struct iovec *iov, struct uio *uio, void *buffer, size_t bufsize, enum uio_seg space, enum uio_rw direction, struct proc *p)); | |
222 | int synthfs_new_directory __P((struct mount *mp, struct vnode *dp, const char *name, unsigned long nodeid, mode_t mode, struct proc *p, struct vnode **vpp)); | |
223 | int synthfs_new_symlink __P((struct mount *mp, struct vnode *dp, const char *name, unsigned long nodeid, char *targetstring, struct proc *p, struct vnode **vpp)); | |
224 | long synthfs_adddirentry __P((u_int32_t fileno, u_int8_t type, const char *name, struct uio *uio)); | |
225 | int synthfs_remove_entry __P((struct vnode *vp)); | |
226 | int synthfs_remove_directory __P((struct vnode *vp)); | |
227 | int synthfs_remove_symlink __P((struct vnode *vp)); | |
228 | int synthfs_move_rename_entry __P((struct vnode *source_vp, struct vnode *newparent_vp, char *newname)); | |
229 | int synthfs_derive_vnode_path __P((struct vnode *vp, char *vnpath, size_t pathbuffersize)); | |
230 | ||
231 | #endif /* __SYNTHFS_H__ */ |