[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 \
|