8 #include <mhl/string.h>
10 #include "../src/global.h"
11 #include "../src/tty.h" /* enable/disable interrupt key */
12 #include "../src/wtools.h" /* message() */
13 #include "../src/main.h" /* print_vfs_message */
18 /* Note: Some of this functions are not static. This has rather good
19 * reason: exactly same functions would have to appear in sfs.c. This
20 * saves both computer's memory and my work. <pavel@ucw.cz>
23 static struct vfs_class vfs_local_ops
;
26 local_open (struct vfs_class
*me
, const char *file
, int flags
, int mode
)
33 fd
= open (file
, NO_LINEAR (flags
), mode
);
37 local_info
= g_new (int, 1);
44 local_read (void *data
, char *buffer
, int count
)
51 while ((n
= read (*((int *) data
), buffer
, count
)) == -1){
53 if (errno
== EAGAIN
) continue;
56 if (errno
== EINTR
) continue;
64 local_close (void *data
)
77 local_errno (struct vfs_class
*me
)
84 local_opendir (struct vfs_class
*me
, const char *dirname
)
91 dir
= opendir (dirname
);
95 local_info
= (DIR **) g_new (DIR *, 1);
102 local_readdir (void *data
)
104 return readdir (*(DIR **) data
);
108 local_closedir (void *data
)
112 i
= closedir (* (DIR **) data
);
118 local_stat (struct vfs_class
*me
, const char *path
, struct stat
*buf
)
122 return stat (path
, buf
);
126 local_lstat (struct vfs_class
*me
, const char *path
, struct stat
*buf
)
130 #ifndef HAVE_STATLSTAT
131 return lstat (path
,buf
);
133 return statlstat (path
, buf
);
138 local_fstat (void *data
, struct stat
*buf
)
140 /* FIXME: avoid type cast */
141 return fstat (*((int *) data
), buf
);
145 local_chmod (struct vfs_class
*me
, const char *path
, int mode
)
149 return chmod (path
, mode
);
153 local_chown (struct vfs_class
*me
, const char *path
, int owner
, int group
)
157 return chown (path
, owner
, group
);
161 local_utime (struct vfs_class
*me
, const char *path
, struct utimbuf
*times
)
165 return utime (path
, times
);
169 local_readlink (struct vfs_class
*me
, const char *path
, char *buf
, size_t size
)
173 return readlink (path
, buf
, size
);
177 local_unlink (struct vfs_class
*me
, const char *path
)
181 return unlink (path
);
185 local_symlink (struct vfs_class
*me
, const char *n1
, const char *n2
)
189 return symlink (n1
, n2
);
193 local_write (void *data
, const char *buf
, int nbyte
)
202 while ((n
= write (fd
, buf
, nbyte
)) == -1){
204 if (errno
== EAGAIN
) continue;
207 if (errno
== EINTR
) continue;
215 local_rename (struct vfs_class
*me
, const char *a
, const char *b
)
219 return rename (a
, b
);
223 local_chdir (struct vfs_class
*me
, const char *path
)
231 local_lseek (void *data
, off_t offset
, int whence
)
233 int fd
= * (int *) data
;
235 return lseek (fd
, offset
, whence
);
239 local_mknod (struct vfs_class
*me
, const char *path
, int mode
, int dev
)
243 return mknod (path
, mode
, dev
);
247 local_link (struct vfs_class
*me
, const char *p1
, const char *p2
)
251 return link (p1
, p2
);
255 local_mkdir (struct vfs_class
*me
, const char *path
, mode_t mode
)
259 return mkdir (path
, mode
);
263 local_rmdir (struct vfs_class
*me
, const char *path
)
271 local_getlocalcopy (struct vfs_class
*me
, const char *path
)
275 return mhl_str_dup (path
);
279 local_ungetlocalcopy (struct vfs_class
*me
, const char *path
,
280 const char *local
, int has_changed
)
291 local_which (struct vfs_class
*me
, const char *path
)
296 return 0; /* Every path which other systems do not like is expected to be ours */
302 vfs_local_ops
.name
= "localfs";
303 vfs_local_ops
.flags
= VFSF_LOCAL
;
304 vfs_local_ops
.which
= local_which
;
305 vfs_local_ops
.open
= local_open
;
306 vfs_local_ops
.close
= local_close
;
307 vfs_local_ops
.read
= local_read
;
308 vfs_local_ops
.write
= local_write
;
309 vfs_local_ops
.opendir
= local_opendir
;
310 vfs_local_ops
.readdir
= local_readdir
;
311 vfs_local_ops
.closedir
= local_closedir
;
312 vfs_local_ops
.stat
= local_stat
;
313 vfs_local_ops
.lstat
= local_lstat
;
314 vfs_local_ops
.fstat
= local_fstat
;
315 vfs_local_ops
.chmod
= local_chmod
;
316 vfs_local_ops
.chown
= local_chown
;
317 vfs_local_ops
.utime
= local_utime
;
318 vfs_local_ops
.readlink
= local_readlink
;
319 vfs_local_ops
.symlink
= local_symlink
;
320 vfs_local_ops
.link
= local_link
;
321 vfs_local_ops
.unlink
= local_unlink
;
322 vfs_local_ops
.rename
= local_rename
;
323 vfs_local_ops
.chdir
= local_chdir
;
324 vfs_local_ops
.ferrno
= local_errno
;
325 vfs_local_ops
.lseek
= local_lseek
;
326 vfs_local_ops
.mknod
= local_mknod
;
327 vfs_local_ops
.getlocalcopy
= local_getlocalcopy
;
328 vfs_local_ops
.ungetlocalcopy
= local_ungetlocalcopy
;
329 vfs_local_ops
.mkdir
= local_mkdir
;
330 vfs_local_ops
.rmdir
= local_rmdir
;
331 vfs_register_class (&vfs_local_ops
);