#define OPEN 5
#define CLOSE 6
#define WAIT 7
-#define CREAT 8
#define LINK 9
#define UNLINK 10
#define WAITPID 11
#define CHMOD 15
#define CHOWN 16
#define BRK 17
-#define PREV_STAT 18
#define LSEEK 19
#define MINIX_GETPID 20
#define MOUNT 21
#define STIME 25
#define PTRACE 26
#define ALARM 27
-#define PREV_FSTAT 28
#define PAUSE 29
#define UTIME 30
#define GETEPINFO 31
#define RENAME 38
#define MKDIR 39
#define RMDIR 40
-#define DUP 41
#define PIPE 42
#define TIMES 43
#define SYMLINK 45
#define GETGID 47
#define SIGNAL 48
#define RDLNK 49
-#define PREV_LSTAT 50
#define STAT 51
#define FSTAT 52
#define LSTAT 53
#define SETSID 62
#define GETPGRP 63
#define ITIMER 64
-#define GETGROUPS_O 65
-#define SETGROUPS_O 66
#define GETMCONTEXT 67
#define SETMCONTEXT 68
gid_t vu_sgroups[NGROUPS_MAX];
} vfs_ucred_t;
-#define NGROUPS_MAX_OLD 8
-/* User credential structure before increasing
- * uid_t and gid_t u8_t */
-typedef struct {
- short vu_uid;
- char vu_gid;
- int vu_ngroups;
- char vu_sgroups[NGROUPS_MAX_OLD];
-} vfs_ucred_old_t;
-
/* Request numbers */
#define REQ_GETNODE (VFS_BASE + 1) /* Should be removed */
#define REQ_PUTNODE (VFS_BASE + 2)
#define NWIOSUDSCONN _IOW ('n', 74, struct sockaddr_un) /* connect() */
#define NWIOSUDSSHUT _IOW ('n', 75, int) /* shutdown() */
#define NWIOSUDSPAIR _IOW ('n', 76, dev_t) /* socketpair() */
-#define NWIOSUDSPAIROLD _IOW ('n', 76, short) /* socketpair() */
#define NWIOSUDSACCEPT _IOW ('n', 77, struct sockaddr_un) /* accept() */
#define NWIOSUDSCTRL _IOW ('n', 78, struct msg_control) /* sendmsg() */
#define NWIOGUDSCTRL _IORW('n', 79, struct msg_control) /* recvmsg() */
/* setsockopt/setsockopt for unix domain sockets */
#define NWIOGUDSSOTYPE _IOR('n', 90, int) /* SO_TYPE */
#define NWIOGUDSPEERCRED _IOR('n', 91, struct ucred) /* SO_PEERCRED */
-#define NWIOGUDSPEERCREDOLD _IOR('n', 91, struct ucred_old) /* SO_PEERCRED */
#define NWIOGUDSSNDBUF _IOR('n', 92, size_t) /* SO_SNDBUF */
#define NWIOSUDSSNDBUF _IOW('n', 93, size_t) /* SO_SNDBUF */
#define NWIOGUDSRCVBUF _IOR('n', 94, size_t) /* SO_RCVBUF */
#include <sys/stat.h>
#include <string.h>
-/* XXX until that st_Xtime macroses used, we have to undefine them,
- * because of minix_prev_stat
- */
-#undef st_atime
-#undef st_ctime
-#undef st_mtime
-
-static void prev_stat2new_stat(struct stat *new, struct minix_prev_stat *prev)
-{
- /* Copy field by field because of st_gid type mismath and
- * difference in order after atime.
- */
- new->st_dev = prev->st_dev;
- new->st_ino = prev->st_ino;
- new->st_mode = prev->st_mode;
- new->st_nlink = prev->st_nlink;
- new->st_uid = prev->st_uid;
- new->st_gid = prev->st_gid;
- new->st_rdev = prev->st_rdev;
- new->st_size = prev->st_size;
- new->st_atimespec.tv_sec = prev->st_atime;
- new->st_mtimespec.tv_sec = prev->st_mtime;
- new->st_ctimespec.tv_sec = prev->st_ctime;
-}
-
int _stat(const char *name, struct stat *buffer);
int _lstat(const char *name, struct stat *buffer);
int _fstat(int fd, struct stat *buffer);
int stat(const char *name, struct stat *buffer)
{
message m;
- int r;
- struct minix_prev_stat old_sb;
m.m1_i1 = strlen(name) + 1;
m.m1_p1 = (char *) __UNCONST(name);
m.m1_p2 = (char *) buffer;
- if((r = _syscall(VFS_PROC_NR, STAT, &m)) >= 0 || errno != ENOSYS)
- return r;
-
- errno = 0;
-
- /* ENOSYS: new binary and old VFS, fallback to PREV_STAT.
- * User has struct stat (buffer), VFS still fills minix_prev_stat.
- */
- m.m1_i1 = strlen(name) + 1;
- m.m1_p1 = (char *) __UNCONST(name);
- m.m1_p2 = (char *) &old_sb;
-
- if((r = _syscall(VFS_PROC_NR, PREV_STAT, &m)) < 0)
- return r;
-
- memset(buffer, 0, sizeof(struct stat));
- prev_stat2new_stat(buffer, &old_sb);
-
- return r;
+ return _syscall(VFS_PROC_NR, STAT, &m);
}
int _fstat(int fd, struct stat *buffer) { return fstat(fd, buffer); }
int fstat(int fd, struct stat *buffer)
{
message m;
- int r;
- struct minix_prev_stat old_sb;
m.m1_i1 = fd;
m.m1_p1 = (char *) buffer;
- if((r = _syscall(VFS_PROC_NR, FSTAT, &m)) >= 0 || errno != ENOSYS)
- return r;
-
- errno = 0;
-
- /* ENOSYS: new binary and old VFS, fallback to PREV_STAT.
- * User has struct stat (buffer), VFS still fills minix_prev_stat.
- */
- m.m1_i1 = fd;
- m.m1_p1 = (char *) &old_sb;
-
- if((r = _syscall(VFS_PROC_NR, PREV_FSTAT, &m)) < 0)
- return r;
-
- memset(buffer, 0, sizeof(struct stat));
- prev_stat2new_stat(buffer, &old_sb);
-
- return r;
+ return _syscall(VFS_PROC_NR, FSTAT, &m);
}
int _lstat(const char *name, struct stat *buffer) { return lstat(name, buffer); }
int lstat(const char *name, struct stat *buffer)
{
message m;
- int r;
- struct minix_prev_stat old_sb;
m.m1_i1 = strlen(name) + 1;
m.m1_p1 = (char *) __UNCONST(name);
m.m1_p2 = (char *) buffer;
- if((r = _syscall(VFS_PROC_NR, LSTAT, &m)) >= 0 || errno != ENOSYS)
- return r;
-
- errno = 0;
-
- /* ENOSYS: new binary and old VFS, fallback to PREV_STAT.
- * User has struct stat (buffer), VFS still fills minix_prev_stat.
- */
- m.m1_i1 = strlen(name) + 1;
- m.m1_p1 = (char *) __UNCONST(name);
- m.m1_p2 = (char *) &old_sb;
-
- if((r = _syscall(VFS_PROC_NR, PREV_LSTAT, &m)) < 0)
- return r;
-
- memset(buffer, 0, sizeof(struct stat));
- prev_stat2new_stat(buffer, &old_sb);
-
- return r;
+ return _syscall(VFS_PROC_NR, LSTAT, &m);
}
int fs_lookup_credentials(vfs_ucred_t *credentials,
uid_t *caller_uid, gid_t *caller_gid, cp_grant_id_t grant2, size_t cred_size)
{
- vfs_ucred_old_t old_cred;
int r;
memset(credentials, 0, sizeof(*credentials));
- if(cred_size == sizeof(*credentials)) {
- r = sys_safecopyfrom(VFS_PROC_NR, grant2, (vir_bytes) 0,
- (vir_bytes) credentials, cred_size);
- if (r != OK) {
- printf("FS: cred copy (regular) failed.\n");
- return(r);
- }
- } else if(cred_size == sizeof(old_cred)) {
- int g;
- r = sys_safecopyfrom(VFS_PROC_NR, grant2, (vir_bytes) 0,
- (vir_bytes) &old_cred, sizeof(old_cred));
- if (r != OK) {
- printf("FS: cred copy (fallback) failed.\n");
- return(r);
- }
- credentials->vu_ngroups = old_cred.vu_ngroups;
- credentials->vu_uid = old_cred.vu_uid;
- credentials->vu_gid = old_cred.vu_gid;
- for(g = 0; g < NGROUPS_MAX_OLD; g++) {
- assert(g < NGROUPS_MAX);
- credentials->vu_sgroups[g] = old_cred.vu_sgroups[g];
- }
- } else {
- static int w = 0;
- if(!w) { printf("FS: cred size incompatible with VFS.\n"); w = 1; }
- return(EINVAL); /* Wrong size. */
+ r = sys_safecopyfrom(VFS_PROC_NR, grant2, (vir_bytes) 0,
+ (vir_bytes) credentials, cred_size);
+ if (r != OK) {
+ printf("FS: cred copy failed\n");
+ return(r);
}
- assert(credentials->vu_ngroups <= NGROUPS_MAX);
+ assert(credentials->vu_ngroups <= NGROUPS_MAX);
- *caller_uid = credentials->vu_uid;
- *caller_gid = credentials->vu_gid;
+ *caller_uid = credentials->vu_uid;
+ *caller_gid = credentials->vu_gid;
- return OK;
+ return OK;
}
break;
- case NWIOSUDSPAIROLD:
-
- /* connect two sockets -- socketpair() */
- rc = do_socketpair_old(dev_m_in, dev_m_out);
-
- break;
-
case NWIOGUDSSOTYPE:
/* get socket type -- getsockopt(SO_TYPE) */
break;
- case NWIOGUDSPEERCREDOLD:
-
- /* get peer endpoint -- getsockopt(SO_PEERCRED) */
- rc = do_getsockopt_peercred_old(dev_m_in, dev_m_out);
-
- break;
-
case NWIOSUDSTADDR:
/* set target address -- sendto() */
int do_getpeername(message *dev_m_in, message *dev_m_out);
int do_shutdown(message *dev_m_in, message *dev_m_out);
int do_socketpair(message *dev_m_in, message *dev_m_out);
-int do_socketpair_old(message *dev_m_in, message *dev_m_out);
int do_getsockopt_sotype(message *dev_m_in, message *dev_m_out);
int do_getsockopt_peercred(message *dev_m_in, message *dev_m_out);
-int do_getsockopt_peercred_old(message *dev_m_in, message *dev_m_out);
int do_getsockopt_sndbuf(message *dev_m_in, message *dev_m_out);
int do_setsockopt_sndbuf(message *dev_m_in, message *dev_m_out);
int do_getsockopt_rcvbuf(message *dev_m_in, message *dev_m_out);
return OK;
}
-int do_socketpair_old(message *dev_m_in, message *dev_m_out)
-{
- int rc;
- short minorin;
- int minorx, minory;
- struct sockaddr_un addr;
-
-#if DEBUG == 1
- static int call_count = 0;
- printf("(uds) [%d] do_socketpair() call_count=%d\n",
- uds_minor(dev_m_in), ++call_count);
-#endif
-
- /* first ioctl param is the first socket */
- minorx = uds_minor_old(dev_m_in);
-
- /* third ioctl param is the minor number of the second socket */
- rc = sys_safecopyfrom(VFS_PROC_NR, (cp_grant_id_t) dev_m_in->IO_GRANT,
- (vir_bytes) 0, (vir_bytes) &minorin, sizeof(short));
-
- if (rc != OK) {
- return EIO;
- }
-
- minory = minor(minorin);
-
-#if DEBUG == 1
- printf("socketpair() %d - %d\n", minorx, minory);
-#endif
-
- /* security check - both sockets must have the same endpoint (owner) */
- if (uds_fd_table[minorx].owner != uds_fd_table[minory].owner) {
-
- /* we won't allow you to magically connect your socket to
- * someone elses socket
- */
- return EPERM;
- }
-
- addr.sun_family = AF_UNIX;
- addr.sun_path[0] = 'X';
- addr.sun_path[1] = '\0';
-
- uds_fd_table[minorx].syscall_done = 1;
- return perform_connection(dev_m_in, dev_m_out, &addr, minorx, minory);
-}
-
int do_socketpair(message *dev_m_in, message *dev_m_out)
{
int rc;
return rc ? EIO : OK;
}
-int do_getsockopt_peercred_old(message *dev_m_in, message *dev_m_out)
-{
- int minor;
- int peer_minor;
- int rc;
- struct ucred cred;
- struct ucred_old cred_old;
-
-#if DEBUG == 1
- static int call_count = 0;
- printf("(uds) [%d] do_getsockopt_peercred() call_count=%d\n",
- uds_minor(dev_m_in), ++call_count);
-#endif
-
- minor = uds_minor(dev_m_in);
-
- if (uds_fd_table[minor].peer == -1) {
-
- if (uds_fd_table[minor].err == ECONNRESET) {
- uds_fd_table[minor].err = 0;
-
- return ECONNRESET;
- } else {
- return ENOTCONN;
- }
- }
-
- peer_minor = uds_fd_table[minor].peer;
-
- /* obtain the peer's credentials */
- rc = getnucred(uds_fd_table[peer_minor].owner, &cred);
- if (rc == -1) {
- /* likely error: invalid endpoint / proc doesn't exist */
- return errno;
- }
-
- /* copy to old structure */
- cred_old.pid = cred.pid;
- cred_old.uid = (short) cred.uid;
- cred_old.gid = (char) cred.gid;
-
- rc = sys_safecopyto(VFS_PROC_NR, (cp_grant_id_t) dev_m_in->IO_GRANT,
- (vir_bytes) 0, (vir_bytes) &cred_old, sizeof(struct ucred_old));
-
- return rc ? EIO : OK;
-}
-
int do_getsockopt_sndbuf(message *dev_m_in, message *dev_m_out)
{
int rc;
* Take message m and get the index in uds_fd_table.
*/
#define uds_minor(m) (minor((dev_t) m->DEVICE))
-#define uds_minor_old(m) (minor((short) m->DEVICE))
/*
* Fill in a reply message.
*===========================================================================*/
int do_get()
{
-/* Handle GETUID, GETGID, GETGROUPS, GETGROUPS_O, GETPID, GETPGRP, GETSID,
+/* Handle GETUID, GETGID, GETGROUPS, MINIX_GETPID, GETPGRP, GETSID,
ISSETUGID.
*/
register struct mproc *rmp = mp;
int r, i;
int ngroups;
- char sgroups[NGROUPS_MAX]; /* XXX: Temp storage for GETGROUPS_O */
switch(call_nr) {
- case GETGROUPS_O:
- ngroups = m_in.grp_no;
- if (ngroups > NGROUPS_MAX || ngroups < 0)
- return(EINVAL);
-
- if (ngroups == 0) {
- r = rmp->mp_ngroups;
- break;
- }
-
- if (ngroups < rmp->mp_ngroups)
- /* Asking for less groups than available */
- return(EINVAL);
-
- for (i = 0; i < ngroups; i++)
- sgroups[i] = (char) rmp->mp_sgroups[i];
-
- r = sys_datacopy(SELF, (vir_bytes) &sgroups, who_e,
- (vir_bytes) m_in.groupsp, ngroups * sizeof(char));
-
- if (r != OK)
- return(r);
-
- r = rmp->mp_ngroups;
- break;
case GETGROUPS:
ngroups = m_in.grp_no;
if (ngroups > NGROUPS_MAX || ngroups < 0)
*===========================================================================*/
int do_set()
{
-/* Handle SETUID, SETEUID, SETGID, SETEGID, SETSID. These calls have in common
- * that, if successful, they will be forwarded to VFS as well.
+/* Handle SETUID, SETEUID, SETGID, SETGROUPS, SETEGID, and SETSID. These calls
+ * have in common that, if successful, they will be forwarded to VFS as well.
*/
register struct mproc *rmp = mp;
message m;
int r, i;
int ngroups;
- char sgroups[NGROUPS_MAX]; /* XXX: Temp storage for SETGROUPS_O */
-
switch(call_nr) {
case SETUID:
m.PM_GROUP_NO = rmp->mp_ngroups;
m.PM_GROUP_ADDR = (char *) rmp->mp_sgroups;
- break;
- case SETGROUPS_O:
- if (rmp->mp_effuid != SUPER_USER)
- return(EPERM);
-
- ngroups = m_in.grp_no;
-
- if (ngroups > NGROUPS_MAX || ngroups < 0)
- return(EINVAL);
-
- if (m_in.groupsp == NULL)
- return(EFAULT);
-
- r = sys_datacopy(who_e, (vir_bytes) m_in.groupsp, SELF,
- (vir_bytes) &sgroups, ngroups * sizeof(char));
- if (r != OK)
- return(r);
-
- for (i = 0; i < ngroups; i++)
- rmp->mp_sgroups[i] = (gid_t) sgroups[i];
- for (i = ngroups; i < NGROUPS_MAX; i++)
- rmp->mp_sgroups[i] = 0;
- rmp->mp_ngroups = ngroups;
-
- m.m_type = PM_SETGROUPS;
- m.PM_PROC = rmp->mp_endpoint;
- m.PM_GROUP_NO = rmp->mp_ngroups;
- m.PM_GROUP_ADDR = (char *) rmp->mp_sgroups;
-
break;
case SETSID:
if (rmp->mp_procgrp == rmp->mp_pid) return(EPERM);
return r;
else
r = req_stat(execi->vp->v_fs_e, execi->vp->v_inode_nr,
- VFS_PROC_NR, (vir_bytes) &(execi->sb), 0);
+ VFS_PROC_NR, (vir_bytes) &(execi->sb));
if (r != OK) return r;
* that are mostly performed by the Memory Manager.
*
* The entry points into this file are
- * do_dup: perform the DUP system call
* do_fcntl: perform the FCNTL system call
* do_sync: perform the SYNC system call
* do_fsync: perform the FSYNC system call
return sys_datacopy(SELF, src_addr, who_e, dst_addr, len);
}
-/*===========================================================================*
- * do_dup *
- *===========================================================================*/
-int do_dup()
-{
-/* Perform the dup(fd) or dup2(fd,fd2) system call. These system calls are
- * obsolete. In fact, it is not even possible to invoke them using the
- * current library because the library routines call fcntl(). They are
- * provided to permit old binary programs to continue to run.
- */
-
- int rfd, rfd2;
- struct filp *f;
- int r = OK;
-
- scratch(fp).file.fd_nr = job_m_in.fd;
- rfd2 = job_m_in.fd2;
-
- /* Is the file descriptor valid? */
- rfd = scratch(fp).file.fd_nr & ~DUP_MASK; /* kill off dup2 bit, if on */
- if ((f = get_filp(rfd, VNODE_READ)) == NULL) return(err_code);
-
- /* Distinguish between dup and dup2. */
- if (!(scratch(fp).file.fd_nr & DUP_MASK)) { /* bit not on */
- /* dup(fd) */
- r = get_fd(0, 0, &rfd2, NULL);
- } else {
- /* dup2(old_fd, new_fd) */
- if (rfd2 < 0 || rfd2 >= OPEN_MAX) {
- r = EBADF;
- } else if (rfd == rfd2) { /* ignore the call: dup2(x, x) */
- r = rfd2;
- } else {
- /* All is fine, close new_fd if necessary */
- unlock_filp(f); /* or it might deadlock on do_close */
- (void) close_fd(fp, rfd2); /* cannot fail */
- f = get_filp(rfd, VNODE_READ); /* lock old_fd again */
- if (f == NULL) return(err_code);
- }
- }
-
- if (r == OK) {
- /* Success. Set up new file descriptors. */
- f->filp_count++;
- fp->fp_filp[rfd2] = f;
- FD_SET(rfd2, &fp->fp_filp_inuse);
- r = rfd2;
- }
-
- unlock_filp(f);
- return(r);
-}
-
/*===========================================================================*
* do_fcntl *
*===========================================================================*/
* seeking on files.
*
* The entry points into this file are
- * do_creat: perform the CREAT system call
* do_open: perform the OPEN system call
* do_mknod: perform the MKNOD system call
* do_mkdir: perform the MKDIR system call
mode_t bits);
static int pipe_open(struct vnode *vp, mode_t bits, int oflags);
-
-/*===========================================================================*
- * do_creat *
- *===========================================================================*/
-int do_creat()
-{
-/* Perform the creat(name, mode) system call.
- * syscall might provide 'name' embedded in the message.
- */
-
- char fullpath[PATH_MAX];
- vir_bytes vname;
- size_t vname_length;
- mode_t open_mode;
-
- vname = (vir_bytes) job_m_in.name;
- vname_length = (size_t) job_m_in.name_length;
- open_mode = (mode_t) job_m_in.mode;
-
- if (copy_name(vname_length, fullpath) != OK) {
- /* Direct copy failed, try fetching from user space */
- if (fetch_name(vname, vname_length, fullpath) != OK)
- return(err_code);
- }
-
- return common_open(fullpath, O_WRONLY | O_CREAT | O_TRUNC, open_mode);
-}
-
/*===========================================================================*
* do_open *
*===========================================================================*/
}
} else if (susp_count > 0) { /* revive blocked processes */
release(vp, OPEN, susp_count);
- release(vp, CREAT, susp_count);
}
return(OK);
}
*===========================================================================*/
void release(vp, op, count)
register struct vnode *vp; /* inode of pipe */
-int op; /* READ, WRITE, OPEN or CREAT */
+int op; /* READ, WRITE, or OPEN */
int count; /* max number of processes to release */
{
/* Check to see if any process is hanging on vnode 'vp'. If one is, and it
void unlock_proc(struct fproc *rfp);
/* misc.c */
-int do_dup(void);
void pm_exit(int proc);
int do_fcntl(void);
void pm_fork(int pproc, int cproc, int cpid);
int req_rmdir(endpoint_t fs_e, ino_t inode_nr, char *lastc);
int req_slink(endpoint_t fs_e, ino_t inode_nr, char *lastc, endpoint_t proc_e,
vir_bytes path_addr, size_t path_length, uid_t uid, gid_t gid);
-int req_stat(endpoint_t fs_e, ino_t inode_nr, endpoint_t proc_e, vir_bytes buf,
- int old_stat);
+int req_stat(endpoint_t fs_e, ino_t inode_nr, endpoint_t proc_e, vir_bytes buf);
int req_sync(endpoint_t fs_e);
int req_unlink(endpoint_t fs_e, ino_t inode_nr, char *lastc);
int req_unmount(endpoint_t fs_e);
/*===========================================================================*
* req_stat *
*===========================================================================*/
-int req_stat(endpoint_t fs_e, ino_t inode_nr, endpoint_t proc_e, vir_bytes buf,
- int old_stat)
+int req_stat(endpoint_t fs_e, ino_t inode_nr, endpoint_t proc_e, vir_bytes buf)
{
cp_grant_id_t grant_id;
int r;
message m;
- struct stat sb;
- struct minix_prev_stat old_sb; /* for backward compatibility */
-
- if (old_stat == 1) {
- /* We're dealing with the old stat() call. First copy stat structure
- * to VFS so we can convert the new struct stat to the old version.
- */
- grant_id = cpf_grant_direct(fs_e, (vir_bytes) &sb, sizeof(struct stat),
- CPF_WRITE);
- } else {
- /* Grant FS access to copy straight into user provided buffer */
- grant_id = cpf_grant_magic(fs_e, proc_e, buf, sizeof(struct stat),
- CPF_WRITE);
- }
+
+ /* Grant FS access to copy straight into user provided buffer */
+ grant_id = cpf_grant_magic(fs_e, proc_e, buf, sizeof(struct stat), CPF_WRITE);
if (grant_id < 0)
panic("req_stat: cpf_grant_* failed");
r = fs_sendrec(fs_e, &m);
cpf_revoke(grant_id);
- if (r != OK || old_stat == 0)
- return(r);
-
-#if defined(_NETBSD_SOURCE)
-#undef st_atime
-#undef st_ctime
-#undef st_mtime
-#endif
-
-/* Copy field by field because of st_gid type mismatch and
- * difference in order after atime.
- */
- old_sb.st_dev = sb.st_dev;
- old_sb.st_ino = sb.st_ino;
- old_sb.st_mode = sb.st_mode;
- old_sb.st_nlink = sb.st_nlink;
- old_sb.st_uid = sb.st_uid;
- old_sb.st_gid = sb.st_gid;
- old_sb.st_rdev = sb.st_rdev;
- old_sb.st_size = sb.st_size;
-#if defined(_NETBSD_SOURCE)
- old_sb.st_atime = sb.st_atimespec.tv_sec;
- old_sb.st_mtime = sb.st_mtimespec.tv_sec;
- old_sb.st_ctime = sb.st_ctimespec.tv_sec;
-#else
- old_sb.st_atime = sb.st_atime;
- old_sb.st_mtime = sb.st_mtime;
- old_sb.st_ctime = sb.st_ctime;
-#endif
-
- r = sys_vircopy(SELF, (vir_bytes) &old_sb, proc_e, buf,
- sizeof(struct minix_prev_stat));
-
return(r);
}
struct vmnt *vmp;
char fullpath[PATH_MAX];
struct lookup resolve;
- int old_stat = 0;
vir_bytes vname1, statbuf;
size_t vname1_length;
resolve.l_vmnt_lock = VMNT_READ;
resolve.l_vnode_lock = VNODE_READ;
- if (job_call_nr == PREV_STAT)
- old_stat = 1;
-
if (fetch_name(vname1, vname1_length, fullpath) != OK) return(err_code);
if ((vp = eat_path(&resolve, fp)) == NULL) return(err_code);
- r = req_stat(vp->v_fs_e, vp->v_inode_nr, who_e, statbuf, old_stat);
+ r = req_stat(vp->v_fs_e, vp->v_inode_nr, who_e, statbuf);
unlock_vnode(vp);
unlock_vmnt(vmp);
{
/* Perform the fstat(fd, buf) system call. */
register struct filp *rfilp;
- int r, old_stat = 0, rfd;
+ int r, rfd;
vir_bytes statbuf;
statbuf = (vir_bytes) job_m_in.buffer;
rfd = job_m_in.fd;
- if (job_call_nr == PREV_FSTAT)
- old_stat = 1;
-
/* Is the file descriptor valid? */
if ((rfilp = get_filp(rfd, VNODE_READ)) == NULL) return(err_code);
r = req_stat(rfilp->filp_vno->v_fs_e, rfilp->filp_vno->v_inode_nr,
- who_e, statbuf, old_stat);
+ who_e, statbuf);
unlock_filp(rfilp);
int r;
char fullpath[PATH_MAX];
struct lookup resolve;
- int old_stat = 0;
vir_bytes vname1, statbuf;
size_t vname1_length;
resolve.l_vmnt_lock = VMNT_READ;
resolve.l_vnode_lock = VNODE_READ;
- if (job_call_nr == PREV_LSTAT)
- old_stat = 1;
if (fetch_name(vname1, vname1_length, fullpath) != OK) return(err_code);
if ((vp = eat_path(&resolve, fp)) == NULL) return(err_code);
- r = req_stat(vp->v_fs_e, vp->v_inode_nr, who_e, statbuf, old_stat);
+ r = req_stat(vp->v_fs_e, vp->v_inode_nr, who_e, statbuf);
unlock_vnode(vp);
unlock_vmnt(vmp);
do_open, /* 5 = open */
do_close, /* 6 = close */
no_sys, /* 7 = wait */
- do_creat, /* 8 = creat */
+ no_sys, /* 8 = unused (was creat) */
do_link, /* 9 = link */
do_unlink, /* 10 = unlink */
no_sys, /* 11 = waitpid */
do_chmod, /* 15 = chmod */
do_chown, /* 16 = chown */
no_sys, /* 17 = break */
- do_stat, /* 18 = stat (prev)*/
+ no_sys, /* 18 = unused (was old stat)*/
do_lseek, /* 19 = lseek */
no_sys, /* 20 = getpid */
do_mount, /* 21 = mount */
no_sys, /* 25 = (stime) */
no_sys, /* 26 = ptrace */
no_sys, /* 27 = alarm */
- do_fstat, /* 28 = fstat (prev)*/
+ no_sys, /* 28 = unused (was old fstat)*/
no_sys, /* 29 = pause */
do_utime, /* 30 = utime */
no_sys, /* 31 = (stty) */
do_rename, /* 38 = rename */
do_mkdir, /* 39 = mkdir */
do_unlink, /* 40 = rmdir */
- do_dup, /* 41 = dup */
+ no_sys, /* 41 = unused (was dup) */
do_pipe, /* 42 = pipe */
no_sys, /* 43 = times */
no_sys, /* 44 = (prof) */
no_sys, /* 47 = getgid */
no_sys, /* 48 = (signal)*/
do_rdlink, /* 49 = readlink*/
- do_lstat, /* 50 = lstat (prev)*/
+ no_sys, /* 50 = unused (was old lstat)*/
do_stat, /* 51 = stat */
do_fstat, /* 52 = fstat */
do_lstat, /* 53 = lstat */
do_stat, /* 65 = stat - badly numbered, being phased out */
do_fstat, /* 66 = fstat - badly numbered, being phased out */
do_lstat, /* 67 = lstat - badly numbered, being phased out */
- no_sys, /* 68 = unused */
+ no_sys, /* 68 = (setmcontext) */
no_sys, /* 69 = unused */
no_sys, /* 70 = unused */
no_sys, /* 71 = (sigaction) */
gid_t gid;
};
-#ifdef __minix
-/* LSC FIXME: Remove this! Compatibility thing, only used in pfs/uds.c */
-struct ucred_old
-{
- pid_t pid;
- short uid;
- char gid;
-};
-#endif /* def __minix */
-
/* Userland's view of credentials. This should not change */
struct uucred {
unsigned short cr_unused; /* not used, compat */