[Libsysio-commit] b_lustre: libsysio/src stdlib.c Makefile.am
Brought to you by:
lward
From: Mei <me...@us...> - 2003-12-19 03:46:04
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1:/tmp/cvs-serv17390 Modified Files: Tag: b_lustre Makefile.am Added Files: Tag: b_lustre stdlib.c Log Message: initial checkin for standard library functions interception, now only simple implementation of dir-related series. and workaround for xattr() on linux. currently only compiled on Linux --- NEW FILE --- /* * Copyright (c) 2003,2004 Cluster File Systems, Inc. * * stdlib.c * * Initially we try the simplest implementation here, just get a confidence * it could work. Optimize them if necessary. * */ #if !(defined(BSD) || defined(REDSTORM)) #include <stdlib.h> #include <errno.h> #include <fcntl.h> #include <dirent.h> #include <sysio.h> #include "sysio-symbols.h" #if !defined(__USE_LARGEFILE64) #error "__LARGEFILE64_SOURCE must be defined" #endif /*********************************************************** * dir series functions * ***********************************************************/ #undef BUFSIZE #define BUFSIZE 4096 struct __dirstream { int fd; loff_t base; loff_t filepos; /* current pos in dir file stream */ struct dirent *curent; /* current dirent pointer */ struct dirent64 *curent64; /* current dirent64 pointer */ struct dirent *retent; /* ent returned to caller */ struct dirent64 *retent64; /* ent64 returned to caller */ unsigned int effective; /* effective data size in buffer */ char buf[BUFSIZE]; }; DIR* opendir(const char *name) { DIR *dir; dir = (DIR *) malloc(sizeof(*dir)); if (!dir) { errno = ENOMEM; return NULL; } #if __USE_LARGEFILE64 dir->fd = open64(name, O_RDONLY); #else dir->fd = open(name, O_RDONLY); #endif if (dir->fd < 0) goto err_out; dir->base = 0; dir->filepos = 0; dir->curent = (struct dirent *) dir->buf; dir->curent64 = (struct dirent64 *) dir->buf; dir->retent = NULL; dir->retent64 = NULL; dir->effective = 0; return dir; err_out: free(dir); return NULL; } sysio_sym_strong_alias(opendir, __opendir); struct dirent *readdir(DIR *dir) { int rc, reclen; /* need to read new data? */ if ((char*)dir->curent - dir->buf >= dir->effective) { rc = getdirentries(dir->fd, dir->buf, BUFSIZE, (off_t*) &dir->base); /* error or end-of-file */ if (rc <= 0) return NULL; dir->curent = (struct dirent *) dir->buf; dir->effective = rc; } dir->retent = dir->curent; dir->curent = (struct dirent*) ((char *)(dir->curent) + dir->curent->d_reclen); #ifdef _DIRENT_HAVE_D_OFF dir->filepos = dir->curent->d_off; #else dir->filepos += dir->curent->d_reclen; #endif return dir->retent; } sysio_sym_weak_alias(readdir, __readdir); struct dirent64 *readdir64(DIR *dir) { int rc, reclen; /* need to read new data? */ if ((char*)dir->curent64 - dir->buf >= dir->effective) { rc = getdirentries64(dir->fd, dir->buf, BUFSIZE, &dir->base); /* error or end-of-file */ if (rc <= 0) return NULL; dir->curent64 = (struct dirent64 *) dir->buf; dir->effective = rc; } dir->retent64 = dir->curent64; dir->curent64 = (struct dirent64*) ((char *)(dir->curent64) + dir->curent64->d_reclen); #ifdef _DIRENT_HAVE_D_OFF dir->filepos = dir->curent64->d_off; #else dir->filepos += dir->curent64->d_reclen; #endif return dir->retent64; } sysio_sym_strong_alias(readdir64, __readdir64); int closedir(DIR *dir) { int rc; rc = close(dir->fd); free(dir); return rc; } sysio_sym_strong_alias(closedir, __closedir); int dirfd(DIR *dir) { return dir->fd; } off_t telldir(DIR *dir) { return (dir->filepos); } void seekdir(DIR *dir, off_t offset) { dir->filepos = offset; dir->base = offset; dir->curent64 = (struct dirent64 *) dir->buf; dir->retent64 = NULL; dir->effective = 0; dir->curent = (struct dirent *) dir->buf; dir->retent = NULL; } void rewinddir(DIR *dir) { dir->base = 0; dir->filepos = 0; dir->curent64 = (struct dirent64 *) dir->buf; dir->retent64 = NULL; dir->curent = (struct dirent *) dir->buf; dir->retent = NULL; dir->effective = 0; } int scandir(const char *dir, struct dirent ***namelist, int(*select)(const struct dirent *), int(*compar)(const void *, const void *)) { printf("libsysio: scandir not supported\n"); errno = ENOSYS; return -1; } int scandir64(const char *dir, struct dirent64 ***namelist, int(*select)(const struct dirent64 *), int(*compar)(const void *, const void *)) { printf("libsysio: scandir64 not supported\n"); errno = ENOSYS; return -1; } /*********************************************************** * FIXME workaround for linux only * ***********************************************************/ #define LINUX #if defined(LINUX) ssize_t getxattr(char *path, char *name, void *value, size_t size) { errno = ENOSYS; return -1; } ssize_t lgetxattr(char *path, char *name, void *value, size_t size) { errno = ENOSYS; return -1; } ssize_t fgetxattr(int fd, char *name, void *value, size_t size) { errno = ENOSYS; return -1; } long setxattr(char *path, char *name, void *value, size_t size, int flags) { errno = ENOSYS; return -1; } long lsetxattr(char *path, char *name, void *value, size_t size, int flags) { errno = ENOSYS; return -1; } long fsetxattr(int fd, char *name, void *value, size_t size, int flags) { errno = ENOSYS; return -1; } long listxattr(char *path, char *list, size_t size) { errno = ENOSYS; return -1; } long llistxattr(char *path, char *list, size_t size) { errno = ENOSYS; return -1; } long flistxattr(int fd, char *list, size_t size) { errno = ENOSYS; return -1; } long removexattr(char *path, char *name) { errno = ENOSYS; return -1; } long lremovexattr(char *path, char *name) { errno = ENOSYS; return -1; } long fremovexattr(int fd, char *name) { errno = ENOSYS; return -1; } #endif #endif Index: Makefile.am =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/Attic/Makefile.am,v retrieving revision 1.5.4.7 retrieving revision 1.5.4.8 diff -u -w -b -B -p -r1.5.4.7 -r1.5.4.8 --- Makefile.am 15 Dec 2003 08:22:16 -0000 1.5.4.7 +++ Makefile.am 19 Dec 2003 03:45:59 -0000 1.5.4.8 @@ -1,6 +1,6 @@ lib_LIBRARIES = libsysio.a -libsysio_a_SOURCES = chdir.c chmod.c chown.c dev.c dup.c fcntl.c file.c fs.c \ +libsysio_a_SOURCES = stdlib.c chdir.c chmod.c chown.c dev.c dup.c fcntl.c file.c fs.c \ fsync.c getdirentries.c init.c inode.c ioctl.c ioctx.c iowait.c \ link.c lseek.c mkdir.c mknod.c mount.c namei.c open.c read.c rename.c \ rmdir.c stat.c stat64.c statvfs.c statvfs64.c symlink.c truncate.c \ |