19 #define LINK_FOLLOW 15
20 #define LINK_NO_FOLLOW -1
22 /* For vfs_s_find_entry */
31 /* For vfs_s_entry_from_path */
35 typedef struct vfs_s_entry
{
36 struct vfs_s_entry
**prevp
, *next
;
37 struct vfs_s_inode
*dir
; /* Directory we are in - needed for invalidating directory when file in it changes */
38 char *name
; /* Name of this entry */
39 struct vfs_s_inode
*ino
; /* ... and its inode */
41 #define ENTRY_MAGIC 0x014512563
44 typedef struct vfs_s_inode
{
45 struct vfs_s_entry
*subdir
;
46 struct vfs_s_super
*super
;
47 struct stat st
; /* Parameters of this inode */
48 char *linkname
; /* Symlink's contents */
49 char *localname
; /* Filename of local file, if we have one */
52 vfs_s_entry
*ent
; /* ftp needs this backpointer; don't use if you can avoid it */
62 struct timeval timestamp
;
63 struct stat local_stat
;
66 struct timeval timestamp
;
70 #define INODE_MAGIC 0x93451656
73 typedef struct vfs_s_super
{
74 struct vfs_s_super
**prevp
, *next
;
77 char *name
; /* My name, whatever it means */
78 int fd_usage
; /* Number of open files */
79 int ino_usage
; /* Usage count of this superblock */
80 int want_stale
; /* If set, we do not flush cache properly */
101 char *proxy
; /* proxy server, NULL if no proxy */
102 int failed_on_login
; /* used to pass the failure reason to upper levels */
103 int use_source_route
;
104 int use_passive_connection
;
105 int remote_is_amiga
; /* No leading slash allowed for AmiTCP (Amiga) */
107 int cwd_defered
; /* current_directory was changed but CWD command hasn't
109 int strict
; /* ftp server doesn't understand
110 "LIST -la <path>"; use "CWD <path>"/
112 int control_connection_buzy
;
113 #define RFC_AUTODETECT 0
120 int type
; /* Type of the archive */
121 /*int pos; In case reentrancy will be needed */
122 struct defer_inode
*defered
; /* List of inodes for which another entries may appear */
126 #define SUPER_MAGIC 0x915ac312
129 typedef struct vfs_s_fh
{
130 struct vfs_s_inode
*ino
;
131 long pos
; /* This is for module's use */
132 int handle
; /* This is for module's use, but if != -1, will be mc_close()d */
133 int changed
; /* Did this file change? */
134 int linear
; /* Is that file open with O_LINEAR? */
137 int got
, total
, append
;
144 #define FH_MAGIC 0x91324682
148 struct vfs_s_super
*supers
;
153 int (*init_inode
) (vfs
*me
, vfs_s_inode
*ino
); /* optional */
154 void (*free_inode
) (vfs
*me
, vfs_s_inode
*ino
); /* optional */
155 int (*init_entry
) (vfs
*me
, vfs_s_entry
*entry
); /* optional */
157 void* (*archive_check
) (vfs
*me
, char *name
, char *op
); /* optional */
158 int (*archive_same
) (vfs
*me
, vfs_s_super
*psup
, char *archive_name
, char *op
, void *cookie
);
159 int (*open_archive
) (vfs
*me
, vfs_s_super
*psup
, char *archive_name
, char *op
);
160 void (*free_archive
) (vfs
*me
, vfs_s_super
*psup
);
162 int (*fh_open
) (vfs
*me
, vfs_s_fh
*fh
, int flags
, int mode
);
163 int (*fh_close
) (vfs
*me
, vfs_s_fh
*fh
);
165 vfs_s_entry
* (*find_entry
) (vfs
*me
, vfs_s_inode
*root
, char *path
, int follow
, int flags
);
166 int (*dir_load
) (vfs
*me
, vfs_s_inode
*ino
, char *path
);
167 int (*dir_uptodate
) (vfs
*me
, vfs_s_inode
*ino
);
168 int (*file_store
) (vfs
*me
, vfs_s_fh
*fh
, char *path
, char *localname
);
170 int (*linear_start
) (vfs
*me
, vfs_s_fh
*fh
, int from
);
171 int (*linear_read
) (vfs
*me
, vfs_s_fh
*fh
, void *buf
, int len
);
172 void (*linear_close
) (vfs
*me
, vfs_s_fh
*fh
);
175 /* entries and inodes */
176 vfs_s_inode
*vfs_s_new_inode (vfs
*me
, vfs_s_super
*super
,
177 struct stat
*initstat
);
178 vfs_s_entry
*vfs_s_new_entry (vfs
*me
, char *name
, vfs_s_inode
*inode
);
179 void vfs_s_free_entry (vfs
*me
, vfs_s_entry
*ent
);
180 void vfs_s_insert_entry (vfs
*me
, vfs_s_inode
*dir
,
182 struct stat
*vfs_s_default_stat (vfs
*me
, mode_t mode
);
184 void vfs_s_add_dots (vfs
*me
, vfs_s_inode
*dir
,
185 vfs_s_inode
*parent
);
186 vfs_s_entry
*vfs_s_generate_entry (vfs
*me
, char *name
,
187 struct vfs_s_inode
*parent
, mode_t mode
);
188 vfs_s_entry
*vfs_s_automake (vfs
*me
, vfs_s_inode
*dir
, char *path
,
190 vfs_s_entry
*vfs_s_find_entry_tree (vfs
*me
, vfs_s_inode
*root
, char *path
,
191 int follow
, int flags
);
192 vfs_s_entry
*vfs_s_find_entry_linear (vfs
*me
, vfs_s_inode
*root
, char *path
,
193 int follow
, int flags
);
194 vfs_s_inode
*vfs_s_find_inode (vfs
*me
, vfs_s_inode
*root
, char *path
,
195 int follow
, int flags
);
196 vfs_s_inode
*vfs_s_find_root (vfs
*me
, vfs_s_entry
*entry
);
197 vfs_s_entry
*vfs_s_resolve_symlink (vfs
*me
, vfs_s_entry
*entry
, char *path
,
200 /* superblock games */
201 vfs_s_super
*vfs_s_new_super (vfs
*me
);
202 void vfs_s_free_super (vfs
*me
, vfs_s_super
*super
);
204 /* outside interface */
205 char *vfs_s_get_path_mangle (vfs
*me
, char *inname
, vfs_s_super
**archive
,
207 char *vfs_s_get_path (vfs
*me
, char *inname
, vfs_s_super
**archive
,
209 void vfs_s_invalidate (vfs
*me
, vfs_s_super
*super
);
210 char *vfs_s_fullpath (vfs
*me
, vfs_s_inode
*ino
);
212 /* readdir & friends */
213 vfs_s_super
*vfs_s_super_from_path (vfs
*me
, char *name
);
214 vfs_s_inode
*vfs_s_inode_from_path (vfs
*me
, char *name
, int flags
);
215 void *vfs_s_opendir (vfs
*me
, char *dirname
);
216 void *vfs_s_readdir (void *data
);
217 int vfs_s_telldir (void *data
);
218 void vfs_s_seekdir (void *data
, int offset
);
219 int vfs_s_closedir (void *data
);
220 int vfs_s_chdir (vfs
*me
, char *path
);
223 int vfs_s_stat (vfs
*me
, char *path
, struct stat
*buf
);
224 int vfs_s_lstat (vfs
*me
, char *path
, struct stat
*buf
);
225 int vfs_s_fstat (void *fh
, struct stat
*buf
);
226 int vfs_s_readlink (vfs
*me
, char *path
, char *buf
, int size
);
227 void *vfs_s_open (vfs
*me
, char *file
, int flags
, int mode
);
228 int vfs_s_read (void *fh
, char *buffer
, int count
);
229 int vfs_s_write (void *fh
, char *buffer
, int count
);
230 int vfs_s_lseek (void *fh
, off_t offset
, int whence
);
231 int vfs_s_close (void *fh
);
234 void vfs_s_fill_names (vfs
*me
, void (*func
)(char *));
235 int vfs_s_ferrno(vfs
*me
);
236 void vfs_s_dump(vfs
*me
, char *prefix
, vfs_s_inode
*ino
);
237 char *vfs_s_getlocalcopy (vfs
*me
, char *path
);
239 /* stamping support */
240 vfsid
vfs_s_getid (vfs
*me
, char *path
, struct vfs_stamping
**parent
);
241 int vfs_s_nothingisopen (vfsid id
);
242 void vfs_s_free (vfsid id
);
243 int vfs_s_setctl (vfs
*me
, char *path
, int ctlop
, char *arg
);
245 /* network filesystems support */
246 int vfs_s_select_on_two (int fd1
, int fd2
);
247 int vfs_s_get_line (vfs
*me
, int sock
, char *buf
, int buf_len
, char term
);
248 int vfs_s_get_line_interruptible (vfs
*me
, char *buffer
, int size
, int fd
);
251 int vfs_s_retrieve_file (vfs
*me
, struct vfs_s_inode
*ino
);
254 #define ERRNOR(a, b) do { me->verrno = a; return b; } while (0)
256 #define ERRNOR(a, b) { me->verrno = a; return b; }
259 #define MEDATA ((struct vfs_s_data *) me->data)
261 #define FH ((struct vfs_s_fh *) fh)
262 #define FH_SUPER FH->ino->super
264 #define LS_NOT_LINEAR 0
265 #define LS_LINEAR_CLOSED 1
266 #define LS_LINEAR_OPEN 2