/* "unix.c" functions only in Unix (unix). * Copyright (C) 1994, 1995 Free Software Foundation, Inc. * * This program 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. * * This program 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 this program. If not, see * . */ /* Author: Aubrey Jaffer */ #include "scm.h" #include #include /* #include */ #include extern SCM stat2scm P((struct stat *stat_temp)); SCM scm_mknod P((SCM path, SCM mode, SCM dev)); SCM scm_acct P((SCM path)); SCM scm_nice P((SCM incr)); SCM scm_sync P((void)); SCM scm_symlink P((SCM oldpath, SCM newpath)); SCM scm_readlink P((SCM path)); SCM scm_lstat P((SCM str)); #ifndef STDC_HEADERS void sync P((void)); int symlink P((const char *oldpath, const char *newpath)); int readlink P((const char *path, char *buf, sizet bufsiz)); int acct P((const char *filename)); int nice P((int inc)); #else /* added by Denys Duchier: for acct, etc... */ # ifdef SVR4 # include # endif # ifdef __NetBSD__ # include # endif # ifdef __OpenBSD__ # include # endif #endif /* STDC_HEADERS */ /* Only the superuser can successfully execute mknod and acct */ /* int mknod P((const char *path, mode_t mode, dev_t dev)); should be in stat.h */ static char s_mknod[] = "mknod"; SCM scm_mknod(path, mode, dev) SCM path, mode, dev; { int val; ASRTER(NIMP(path) && STRINGP(path), path, ARG1, s_mknod); ASRTER(INUMP(mode), mode, ARG2, s_mknod); ASRTER(INUMP(dev), dev, ARG3, s_mknod); SYSCALL(val = mknod(CHARS(path), INUM(mode), INUM(dev));); return val ? BOOL_F : BOOL_T; } static char s_acct[] = "acct"; SCM scm_acct(path) SCM path; { int val; if (FALSEP(path)) { SYSCALL(val = acct(0);); return val ? BOOL_F : BOOL_T; } ASRTER(NIMP(path) && STRINGP(path), path, ARG1, s_acct); SYSCALL(val = acct(CHARS(path));); return val ? BOOL_F : BOOL_T; } static char s_nice[] = "nice"; SCM scm_nice(incr) SCM incr; { ASRTER(INUMP(incr), incr, ARG1, s_nice); return nice(INUM(incr)) ? BOOL_F : BOOL_T; } SCM scm_sync() { sync(); return UNSPECIFIED; } static char s_symlink[] = "symlink"; SCM scm_symlink(oldpath, newpath) SCM oldpath, newpath; { int val; ASRTER(NIMP(oldpath) && STRINGP(oldpath), oldpath, ARG1, s_symlink); ASRTER(NIMP(newpath) && STRINGP(newpath), newpath, ARG2, s_symlink); SYSCALL(val = symlink(CHARS(oldpath), CHARS(newpath));); return val ? BOOL_F : BOOL_T; } static char s_readlink[] = "readlink"; SCM scm_readlink(path) SCM path; { int i; char buf[1024]; ASRTER(NIMP(path) && STRINGP(path), path, ARG1, s_readlink); SYSCALL(i = readlink(CHARS(path), buf, (sizet)sizeof(buf));); if (-1==i) return BOOL_F; return makfromstr(buf, (sizet)i); } static char s_lstat[] = "lstat"; SCM scm_lstat(str) SCM str; { int i; struct stat stat_temp; ASRTER(NIMP(str) && STRINGP(str), str, ARG1, s_lstat); SYSCALL(i = lstat(CHARS(str), &stat_temp);); if (i) return BOOL_F; return stat2scm(&stat_temp); } static iproc subr1s[] = { {s_nice, scm_nice}, {s_acct, scm_acct}, {s_lstat, scm_lstat}, {s_readlink, scm_readlink}, {0, 0}}; void init_unix() { make_subr("sync", tc7_subr_0, scm_sync); init_iprocs(subr1s, tc7_subr_1); make_subr(s_symlink, tc7_subr_2, scm_symlink); make_subr(s_mknod, tc7_subr_3, scm_mknod); add_feature("unix"); }