#include <errno.h>
#include <fcntl.h>
#include <signal.h>
-#include <utime.h>
-#include <dirent.h>
-#include <linux/kdev_t.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/uio.h>
-#include <sys/utsname.h>
-#include <sys/vfs.h>
#include "os.h"
#include "user.h"
#include "kern_util.h"
static void copy_stat(struct uml_stat *dst, struct stat64 *src)
{
*dst = ((struct uml_stat) {
- .ust_major = MAJOR(src->st_dev), /* device */
- .ust_minor = MINOR(src->st_dev),
+ .ust_dev = src->st_dev, /* device */
.ust_ino = src->st_ino, /* inode */
.ust_mode = src->st_mode, /* protection */
.ust_nlink = src->st_nlink, /* number of hard links */
.ust_atime = src->st_atime, /* time of last access */
.ust_mtime = src->st_mtime, /* time of last modification */
.ust_ctime = src->st_ctime, /* time of last change */
- .ust_rmajor = MAJOR(src->st_rdev),
- .ust_rminor = MINOR(src->st_rdev),
});
}
return(err);
}
-int os_lstat_file(const char *file_name, struct uml_stat *ubuf)
-{
- struct stat64 sbuf;
- int err;
-
- do {
- err = lstat64(file_name, &sbuf);
- } while((err < 0) && (errno == EINTR)) ;
-
- if(err < 0)
- return(-errno);
-
- if(ubuf != NULL)
- copy_stat(ubuf, &sbuf);
- return(err);
-}
-
-int os_access(const char *file, int mode)
+int os_access(const char* file, int mode)
{
int amode, err;
- amode=(mode& OS_ACC_R_OK ? R_OK : 0) | (mode& OS_ACC_W_OK ? W_OK : 0) |
- (mode& OS_ACC_X_OK ? X_OK : 0) | (mode& OS_ACC_F_OK ? F_OK : 0) ;
+ amode=(mode&OS_ACC_R_OK ? R_OK : 0) | (mode&OS_ACC_W_OK ? W_OK : 0) |
+ (mode&OS_ACC_X_OK ? X_OK : 0) | (mode&OS_ACC_F_OK ? F_OK : 0) ;
err = access(file, amode);
if(err < 0)
return(0);
}
-int os_set_file_time(const char *file, unsigned long access, unsigned long mod)
-{
- struct utimbuf buf = ((struct utimbuf){ .actime = access,
- .modtime = mod });
- int err;
-
- err = utime(file, &buf);
- if(err < 0)
- return(-errno);
-
- return(0);
-}
-
-int os_set_file_perms(const char *file, int mode)
-{
- int err;
-
- err = chmod(file, mode);
- if(err < 0)
- return(-errno);
-
- return(0);
-}
-
-int os_set_file_owner(const char *file, int owner, int group)
-{
- int err;
-
- err = chown(file, owner, group);
- if(err < 0)
- return(-errno);
-
- return(0);
-}
-
void os_print_error(int error, const char* str)
{
errno = error < 0 ? -error : error;
if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
(fcntl(master, F_SETOWN, os_getpid()) < 0)){
- printk("fcntl F_SETFL or F_SETOWN failed, errno = %d\n",
- errno);
+ printk("fcntl F_SETFL or F_SETOWN failed, errno = %d\n", errno);
return(-errno);
}
struct uml_stat buf;
int err;
- err = os_lstat_file(file, &buf);
+ err = os_stat_file(file, &buf);
if(err < 0)
return(err);
if(flags.c) f |= O_CREAT;
if(flags.t) f |= O_TRUNC;
if(flags.e) f |= O_EXCL;
- if(flags.d) f |= O_DIRECT;
fd = open64(file, f, mode);
if(fd < 0)
return(fd);
}
-void *os_open_dir(char *path, int *err_out)
-{
- void *dir;
-
- dir = opendir(path);
- *err_out = -errno;
- return(dir);
-}
-
-int os_seek_dir(void *stream, unsigned long long pos)
-{
- seekdir(stream, pos);
- return(0);
-}
-
-int os_read_dir(void *stream, unsigned long long *ino_out, char **name_out)
-{
- struct dirent *ent;
-
- errno = 0;
- ent = readdir(stream);
- if(ent == NULL){
- if(errno != 0)
- return(-errno);
- *name_out = NULL;
- return(0);
- }
-
- *ino_out = ent->d_ino;
- *name_out = ent->d_name;
- return(0);
-}
-
-int os_tell_dir(void *stream)
-{
- return(telldir(stream));
-}
-
-int os_close_dir(void *stream)
-{
- int err;
-
- err = closedir(stream);
- if(err < 0)
- return(-errno);
- return(0);
-}
-
-int os_remove_file(const char *file)
-{
- int err;
-
- err = unlink(file);
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_move_file(const char *from, const char *to)
-{
- int err;
-
- err = rename(from, to);
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_truncate_fd(int fd, unsigned long long len)
-{
- int err;
-
- err = ftruncate(fd, len);
- if(err)
- return(-errno);
- return(0);
-}
-
-int os_truncate_file(const char *file, unsigned long long len)
-{
- int err;
-
- err = truncate(file, len);
- if(err)
- return(-errno);
- return(0);
-}
-
int os_connect_socket(char *name)
{
struct sockaddr_un sock;
__u64 actual;
actual = lseek64(fd, offset, SEEK_SET);
- if(actual != offset)
- return(-errno);
+ if(actual != offset) return(-errno);
return(0);
}
return(0);
}
-int os_fd_size(int fd, long long *size_out)
-{
- struct stat buf;
- int err;
-
- err = fstat(fd, &buf);
- if(err)
- return(-errno);
-
- *size_out = buf.st_size;
- return(0);
-}
-
int os_file_modtime(char *file, unsigned long *modtime)
{
struct uml_stat buf;
return(0);
}
-int os_clear_fd_async(int fd)
-{
- int flags = fcntl(fd, F_GETFL);
-
- flags &= ~(O_ASYNC | O_NONBLOCK);
- if(fcntl(fd, F_SETFL, flags) < 0)
- return(-errno);
- return(0);
-}
-
int os_set_fd_block(int fd, int blocking)
{
int flags;
return(sock);
}
-int os_make_symlink(const char *to, const char *from)
-{
- int err;
-
- err = symlink(to, from);
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_read_symlink(const char *file, char *buf, int size)
-{
- int err;
-
- err = readlink(file, buf, size);
- if(err < 0)
- return(-errno);
-
- return(err);
-}
-
-int os_link_file(const char *to, const char *from)
-{
- int err;
-
- err = link(to, from);
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_make_dir(const char *dir, int mode)
-{
- int err;
-
- err = mkdir(dir, mode);
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_make_dev(const char *name, int mode, int major, int minor)
-{
- int err;
-
- err = mknod(name, mode, MKDEV(major, minor));
- if(err)
- return(-errno);
-
- return(0);
-}
-
-int os_remove_dir(const char *dir)
-{
- int err;
-
- err = rmdir(dir);
- if(err)
- return(-errno);
-
- return(0);
-}
-
void os_flush_stdout(void)
{
fflush(stdout);
return(err);
}
-int os_stat_filesystem(char *path, long *bsize_out, long long *blocks_out,
- long long *bfree_out, long long *bavail_out,
- long long *files_out, long long *ffree_out,
- void *fsid_out, int fsid_size, long *namelen_out,
- long *spare_out)
-{
- struct statfs64 buf;
- int err;
-
- err = statfs64(path, &buf);
- if(err < 0)
- return(-errno);
-
- *bsize_out = buf.f_bsize;
- *blocks_out = buf.f_blocks;
- *bfree_out = buf.f_bfree;
- *bavail_out = buf.f_bavail;
- *files_out = buf.f_files;
- *ffree_out = buf.f_ffree;
- memcpy(fsid_out, &buf.f_fsid,
- sizeof(buf.f_fsid) > fsid_size ? fsid_size :
- sizeof(buf.f_fsid));
- *namelen_out = buf.f_namelen;
- spare_out[0] = buf.f_spare[0];
- spare_out[1] = buf.f_spare[1];
- spare_out[2] = buf.f_spare[2];
- spare_out[3] = buf.f_spare[3];
- spare_out[4] = buf.f_spare[4];
- spare_out[5] = buf.f_spare[5];
- return(0);
-}
-
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically