Replace system calls that accept a path with *at versions.

This commit is contained in:
Jonas 'Sortie' Termansen 2012-10-25 17:35:54 +02:00
parent 921deb6eeb
commit 1fa2df3e6a
13 changed files with 68 additions and 44 deletions

View File

@ -171,6 +171,7 @@ linkat.o \
link.o \
localeconv.o \
lseek.o \
lstat.o \
memstat.o \
mkdirat.o \
mkdir.o \

View File

@ -22,12 +22,10 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>
DEFN_SYSCALL2(int, SysAccess, SYSCALL_ACCESS, const char*, int);
extern "C" int access(const char* pathname, int mode)
{
return SysAccess(pathname, mode);
return faccessat(AT_FDCWD, pathname, mode, 0);
}

View File

@ -24,12 +24,10 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>
DEFN_SYSCALL2(int, sys_chmod, SYSCALL_CHMOD, const char*, mode_t);
#include <fcntl.h>
extern "C" int chmod(const char* path, mode_t mode)
{
return sys_chmod(path, mode);
return fchmodat(AT_FDCWD, path, mode, 0);
}

View File

@ -23,12 +23,11 @@
*******************************************************************************/
#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>
DEFN_SYSCALL3(int, sys_chown, SYSCALL_CHOWN, const char*, uid_t, gid_t);
#include <fcntl.h>
#include <unistd.h>
extern "C" int chown(const char* path, uid_t owner, gid_t group)
{
return sys_chown(path, owner, group);
return fchownat(AT_FDCWD, path, owner, group, 0);
}

View File

@ -22,12 +22,10 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>
DEFN_SYSCALL2(int, sys_link, SYSCALL_LINK, const char*, const char*);
extern "C" int link(const char* oldpath, const char* newpath)
{
return sys_link(oldpath, newpath);
return linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);
}

32
libc/lstat.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
lstat.cpp
Retrieves status of a file.
*******************************************************************************/
#include <sys/stat.h>
#include <fcntl.h>
extern "C" int lstat(const char* path, struct stat* st)
{
return fstatat(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW);
}

View File

@ -23,11 +23,10 @@
*******************************************************************************/
#include <sys/stat.h>
#include <sys/syscall.h>
DEFN_SYSCALL2(int, SysMkDir, SYSCALL_MKDIR, const char*, mode_t);
#include <fcntl.h>
extern "C" int mkdir(const char* pathname, mode_t mode)
{
return SysMkDir(pathname, mode);
return mkdirat(AT_FDCWD, pathname, mode);
}

View File

@ -22,12 +22,12 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
DEFN_SYSCALL3(int, sys_open, SYSCALL_OPEN, const char*, int, mode_t);
extern "C" int open(const char* path, int flags, ...)
{
mode_t mode = 0;
@ -38,5 +38,5 @@ extern "C" int open(const char* path, int flags, ...)
mode = va_arg(ap, mode_t);
va_end(ap);
}
return sys_open(path, flags, mode);
return openat(AT_FDCWD, path, flags, mode);
}

View File

@ -22,12 +22,10 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>
DEFN_SYSCALL1(int, SysRmDir, SYSCALL_RMDIR, const char*);
extern "C" int rmdir(const char* pathname)
{
return SysRmDir(pathname);
return unlinkat(AT_FDCWD, pathname, AT_REMOVEDIR);
}

View File

@ -23,17 +23,10 @@
*******************************************************************************/
#include <sys/stat.h>
#include <sys/syscall.h>
DEFN_SYSCALL2(int, SysStat, SYSCALL_STAT, const char*, struct stat*);
#include <fcntl.h>
extern "C" int stat(const char* path, struct stat* st)
{
return SysStat(path, st);
}
// TODO: Hack!
extern "C" int lstat(const char* path, struct stat* st)
{
return SysStat(path, st);
return fstatat(AT_FDCWD, path, st, 0);
}

View File

@ -22,12 +22,12 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <unistd.h>
#include <sys/types.h>
DEFN_SYSCALL2(int, SysTruncate, SYSCALL_TRUNCATE, const char*, off_t);
#include <fcntl.h>
#include <unistd.h>
extern "C" int truncate(const char* pathname, off_t length)
{
return SysTruncate(pathname, length);
return truncateat(AT_FDCWD, pathname, length);
}

View File

@ -22,12 +22,10 @@
*******************************************************************************/
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>
DEFN_SYSCALL1(int, SysUnlink, SYSCALL_UNLINK, const char*);
extern "C" int unlink(const char* pathname)
{
return SysUnlink(pathname);
return unlinkat(AT_FDCWD, pathname, 0);
}

View File

@ -152,6 +152,7 @@ static int sys_openat(int dirfd, const char* path, int flags, mode_t mode)
return dtable->Allocate(desc, fdflags);
}
// TODO: This system call is replaced by openat, will be removed soon.
static int sys_open(const char* path, int flags, mode_t mode)
{
return sys_openat(AT_FDCWD, path, flags, mode);
@ -174,6 +175,7 @@ static int sys_faccessat(int dirfd, const char* path, int /*mode*/, int flags)
return desc ? 0 : -1;
}
// TODO: This system call is replaced by faccessat, will be removed soon.
static int sys_access(const char* path, int mode)
{
return sys_faccessat(AT_FDCWD, path, mode, 0);
@ -197,6 +199,7 @@ static int sys_unlinkat(int dirfd, const char* path, int flags)
return ret;
}
// TODO: This system call is replaced by unlinkat, will be removed soon.
static int sys_unlink(const char* path)
{
return sys_unlinkat(AT_FDCWD, path, 0);
@ -216,11 +219,13 @@ static int sys_mkdirat(int dirfd, const char* path, mode_t mode)
return ret;
}
// TODO: This system call is replaced by mkdirat, will be removed soon.
static int sys_mkdir(const char* path, mode_t mode)
{
return sys_mkdirat(AT_FDCWD, path, mode);
}
// TODO: This system call is replaced by unlinkat, will be removed soon.
static int sys_rmdir(const char* path)
{
return sys_unlinkat(AT_FDCWD, path, AT_REMOVEDIR);
@ -242,6 +247,7 @@ static int sys_truncateat(int dirfd, const char* path, off_t length)
return desc->truncate(&ctx, length);
}
// TODO: This system call is replaced by truncateat, will be removed soon.
static int sys_truncate(const char* path, off_t length)
{
return sys_truncateat(AT_FDCWD, path, length);
@ -272,6 +278,7 @@ static int sys_fstatat(int dirfd, const char* path, struct stat* st, int /*flags
return desc->stat(&ctx, st);
}
// TODO: This system call is replaced by fstatat, will be removed soon.
static int sys_stat(const char* path, struct stat* st)
{
return sys_fstatat(AT_FDCWD, path, st, 0);
@ -379,6 +386,7 @@ static int sys_fchownat(int dirfd, const char* path, uid_t owner, gid_t group, i
return desc->chown(&ctx, owner, group);
}
// TODO: This system call is replaced by fchownat, will be removed soon.
static int sys_chown(const char* path, uid_t owner, gid_t group)
{
return sys_fchownat(AT_FDCWD, path, owner, group, 0);
@ -412,6 +420,7 @@ static int sys_fchmodat(int dirfd, const char* path, mode_t mode, int flags)
return desc->chmod(&ctx, mode);
}
// TODO: This system call is replaced by fchmodat, will be removed soon.
static int sys_chmod(const char* path, mode_t mode)
{
return sys_fchmodat(AT_FDCWD, path, mode, 0);
@ -455,6 +464,7 @@ static int sys_linkat(int olddirfd, const char* oldpath,
return ret;
}
// TODO: This system call is replaced by linkat, will be removed soon.
static int sys_link(const char* oldpath, const char* newpath)
{
return sys_linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);