summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysif.c')
-rw-r--r--sysif.c158
1 files changed, 97 insertions, 61 deletions
diff --git a/sysif.c b/sysif.c
index 7d383162..21bf00b4 100644
--- a/sysif.c
+++ b/sysif.c
@@ -135,9 +135,10 @@ static val at_exit_list;
static val errno_wrap(val newval)
{
+ val self = lit("errno");
val oldval = num(errno);
if (default_null_arg(newval))
- errno = c_num(newval);
+ errno = c_num(newval, self);
return oldval;
}
@@ -185,6 +186,7 @@ static val daemon_wrap(val nochdir, val noclose)
static val exit_wrap(val status)
{
+ val self = lit("exit");
int stat;
if missingp(status)
@@ -194,7 +196,7 @@ static val exit_wrap(val status)
else if (status == t)
stat = EXIT_SUCCESS;
else
- stat = c_num(status);
+ stat = c_num(status, self);
exit(stat);
/* notreached */
@@ -229,8 +231,9 @@ static val abort_wrap(void)
val usleep_wrap(val usec)
{
+ val self = lit("usleep");
val retval;
- cnum u = c_num(usec);
+ cnum u = c_num(usec, self);
sig_save_enable;
@@ -307,7 +310,8 @@ val errno_to_file_error(int err)
#if HAVE_MKDIR
static val mkdir_wrap(val path, val mode)
{
- cnum cmode = c_num(default_arg(mode, num_fast(0777)));
+ val self = lit("mkdir");
+ cnum cmode = c_num(default_arg(mode, num_fast(0777)), self);
char *u8path = utf8_dup_to(c_str(path));
int err = mkdir(u8path, cmode);
free(u8path);
@@ -423,6 +427,7 @@ static val mkdir_nothrow_exists(val path, val mode)
static val ensure_dir(val path, val mode)
{
+ val self = lit("ensure-dir");
#if HAVE_WINDOWS_H
val sep = lit("\\");
val sep_set = lit("\\/");
@@ -445,7 +450,7 @@ static val ensure_dir(val path, val mode)
}
if (integerp(ret)) {
- int eno = c_num(ret);
+ int eno = c_num(ret, self);
uw_throwf(errno_to_file_error(eno),
lit("ensure-dir: ~a: ~d/~s"), path, ret,
errno_to_str(eno), nao);
@@ -517,17 +522,20 @@ static val rmdir_wrap(val path)
static val makedev_wrap(val major, val minor)
{
- return num(makedev(c_num(major), c_num(minor)));
+ val self = lit("makedev");
+ return num(makedev(c_num(major, self), c_num(minor, self)));
}
static val minor_wrap(val dev)
{
- return num(minor(c_num(dev)));
+ val self = lit("minor");
+ return num(minor(c_num(dev, self)));
}
static val major_wrap(val dev)
{
- return num(major(c_num(dev)));
+ val self = lit("major");
+ return num(major(c_num(dev, self)));
}
#endif
@@ -536,8 +544,9 @@ static val major_wrap(val dev)
static val mknod_wrap(val path, val mode, val dev)
{
- cnum cmode = c_num(mode);
- cnum cdev = c_num(default_arg(dev, zero));
+ val self = lit("mknod");
+ cnum cmode = c_num(mode, self);
+ cnum cdev = c_num(default_arg(dev, zero), self);
char *u8path = utf8_dup_to(c_str(path));
int err = mknod(u8path, cmode, cdev);
free(u8path);
@@ -564,7 +573,8 @@ static val mknod_wrap(val path, val mode, val dev)
static val mkfifo_wrap(val path, val mode)
{
- cnum cmode = c_num(mode);
+ val self = lit("mkfifo");
+ cnum cmode = c_num(mode, self);
char *u8path = utf8_dup_to(c_str(path));
int err = mkfifo(u8path, cmode);
free(u8path);
@@ -599,7 +609,7 @@ static val chmod_wrap(val target, val mode)
int fd = if3(u8path, -1, get_fd(target, self));
if (integerp(mode)) {
- cmode = c_num(mode);
+ cmode = c_num(mode, self);
} else if (stringp(mode)) {
#if HAVE_SYS_STAT
struct stat st;
@@ -766,8 +776,8 @@ inval:
static val do_chown(val target, val uid, val gid, val link_p, val self)
{
- cnum cuid = c_num(uid);
- cnum cgid = c_num(gid);
+ cnum cuid = c_num(uid, self);
+ cnum cgid = c_num(gid, self);
int err;
if (stringp(target)) {
@@ -879,8 +889,8 @@ static void flock_pack(val self, val in, struct flock *out)
{
out->l_type = c_short(slot(in, type_s), self);
out->l_whence = c_short(slot(in, whence_s), self);
- out->l_start = c_num(slot(in, start_s));
- out->l_len = c_num(slot(in, len_s));
+ out->l_start = c_num(slot(in, start_s), self);
+ out->l_len = c_num(slot(in, len_s), self);
}
static void flock_unpack(val out, struct flock *in)
@@ -952,69 +962,79 @@ static val fork_wrap(void)
static val wait_wrap(val pid, val flags)
{
- cnum p = c_num(default_arg(pid, negone));
- cnum f = c_num(default_arg(flags, zero));
+ val self = lit("wait");
+ cnum p = c_num(default_arg(pid, negone), self);
+ cnum f = c_num(default_arg(flags, zero), self);
int status = 0, result = waitpid(p, &status, f);
return if2(result >= 0, cons(num(result), num(status)));
}
static val wifexited(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wifexited");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return tnil(WIFEXITED(s));
}
static val wexitstatus(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wexitstatus");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return num(WEXITSTATUS(s));
}
static val wifsignaled(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wifsignaled");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return tnil(WIFSIGNALED(s));
}
static val wtermsig(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wtermsig");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return num(WTERMSIG(s));
}
#ifdef WCOREDUMP
static val wcoredump(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wcoredump");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return tnil(WCOREDUMP(s));
}
#endif
static val wifstopped(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wifstopped");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return tnil(WIFSTOPPED(s));
}
static val wstopsig(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wstopsig");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return num(WSTOPSIG(s));
}
#ifdef WIFCONTINUED
static val wifcontinued(val status)
{
- int s = c_num(if3(consp(status), cdr(status), status));
+ val self = lit("wifcontinued");
+ int s = c_num(if3(consp(status), cdr(status), status), self);
return tnil(WIFCONTINUED(s));
}
#endif
static val dup_wrap(val old, val neu)
{
+ val self = lit("dupfd");
if (missingp(neu))
- return num(dup(c_num(old)));
- return num(dup2(c_num(old), c_num(neu)));
+ return num(dup(c_num(old, self)));
+ return num(dup2(c_num(old, self), c_num(neu, self)));
}
static val close_wrap(val fd, val throw_on_error)
@@ -1037,7 +1057,7 @@ val exec_wrap(val file, val args_opt)
{
val self = lit("execvp");
val args = default_null_arg(args_opt);
- int nargs = c_num(length(args)) + 1;
+ int nargs = c_num(length(args), self) + 1;
char **argv = if3(nargs < 0 || nargs == INT_MAX,
(uw_throwf(process_error_s, lit("~a: argument list overflow"),
self, nao), convert(char **, 0)),
@@ -1059,6 +1079,7 @@ val exec_wrap(val file, val args_opt)
static val exit_star_wrap(val status)
{
+ val self = lit("exit*");
int stat;
if (status == nil)
@@ -1066,7 +1087,7 @@ static val exit_star_wrap(val status)
else if (status == t)
stat = EXIT_SUCCESS;
else
- stat = c_num(status);
+ stat = c_num(status, self);
_exit(stat);
/* notreached */
@@ -1075,9 +1096,9 @@ static val exit_star_wrap(val status)
#endif
-time_t c_time(val time)
+time_t c_time(val time, val self)
{
- return if3(convert(time_t, -1) > 0, (time_t) c_unum(time), (time_t) c_num(time));
+ return if3(convert(time_t, -1) > 0, (time_t) c_unum(time, self), (time_t) c_num(time, self));
}
val num_time(time_t time)
@@ -1197,18 +1218,18 @@ static val do_utimes(val target, val atime, val atimens,
#if HAVE_FUTIMENS
int flags = if3(symlink_nofollow, AT_SYMLINK_NOFOLLOW, 0);
struct timespec times[2];
- times[0].tv_sec = c_time(atime);
+ times[0].tv_sec = c_time(atime, self);
times[0].tv_nsec = timens(atimens, self);
- times[1].tv_sec = c_time(mtime);
+ times[1].tv_sec = c_time(mtime, self);
times[1].tv_nsec = timens(mtimens, self);
res = utimensat(AT_FDCWD, u8path, times, flags);
#else
errno = -EINVAL;
if (integerp(atimens) || integerp(mtimens)) {
struct timeval times[2];
- times[0].tv_sec = c_time(atime);
+ times[0].tv_sec = c_time(atime, self);
times[0].tv_usec = c_long(trunc(atimens, num_fast(1000)), self);
- times[1].tv_sec = c_time(mtime);
+ times[1].tv_sec = c_time(mtime, self);
times[1].tv_usec = c_long(trunc(mtimens, num_fast(1000)), self);
if (symlink_nofollow) {
#if HAVE_LUTIMES
@@ -1231,9 +1252,9 @@ static val do_utimes(val target, val atime, val atimens,
#if HAVE_FUTIMENS
struct timespec times[2];
int fd = get_fd(target, self);
- times[0].tv_sec = c_time(atime);
+ times[0].tv_sec = c_time(atime, self);
times[0].tv_nsec = timens(atimens, self);
- times[1].tv_sec = c_time(mtime);
+ times[1].tv_sec = c_time(mtime, self);
times[1].tv_nsec = timens(mtimens, self);
res = futimens(fd, times);
#elif HAVE_FUTIMES
@@ -1241,9 +1262,9 @@ static val do_utimes(val target, val atime, val atimens,
int fd = get_fd(target, self);
errno = -EINVAL;
if (integerp(atimens) || integerp(mtimens)) {
- times[0].tv_sec = c_time(atime);
+ times[0].tv_sec = c_time(atime, self);
times[0].tv_usec = c_long(trunc(atimens, num_fast(1000)), self);
- times[1].tv_sec = c_time(mtime);
+ times[1].tv_sec = c_time(mtime, self);
times[1].tv_usec = c_long(trunc(mtimens, num_fast(1000)), self);
res = futimes(fd, times);
}
@@ -1282,12 +1303,14 @@ static val wrap_lutimes(val target, val atime, val atimens,
val umask_wrap(val mask)
{
+ val self = lit("umask");
+
if (missingp(mask)) {
mode_t m = umask(0777);
(void) umask(m);
return num(m);
}
- return num(umask(c_num(mask)));
+ return num(umask(c_num(mask, self)));
}
#endif
@@ -1344,7 +1367,8 @@ static val unsetenv_wrap(val name)
static val poll_wrap(val poll_list, val timeout_in)
{
- nfds_t i, len = c_num(length(poll_list));
+ val self = lit("poll");
+ nfds_t i, len = c_num(length(poll_list), self);
val iter;
struct pollfd *pfd = coerce(struct pollfd *, alloca(len * sizeof *pfd));
val timeout = default_arg(timeout_in, negone);
@@ -1353,11 +1377,11 @@ static val poll_wrap(val poll_list, val timeout_in)
for (i = 0, iter = poll_list; iter; iter = cdr(iter), i++) {
cons_bind (obj, events, car(iter));
- pfd[i].events = c_num(events);
+ pfd[i].events = c_num(events, self);
switch (type(obj)) {
case NUM:
- pfd[i].fd = c_num(obj);
+ pfd[i].fd = c_num(obj, self);
break;
case COBJ:
if (subtypep(obj->co.cls, stream_s)) {
@@ -1368,7 +1392,7 @@ static val poll_wrap(val poll_list, val timeout_in)
lit("poll: stream ~s doesn't have a file descriptor"),
obj, nao);
}
- pfd[i].fd = c_num(fdval);
+ pfd[i].fd = c_num(fdval, self);
break;
}
/* fallthrough */
@@ -1383,7 +1407,7 @@ static val poll_wrap(val poll_list, val timeout_in)
sig_save_enable;
- res = poll(pfd, len, c_num(timeout));
+ res = poll(pfd, len, c_num(timeout, self));
sig_restore_enable;
@@ -1463,7 +1487,8 @@ static val getgroups_wrap(void)
static val setuid_wrap(val nval)
{
- if (setuid(c_num(nval)) == -1)
+ val self = lit("setuid");
+ if (setuid(c_num(nval, self)) == -1)
uw_throwf(system_error_s, lit("setuid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1471,7 +1496,8 @@ static val setuid_wrap(val nval)
static val seteuid_wrap(val nval)
{
- if (seteuid(c_num(nval)) == -1)
+ val self = lit("seteuid");
+ if (seteuid(c_num(nval, self)) == -1)
uw_throwf(system_error_s, lit("seteuid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1479,7 +1505,8 @@ static val seteuid_wrap(val nval)
static val setgid_wrap(val nval)
{
- if (setgid(c_num(nval)) == -1)
+ val self = lit("setgid");
+ if (setgid(c_num(nval, self)) == -1)
uw_throwf(system_error_s, lit("setgid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1487,7 +1514,8 @@ static val setgid_wrap(val nval)
static val setegid_wrap(val nval)
{
- if (setegid(c_num(nval)) == -1)
+ val self = lit("setegid");
+ if (setegid(c_num(nval, self)) == -1)
uw_throwf(system_error_s, lit("setegid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1581,6 +1609,8 @@ void drop_privilege(void)
void simulate_setuid_setgid(val open_script)
{
+ val self = lit("txr");
+
if (repress_called != RC_MAGIC || (is_setuid && seteuid(orig_euid) != 0))
abort();
@@ -1592,7 +1622,7 @@ void simulate_setuid_setgid(val open_script)
if (fdv) {
struct stat stb;
- cnum fd = c_num(fdv);
+ cnum fd = c_num(fdv, self);
if (fstat(fd, &stb) != 0)
goto drop;
@@ -1620,7 +1650,7 @@ drop:
static val setgroups_wrap(val list)
{
val self = lit("setgroups");
- ucnum len = c_num(length(list));
+ ucnum len = c_num(length(list), self);
if (convert(ucnum, convert(size_t, len)) != len) {
uw_throwf(system_error_s, lit("~a: list too long"), self, nao);
@@ -1629,7 +1659,7 @@ static val setgroups_wrap(val list)
int i = 0, res;
for (; list; i++, list = cdr(list)) {
- cnum gid = c_num(car(list));
+ cnum gid = c_num(car(list), self);
arr[i] = gid;
}
@@ -1669,7 +1699,8 @@ static val getresgid_wrap(void)
static val setresuid_wrap(val r, val e, val s)
{
- if (setresuid(c_num(r), c_num(e), c_num(s)) != 0)
+ val self = lit("setresuid");
+ if (setresuid(c_num(r, self), c_num(e, self), c_num(s, self)) != 0)
uw_throwf(system_error_s, lit("setresuid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1677,7 +1708,8 @@ static val setresuid_wrap(val r, val e, val s)
static val setresgid_wrap(val r, val e, val s)
{
- if (setresuid(c_num(r), c_num(e), c_num(s)) != 0)
+ val self = lit("setresgid");
+ if (setresuid(c_num(r, self), c_num(e, self), c_num(s, self)) != 0)
uw_throwf(system_error_s, lit("setresuid failed: ~d/~s"),
num(errno), errno_to_str(errno), nao);
return t;
@@ -1733,9 +1765,10 @@ static val getpwent_wrap(void)
static val getpwuid_wrap(val uid)
{
+ val self = lit("getpwuid");
char buf[1024];
struct passwd pw, *p;
- int res = getpwuid_r(c_num(uid), &pw, buf, sizeof buf, &p);
+ int res = getpwuid_r(c_num(uid, self), &pw, buf, sizeof buf, &p);
return (res == 0 && p != 0) ? make_pwstruct(&pw) : nil;
}
@@ -1761,7 +1794,7 @@ static val getpwent_wrap(void)
static val getpwuid_wrap(val uid)
{
- struct passwd *p = getpwuid(c_num(uid));
+ struct passwd *p = getpwuid(c_num(uid, self));
return (p != 0) ? make_pwstruct(p) : nil;
}
@@ -1826,9 +1859,10 @@ static val getgrent_wrap(void)
static val getgrgid_wrap(val uid)
{
+ val self = lit("getgrgid");
char buf[1024];
struct group gr, *g;
- int res = getgrgid_r(c_num(uid), &gr, buf, sizeof buf, &g);
+ int res = getgrgid_r(c_num(uid, self), &gr, buf, sizeof buf, &g);
return (res == 0 && g != 0) ? make_grstruct(&gr) : nil;
}
@@ -1848,7 +1882,7 @@ static val getgrnam_wrap(val wname)
static val getgrgid_wrap(val uid)
{
- struct group *g = getgrgid(c_num(uid));
+ struct group *g = getgrgid(c_num(uid, self));
return (g != 0) ? make_grstruct(g) : nil;
}
@@ -1997,9 +2031,10 @@ int stdio_fseek(FILE *f, val off, int whence)
#if HAVE_FNMATCH
static val fnmatch_wrap(val pattern, val string, val flags)
{
+ val self = lit("fnmatch");
const wchar_t *pattern_ws = c_str(pattern);
const wchar_t *string_ws = c_str(string);
- cnum c_flags = c_num(default_arg(flags, zero));
+ cnum c_flags = c_num(default_arg(flags, zero), self);
char *pattern_u8 = utf8_dup_to(pattern_ws);
char *string_u8 = utf8_dup_to(string_ws);
int res = fnmatch(pattern_u8, string_u8, c_flags);
@@ -2057,10 +2092,11 @@ static struct cobj_ops cptr_dl_ops = cobj_ops_init(cobj_equal_handle_op,
static val dlopen_wrap(val name, val flags)
{
+ val self = lit("dlopen");
const wchar_t *name_ws = if3(null_or_missing_p(name),
0, c_str(name));
char *name_u8 = if3(name_ws != 0, utf8_dup_to(name_ws), 0);
- cnum f = if3(missingp(flags), RTLD_LAZY, c_num(flags));
+ cnum f = if3(missingp(flags), RTLD_LAZY, c_num(flags, self));
mem_t *ptr = coerce(mem_t *, (dlerror(), dlopen(name_u8, f)));
free(name_u8);
if (ptr == 0) {