#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),
});
}
err = fstat64(fd, &sbuf);
} while((err < 0) && (errno == EINTR)) ;
- if(err < 0)
+ if(err < 0)
return(-errno);
if(ubuf != NULL)
err = stat64(file_name, &sbuf);
} while((err < 0) && (errno == EINTR)) ;
- if(err < 0)
- return(-errno);
-
- if(ubuf != NULL)
- copy_stat(ubuf, &sbuf);
- 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)
+ if(err < 0)
return(-errno);
if(ubuf != NULL)
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;
int os_new_tty_pgrp(int fd, int pid)
{
- if(ioctl(fd, TIOCSCTTY, 0) < 0){
- printk("TIOCSCTTY failed, errno = %d\n", errno);
- return(-errno);
- }
+ if(ioctl(fd, TIOCSCTTY, 0) < 0)
+ return -errno;
- if(tcsetpgrp(fd, pid) < 0){
- printk("tcsetpgrp failed, errno = %d\n", errno);
- return(-errno);
- }
+ if(tcsetpgrp(fd, pid) < 0)
+ return -errno;
return(0);
}
int disc, sencap;
disc = N_SLIP;
- if(ioctl(fd, TIOCSETD, &disc) < 0){
- printk("Failed to set slip line discipline - "
- "errno = %d\n", errno);
- return(-errno);
- }
+ if(ioctl(fd, TIOCSETD, &disc) < 0)
+ return -errno;
sencap = 0;
- if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0){
- printk("Failed to set slip encapsulation - "
- "errno = %d\n", errno);
- return(-errno);
- }
+ if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0)
+ return -errno;
return(0);
}
return(0);
}
-/* FIXME? moved wholesale from sigio_user.c to get fcntls out of that file */
+/* FIXME? moved wholesale from sigio_user.c to get fcntls out of that file */
int os_sigio_async(int master, int slave)
{
int flags;
flags = fcntl(master, F_GETFL);
- if(flags < 0) {
- printk("fcntl F_GETFL failed, errno = %d\n", errno);
- return(-errno);
- }
+ if(flags < 0)
+ return errno;
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);
- return(-errno);
- }
+ (fcntl(master, F_SETOWN, os_getpid()) < 0))
+ return -errno;
- if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)){
- printk("fcntl F_SETFL failed, errno = %d\n", errno);
- return(-errno);
- }
+ if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0))
+ return -errno;
return(0);
}
struct uml_stat buf;
int err;
- err = os_lstat_file(file, &buf);
+ err = os_stat_file(file, &buf);
if(err < 0)
return(err);
int os_open_file(char *file, struct openflags flags, int mode)
{
- int fd, f = 0;
+ int fd, err, f = 0;
if(flags.r && flags.w) f = O_RDWR;
else if(flags.r) f = O_RDONLY;
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(-errno);
if(flags.cl && fcntl(fd, F_SETFD, 1)){
+ err = -errno;
os_close_file(fd);
- return(-errno);
+ return err;
}
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;
snprintf(sock.sun_path, sizeof(sock.sun_path), "%s", name);
fd = socket(AF_UNIX, SOCK_STREAM, 0);
- if(fd < 0)
- return(fd);
+ if(fd < 0) {
+ err = -errno;
+ goto out;
+ }
err = connect(fd, (struct sockaddr *) &sock, sizeof(sock));
- if(err)
- return(-errno);
+ if(err) {
+ err = -errno;
+ goto out_close;
+ }
- return(fd);
+ return fd;
+
+out_close:
+ close(fd);
+out:
+ return err;
}
void os_close_file(int fd)
__u64 actual;
actual = lseek64(fd, offset, SEEK_SET);
- if(actual != offset)
+ if(actual != offset)
return(-errno);
return(0);
}
-static int fault_buffer(void *start, int len,
+static int fault_buffer(void *start, int len,
int (*copy_proc)(void *addr, void *buf, int len))
{
int page = getpagesize(), i;
int os_read_file(int fd, void *buf, int len)
{
- return(file_io(fd, buf, len, (int (*)(int, void *, int)) read,
+ return(file_io(fd, buf, len, (int (*)(int, void *, int)) read,
copy_from_user_proc));
}
int os_write_file(int fd, const void *buf, int len)
{
- return(file_io(fd, (void *) buf, len,
+ return(file_io(fd, (void *) buf, len,
(int (*)(int, void *, int)) write, copy_to_user_proc));
}
-int os_file_size(char *file, long long *size_out)
+int os_file_size(char *file, unsigned long long *size_out)
{
struct uml_stat buf;
int err;
return(fd);
}
if(ioctl(fd, BLKGETSIZE, &blocks) < 0){
+ err = -errno;
printk("Couldn't get the block size of \"%s\", "
"errno = %d\n", file, errno);
- err = -errno;
os_close_file(fd);
return(err);
}
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;
int err, type = stream ? SOCK_STREAM : SOCK_DGRAM;
err = socketpair(AF_UNIX, type, 0, fds);
- if(err < 0)
+ if(err < 0)
return(-errno);
if(!close_on_exec)
int os_set_fd_async(int fd, int owner)
{
+ int err;
+
/* XXX This should do F_GETFL first */
if(fcntl(fd, F_SETFL, O_ASYNC | O_NONBLOCK) < 0){
+ err = -errno;
printk("os_set_fd_async : failed to set O_ASYNC and "
"O_NONBLOCK on fd # %d, errno = %d\n", fd, errno);
- return(-errno);
+ return err;
}
#ifdef notdef
if(fcntl(fd, F_SETFD, 1) < 0){
if((fcntl(fd, F_SETSIG, SIGIO) < 0) ||
(fcntl(fd, F_SETOWN, owner) < 0)){
+ err = -errno;
printk("os_set_fd_async : Failed to fcntl F_SETOWN "
"(or F_SETSIG) fd %d to pid %d, errno = %d\n", fd,
owner, errno);
- return(-errno);
+ return err;
}
return(0);
if(blocking) flags &= ~O_NONBLOCK;
else flags |= O_NONBLOCK;
- if(fcntl(fd, F_SETFL, flags) < 0){
- printk("Failed to change blocking on fd # %d, errno = %d\n",
- fd, errno);
- return(-errno);
- }
+ if(fcntl(fd, F_SETFL, flags) < 0)
+ return -errno;
+
return(0);
}
int sock, err;
sock = socket(PF_UNIX, SOCK_DGRAM, 0);
- if (sock < 0){
- printk("create_unix_socket - socket failed, errno = %d\n",
- errno);
- return(-errno);
- }
+ if(sock < 0)
+ return -errno;
if(close_on_exec) {
err = os_set_exec_close(sock, 1);
snprintf(addr.sun_path, len, "%s", file);
err = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
- if (err < 0){
- printk("create_listening_socket at '%s' - bind failed, "
- "errno = %d\n", file, errno);
- return(-errno);
- }
-
- 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 -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);
+ return(sock);
}
void os_flush_stdout(void)
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