home *** CD-ROM | disk | FTP | other *** search
- Subject: RFS: remote file system (part 4 of 7)
- Newsgroups: mod.sources
- Approved: jpn@panda.UUCP
-
- Mod.sources: Volume 3, Issue 80
- Submitted by: tektronix!tekcrl!toddb
-
- #!/bin/sh
- #
- # RFS, a kernel-resident remote file system. Shar 4 of 7
- #
- #
- # This is a shell archive, meaning:
- # 1. Remove everything above the #!/bin/sh line.
- # 2. Save the resulting text in a file.
- # 3. Execute the file with /bin/sh (not csh) to create the files:
- # remote/serverio.c
- # remote/serversyscall.c
- # remote/shells
- # remote/shells/makemake
- # remote/shells/mkdist
- # remote/shells/mkdist.shar
- # remote/shells/rfs_clean
- # remote/shells/rfs_kerninstall
- # remote/shells/rfs_kernpatch
- # remote/shells/rfs_setup
- # remote/shells/rfs_userpatch
- # remote/usr.include.PYR2.5
- # remote/usr.include.PYR2.5/syscall.h.diff
- # remote/usr.include.VAX4.3
- # remote/usr.include.VAX4.2
- # remote/usr.include.VAX4.2/syscall.h.diff
- # remote/usr.src.lib.libc
- # remote/usr.src.lib.libc/Makefile
- # remote/usr.src.lib.libc/gen
- # remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
- # remote/usr.src.lib.libc/gen/vax.errlst.c.diff
- # remote/usr.src.lib.libc/pyr
- # remote/usr.src.lib.libc/pyr/sys
- # remote/usr.src.lib.libc/pyr/sys/remotename.s
- # remote/usr.src.lib.libc/pyr/sys/remoteoff.s
- # remote/usr.src.lib.libc/pyr/sys/remoteon.s
- # remote/usr.src.lib.libc/vax
- # remote/usr.src.lib.libc/vax/sys
- # remote/usr.src.lib.libc/vax/sys/remotename.c
- # remote/usr.src.lib.libc/vax/sys/remoteoff.c
- # remote/usr.src.lib.libc/vax/sys/remoteon.c
- # remote/usr.sys.PYR2.5
- # remote/usr.sys.PYR2.5/conf
- # remote/usr.sys.PYR2.5/conf/makefromsource.diff
- # remote/usr.sys.PYR2.5/h
- #
- # remote/serverio.c
- #
- if [ -f remote/serverio.c ]; then
- echo -n 'Hit <return> to overwrite remote/serverio.c or ^C to quit'
- read ans
- rm -f remote/serverio.c
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/serverio.c
- X/*
- X * Copyright 1985, Todd Brunhoff.
- X *
- X * This software was written at Tektronix Computer Research Laboratories
- X * as partial fulfillment of a Master's degree at the University of Denver.
- X * This is not Tektronix proprietary software and should not be
- X * confused with any software product sold by Tektronix. No warranty is
- X * expressed or implied on the reliability of this software; the author,
- X * the University of Denver, and Tektronix, inc. accept no liability for
- X * any damage done directly or indirectly by this software. This software
- X * may be copied, modified or used in any way, without fee, provided this
- X * notice remains an unaltered part of the software.
- X *
- X * $Log: serverio.c,v $
- X * Revision 2.0 85/12/07 18:22:33 toddb
- X * First public release.
- X *
- X */
- Xstatic char *rcsid = "$Header: serverio.c,v 2.0 85/12/07 18:22:33 toddb Rel $";
- X#include <errno.h>
- X#include <stdio.h>
- X#include "server.h"
- X#include <sys/uio.h>
- X#include <sys/file.h>
- X#include <netdb.h>
- X#include <signal.h>
- X
- X/*
- X * This routine prepares to recieve a connection from another process.
- X * To be any good it must be followed by a call to tcpaccept().
- X */
- Xextern long errno;
- Xextern short current_pid;
- Xextern char *sys_errlist[],
- X *service,
- X *logfile,
- X *stdlogfile,
- X *getbuf();
- Xextern boolean i_am_gateway;
- Xextern hosts *host;
- Xextern long serviceport,
- X errno;
- Xextern short last_sentry;
- X
- Xint read(),
- X write();
- X
- X/*
- X * Get ready to accept connections.
- X */
- Xtcppassive()
- X{
- X int f;
- X struct sockaddr_in sin;
- X struct servent *servp;
- X
- X if ((servp = getservbyname(service, "tcp")) == NULL)
- X log_fatal("%s: unknown service\n", service);
- X serviceport = servp->s_port;
- X
- X sin.sin_port = serviceport;
- X sin.sin_addr.s_addr = INADDR_ANY;
- X sin.sin_family = AF_INET;
- X
- X f = socket(AF_INET, SOCK_STREAM, 0);
- X setsockopt(f, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
- X setsockopt(f, SOL_SOCKET, SO_REUSEADDR, 0, 0);
- X
- X while (bind(f, (caddr_t)&sin, sizeof (sin)) < 0) {
- X if (last_sentry && errno == EADDRINUSE)
- X {
- X log("shutting down old sentry (pid %d)\n",
- X last_sentry);
- X if (! sendsig(last_sentry, SIGTERM))
- X last_sentry = 0;
- X sleep(2); /* give it time to die */
- X continue;
- X }
- X log("cannot bind %s\n", service);
- X return(-1);
- X }
- X
- X listen(f, 5);
- X return(f);
- X}
- X
- X/*
- X * Here we passively accept a connection from another process.
- X * We return a pointer to the hosts structure. If there is no
- X * corresponding host for a given connection, we make up a new one
- X * and return that.
- X */
- Xhosts *tcpaccept(f)
- X int f;
- X{
- X hosts *h = NULL;
- X struct sockaddr_in sin;
- X int g,
- X i,
- X len = sizeof (struct sockaddr_in);
- X
- X for (i = 0, g = -1; g < 0 && i < 10; i++) {
- X g = accept(f, &sin, &len);
- X if (g < 0)
- X {
- X log("accept failed\n");
- X continue;
- X }
- X
- X /*
- X * Ok, we have recieved a connection. Find out what we
- X * know about this fella, and save the command file descriptor
- X * and the port number.
- X */
- X h = findhostaddr(&sin.sin_addr);
- X h->h_cmdfd = g;
- X h->h_portnum = htons((u_short)sin.sin_port);
- X }
- X
- X return(h);
- X}
- X
- X/*
- X * Call another host's server. We assume that he is using the same service
- X * as we.
- X */
- Xtcpconnect(h)
- X register hosts *h;
- X{
- X struct sockaddr_in sin;
- X register long s;
- X
- X bzero((char *)&sin, sizeof (sin));
- X bcopy(&h->h_addr, (char *)&sin.sin_addr, sizeof(struct in_addr));
- X sin.sin_family = AF_INET;
- X sin.sin_port = serviceport;
- X s = socket(AF_INET, SOCK_STREAM, 0);
- X if (s < 0)
- X {
- X log("can't get socket to remote server\n");
- X return(-1);
- X }
- X
- X /*
- X * time out on connection rather quickly.
- X */
- X alarm(5);
- X if (connect(s, (char *)&sin, sizeof (sin)) < 0) {
- X alarm(0);
- X log("can't connect to server\n");
- X close(s);
- X return(-1);
- X }
- X alarm(0);
- X return(s);
- X}
- X
- Xalarmsig()
- X{
- X log("timeout\n");
- X errno = EINTR;
- X}
- X
- Xlog(x1, x2, x3, x4, x5, x6, x7, x8, x9)
- X{
- X char buf[ BUFSIZ ];
- X register char *p = buf;
- X static boolean printpid = TRUE;
- X
- X *p = '\0';
- X if (printpid)
- X {
- X sprintf(p, "(%d)", current_pid);
- X p += strlen(p);
- X if (errno)
- X {
- X sprintf(p, "%s: ", sys_errlist[ errno ]);
- X p += strlen(p);
- X errno = 0;
- X }
- X }
- X sprintf(p, x1, x2, x3, x4, x5, x6, x7, x8, x9);
- X p += strlen(p);
- X if (*(p-1) == '\n')
- X printpid = TRUE;
- X else
- X printpid = FALSE;
- X write(2, buf, p-buf);
- X}
- X
- Xlog_fatal(x1, x2, x3, x4, x5, x6, x7, x8, x9)
- X{
- X static boolean entered = FALSE;
- X
- X if (! entered)
- X {
- X entered = TRUE;
- X log ("fileserver: FATAL ERROR: ");
- X log (x1, x2, x3, x4, x5, x6, x7, x8, x9);
- X cleanup();
- X }
- X exit (1);
- X}
- X
- X/*
- X * Set up the log file for the current process. If there is no current
- X * host defined, then we are the sentry server and simply use the
- X * standard logfile: this should be done once only. If 'host' is defined,
- X * then set up a logfile for this particular connection.
- X *
- X * The sentry server always puts his signature at the top of the file
- X * (pid number). So as a side effect, the global variable last_sentry
- X * is set to this signature (if there exists one).
- X */
- Xsetlogfile()
- X{
- X char buf[ BUFSIZ ];
- X register char *pbuf = buf;
- X register long newstderr;
- X boolean sentry = FALSE;
- X FILE *fd;
- X
- X if (logfile)
- X free (logfile);
- X if (host == NULL)
- X {
- X sentry = TRUE;
- X strcpy(pbuf, stdlogfile);
- X }
- X else
- X sprintf(pbuf, "%s.%s.%d",
- X stdlogfile, host->h_names[0], current_pid);
- X logfile = malloc(strlen(pbuf)+1);
- X strcpy(logfile, pbuf);
- X
- X /*
- X * Get the previous signature.
- X */
- X if (sentry)
- X {
- X if ((fd = fopen(logfile, "r")) != NULL)
- X {
- X *pbuf = '\0';
- X fgets(pbuf, BUFSIZ, fd);
- X last_sentry = atoi(pbuf+1);
- X fclose(fd);
- X }
- X }
- X
- X newstderr = open(logfile, O_RDWR|O_APPEND|O_CREAT|O_TRUNC, 0444);
- X if (newstderr < 0)
- X log_fatal("cannot reopen stderr\n");
- X dup2(newstderr, 2);
- X close(newstderr);
- X log("startup.\n"); /* put down our signature. */
- X}
- X
- Xcleanup()
- X{
- X register process *proc;
- X
- X if (i_am_gateway && host)
- X for (proc=host->h_proclist; proc; proc=proc->p_next)
- X if (proc->p_handler != current_pid)
- X sendsig(proc->p_handler, SIGKILL);
- X mourne();
- X}
- X
- Xsndmsg(fd, msg, msglen, data, len)
- X register struct message *msg;
- X register char *data;
- X register int fd, msglen, len;
- X{
- X register int num;
- X struct iovec iov[2];
- X
- X
- X showmsg(msg, TRUE);
- X /*
- X * set up for the write and if there is any data to send, try to send
- X * a bunch of it.
- X */
- X if (len > 0 && data)
- X {
- X iov[0].iov_base = (char *)msg;
- X iov[0].iov_len = msglen;
- X iov[1].iov_base = data;
- X iov[1].iov_len = len;
- X if ((num = writev(fd, iov, 2)) == len + msglen)
- X {
- X debug8("wrote data and msg (%d)!!\n", len + msglen);
- X return(TRUE);
- X }
- X debug8("wrote %d of %d msg + data\n", num, len+msglen);
- X if (num < 0)
- X return(FALSE);
- X if (_rmtio(write, fd, data+num, len-num) <= 0)
- X return(FALSE);
- X }
- X else if (_rmtio(write, fd, msg, msglen) <= 0)
- X return(FALSE);
- X return(TRUE);
- X}
- X
- X/*
- X * Read the next message. Its format is null-separated hex-ascii strings.
- X * In order, they are:
- X * total_length length of this request
- X * header_length length of the message request (minus length of data)
- X * pid Process id on requesting machine
- X * uid user id of process on requesting machine
- X * syscall our internal syscall number
- X * args... between 0 and ?
- X *
- X * Followed by actual data (if any). We grab the first two fields, and
- X * use them for making sure we read all that is necessary. The remainder
- X * are returned in a array of character pointers. It there is any data
- X * in this request, then it is pointed to by the last character pointer.
- X *
- X * The way that we read messages is as follows:
- X *
- X * last message length = 0
- X * while no more messages
- X * do
- X * if last message length > 0
- X * gobbleup last message length bytes
- X * peek at next message
- X * if this message is for another process
- X * then
- X * wake up the other process
- X * last message length = 0
- X * go to sleep
- X * continue
- X * endif
- X * if data in this message
- X * then
- X * read the message
- X * last message length = 0
- X * else
- X * last message length = length of this message
- X * endif
- X * service request
- X * done
- X */
- X
- Xstruct message *getmsg(fd)
- X register long fd;
- X{
- X register long cnt,
- X lastcnt = 0,
- X len;
- X register struct message *msg;
- X
- X msg = (struct message *)getbuf(BIGBUF);
- X /*
- X * Check to see if there is a message still in the queue, that has
- X * been processed, but not yet read.
- X */
- X gobble_last_msg(fd, msg);
- X for (;;)
- X {
- X debug8("peek at fd %d... ", fd);
- X cnt = recv(fd, (char *)msg, BIGBUF, MSG_PEEK);
- X if (cnt < R_MINRMSG)
- X {
- X if (cnt < 0 && errno == EINTR)
- X continue;
- X debug8("eof, cnt=%d\n", cnt);
- X return(NULL);
- X }
- X debug8("got %d from peek\n", cnt);
- X
- X /*
- X * Now find out how long the request is (excluding data)
- X * and make sure that we have at least that amount.
- X */
- X#ifdef magnolia
- X len = msg->m_hdlen;
- X#else /* magnolias don't need to do this garbage (MC68000) */
- X msg->m_totlen = ntohl(msg->m_totlen);
- X len = msg->m_hdlen = ntohs(msg->m_hdlen);
- X msg->m_pid = ntohs(msg->m_pid);
- X msg->m_uid = ntohs(msg->m_uid);
- X msg->m_syscall = ntohs(msg->m_syscall);
- X msg->m_args[0] = ntohl(msg->m_args[0]);
- X msg->m_args[1] = ntohl(msg->m_args[1]);
- X msg->m_args[2] = ntohl(msg->m_args[2]);
- X msg->m_args[3] = ntohl(msg->m_args[3]);
- X#endif
- X if (len > cnt)
- X {
- X if (cnt == lastcnt)
- X {
- X log("most but not all of message is in\n");
- X dumpmsg(msg, cnt);
- X return(NULL);
- X }
- X else
- X debug8("didn't get all of message headder\n");
- X lastcnt = cnt;
- X sleep(5);
- X }
- X else if (len < R_MINRMSG)
- X {
- X log("bad soft msg len=%d, got %d\n", len, cnt);
- X dumpmsg(msg, cnt);
- X if (i_am_gateway)
- X log_fatal("");
- X say_something(S_CORRUPTED, 0);
- X sendsig(current_pid, SIGSTOP);
- X }
- X else
- X break;
- X }
- X showmsg(msg, FALSE);
- X return(msg);
- X}
- X
- X/*
- X * Here we format the response to be sent to the client. Note that
- X * the client can never tolerate a message shorter than
- X * R_MINRMSG + sizeof(long). The declaration of x0-xf is for the
- X * sake of stupid Pyramid argument conventions.
- X */
- Xsendreturn(proc, fd, data, cnt,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)
- X process *proc;
- X register long cnt;
- X register char *data;
- X long fd;
- X{
- X char buf[ BUFSIZ ];
- X struct message msgbuf;
- X register struct message *msg = &msgbuf;
- X register *argp = &x0, msglen, i;
- X
- X msg->m_errno = htons(proc->p_errno);
- X msg->m_pid = htons(proc->p_pid);
- X msg->m_uid = htons(proc->p_uid);
- X if (proc->p_errno > 0) /* -1 is valid errno: says its a local file */
- X {
- X msglen = R_MINRMSG + sizeof(long);
- X msg->m_totlen = htonl(msglen);
- X proc->p_returnval = -1;
- X }
- X else
- X {
- X msglen = R_MINRMSG + (cnt+1)*sizeof(long);
- X if (data)
- X msg->m_totlen = htonl(msglen + proc->p_returnval);
- X else
- X msg->m_totlen = htonl(msglen);
- X#ifdef pyr /* Pyramid */
- X msg->m_args[ R_RETVAL+1 ] = htonl(x0);
- X msg->m_args[ R_RETVAL+2 ] = htonl(x1);
- X msg->m_args[ R_RETVAL+3 ] = htonl(x2);
- X msg->m_args[ R_RETVAL+4 ] = htonl(x3);
- X msg->m_args[ R_RETVAL+5 ] = htonl(x4);
- X msg->m_args[ R_RETVAL+6 ] = htonl(x5);
- X msg->m_args[ R_RETVAL+7 ] = htonl(x6);
- X msg->m_args[ R_RETVAL+8 ] = htonl(x7);
- X msg->m_args[ R_RETVAL+9 ] = htonl(x8);
- X msg->m_args[ R_RETVAL+10 ] = htonl(x9);
- X msg->m_args[ R_RETVAL+11 ] = htonl(xa);
- X msg->m_args[ R_RETVAL+12 ] = htonl(xb);
- X msg->m_args[ R_RETVAL+13 ] = htonl(xc);
- X msg->m_args[ R_RETVAL+14 ] = htonl(xd);
- X msg->m_args[ R_RETVAL+15 ] = htonl(xe);
- X msg->m_args[ R_RETVAL+16 ] = htonl(xf);
- X#else pyr
- X for (i=0; i<cnt; i++)
- X msg->m_args[ R_RETVAL+1+i ] = htonl(argp[ i ]);
- X#endif
- X }
- X msg->m_args[ R_RETVAL ] = htonl(proc->p_returnval);
- X msg->m_hdlen = htons(msglen);
- X sndmsg(fd, msg, msglen, data, proc->p_returnval);
- X errno = 0;
- X}
- X
- X_shutdown(fd)
- X int fd;
- X{
- X log("shutdown fd %d\n", fd);
- X close(fd);
- X}
- X
- Xchar *getbuf(size)
- X{
- X static char *buf, *calloc(), *realloc();
- X static int cursize;
- X static int highwater;
- X
- X if (size > highwater)
- X {
- X if (buf == NULL)
- X buf = calloc(cursize = size, sizeof(char));
- X else
- X {
- X buf = realloc(buf, highwater = size);
- X debug8("resize buffer to %d\n", size);
- X }
- X highwater = size;
- X if (buf == NULL)
- X log_fatal("cannot allocate buffer space\n");
- X }
- X return(buf);
- X}
- X
- Xchar *get_data_buf(size)
- X{
- X static char *buf, *malloc(), *realloc();
- X static int cursize;
- X static int highwater;
- X
- X if (size > highwater)
- X {
- X if (buf == NULL)
- X buf = malloc(cursize = size);
- X else
- X {
- X buf = realloc(buf, highwater = size);
- X debug8("resize data buffer to %d\n", size);
- X }
- X highwater = size;
- X if (buf == NULL)
- X log_fatal("cannot allocate data buffer space\n");
- X }
- X return(buf);
- X}
- X
- Xgobble_last_msg(fd, msg)
- X register long fd;
- X register struct message *msg;
- X{
- X if (msg->m_totlen)
- X {
- X debug8("gobble up last %d byte message... ", msg->m_totlen);
- X _rmtio(read, fd, msg, msg->m_totlen);
- X msg->m_totlen = 0;
- X }
- X}
- X
- X_rmtio(iofunc, fd, buf, len)
- X register func iofunc;
- X register int fd, len;
- X register char *buf;
- X{
- X register int cnt, need = len;
- X
- X debug8("io %d bytes, fd=%d...", len, fd);
- X while(need)
- X {
- X if ((cnt = (*iofunc)(fd, buf+len-need, need)) <= 0)
- X {
- X _shutdown(fd);
- X return(cnt);
- X }
- X need -= cnt;
- X }
- X debug8("did %d.\n", len - need);
- X return(len);
- X}
- X
- X_rmtiov(iofunc, fd, iovec, len)
- X register func iofunc;
- X register int fd, len;
- X register struct iovec *iovec;
- X{
- X
- X debug8("io %d vectors, fd=%d...", len, fd);
- X if ((len = (*iofunc)(fd, iovec, len)) <= 0)
- X _shutdown(fd);
- X debug8("did %d.\n", len);
- X return(len);
- X}
- X
- X/*
- X * Show the message in characters and hex.
- X */
- Xdumpmsg(msg, len)
- X char *msg;
- X long len;
- X{
- X char string[ 100 ], *pstring = string,
- X words[ 100 ], *pwords = words,
- X dwords[ 100 ], *pdwords = dwords,
- X longs[ 100 ], *plongs = longs,
- X *p;
- X long cnt = 0;
- X
- X for(p = msg; cnt<len; cnt++, p++)
- X {
- X /* character */
- X if (*p >= ' ')
- X sprintf(pstring, "%c ", *p > '~' ? '?' : *p);
- X else
- X sprintf(pstring, "^%c ", *p | 0x40);
- X pstring += 3;
- X if ((cnt & 0x1) == 0)
- X {
- X sprintf(pwords, "%-4.4x ",
- X *((unsigned short *)p));
- X sprintf(pdwords, "%-5.5d ",
- X *((unsigned short *)p));
- X pwords += 6;
- X pdwords += 6;
- X }
- X if ((cnt & 0x3) == 0)
- X {
- X sprintf(plongs, "%-8.8x ", *((long *)p));
- X plongs += 12;
- X }
- X if (pstring >= string+72)
- X {
- X log("%s\n", pstring = string);
- X log("%s\n", pwords = words);
- X log("%s\n", pdwords = dwords);
- X log("%s\n\n", plongs = longs);
- X }
- X }
- X log("%s\n", string);
- X log("%s\n", words);
- X log("%s\n", dwords);
- X log("%s\n", longs);
- X}
- X
- X#ifdef RFSDEBUG
- X
- Xshowmsg(msg, fromserver)
- X register struct message *msg;
- X long fromserver;
- X{
- X register long end, len, pid, uid, totlen;
- X
- X if ((remote_debug & 0x100) == 0)
- X return;
- X if (fromserver)
- X len = ntohs(msg->m_hdlen),
- X totlen = ntohl(msg->m_totlen),
- X pid = ntohs(msg->m_pid),
- X uid = ntohs(msg->m_uid);
- X else
- X len = msg->m_hdlen,
- X totlen = msg->m_totlen,
- X pid = msg->m_pid,
- X uid = msg->m_uid;
- X log("%s server: len=%d,tot=%d,pid=%d,uid=%d",
- X fromserver ? "from" : "to", len, totlen, pid, uid);
- X
- X /* round up into long words */
- X len = (len - R_MINRMSG + 3) >> 2;
- X if (fromserver)
- X {
- X log(",errno=%d,retval=%d",
- X htons(msg->m_errno), htonl(msg->m_args[ R_RETVAL ]));
- X end = R_RETVAL+1;
- X }
- X else
- X {
- X log(",syscall=%d", msg->m_syscall);
- X end = 0;
- X }
- X for (; end<len; end++)
- X log(",0x%x", ntohl(msg->m_args[ end ]));
- X log("\n");
- X}
- X
- X/*
- X * Set new debug levels.
- X */
- Xnewdebug()
- X{
- X register long fd, cnt;
- X char *dbfile = "/usr/tmp/rfs_debug",
- X buf[ BUFSIZ ];
- X register char *p = buf;
- X
- X fd = open(dbfile, O_RDONLY);
- X if (fd < 0) {
- X log("can't open %s\n", dbfile);
- X goto out;
- X }
- X
- X cnt = read(fd, buf, BUFSIZ);
- X close(fd);
- X if (cnt <= 0) {
- X log("can't read %s\n", dbfile);
- X goto out;
- X }
- X
- X while ((*p >= 'a' && *p <= 'f')
- X || (*p >= 'A' && *p <= 'F')
- X || (*p >= '0' && *p <= '9'))
- X p++;
- X *p = '\0';
- X remote_debug = atox(buf);
- Xout:
- X log("debug=%x\n", remote_debug);
- X}
- X#endif RFSDEBUG
- SHAREOF
- chmod 444 remote/serverio.c
- #
- # remote/serversyscall.c
- #
- if [ -f remote/serversyscall.c ]; then
- echo -n 'Hit <return> to overwrite remote/serversyscall.c or ^C to quit'
- read ans
- rm -f remote/serversyscall.c
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/serversyscall.c
- X/*
- X * Copyright 1985, Todd Brunhoff.
- X *
- X * This software was written at Tektronix Computer Research Laboratories
- X * as partial fulfillment of a Master's degree at the University of Denver.
- X * This is not Tektronix proprietary software and should not be
- X * confused with any software product sold by Tektronix. No warranty is
- X * expressed or implied on the reliability of this software; the author,
- X * the University of Denver, and Tektronix, inc. accept no liability for
- X * any damage done directly or indirectly by this software. This software
- X * may be copied, modified or used in any way, without fee, provided this
- X * notice remains an unaltered part of the software.
- X *
- X * $Log: serversyscall.c,v $
- X * Revision 2.0 85/12/07 18:22:44 toddb
- X * First public release.
- X *
- X */
- Xstatic char *rcsid = "$Header: serversyscall.c,v 2.0 85/12/07 18:22:44 toddb Rel $";
- X#include "server.h"
- X#include <sys/stat.h>
- X#include <sys/dir.h>
- X#include <sys/file.h>
- X#include <sys/user.h>
- X#include <errno.h>
- X
- Xextern char *syscallnames[];
- Xextern short current_pid;
- Xextern short gateway_server;
- Xextern boolean i_am_gateway;
- Xextern boolean in_root_directory;
- Xextern syscallmap smap[];
- Xextern struct stat filetypes[];
- Xextern hosts *host;
- Xextern long errno;
- X
- Xs_fork(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register process *newproc;
- X register long newpid = msg->m_args[ 0 ],
- X i, fd;
- X register short syscall = msg->m_syscall;
- X boolean needtofork = FALSE;
- X
- X if (newproc = findprocess(newpid, msg->m_uid))
- X debug1("%d = %sfork(%d), redundant\n",
- X newpid, syscall == RSYS_vfork ? "v" : "",
- X msg->m_args[ 1 ]);
- X else
- X {
- X debug1("%d = %sfork(%d)\n",
- X newpid, syscall == RSYS_vfork ? "v" : "",
- X proc->p_pid);
- X newproc = add_new_process(msg->m_uid, newpid);
- X for (i=0; i<NOFILE; i++)
- X if ((fd = proc->p_fds[ i ]) >= 0)
- X newproc->p_fds[ i ] = fd, needtofork = TRUE;
- X
- X if (needtofork)
- X become_server(msg);
- X else if (! i_am_gateway)
- X say_something(S_NEWPROCESS, newpid);
- X }
- X /*
- X * No return message is sent!
- X */
- X}
- X
- Xs_read(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long clientfd = msg->m_args[0],
- X fd,
- X size = msg->m_args[1];
- X register char *buf = get_data_buf(size);
- X
- X fd = MAPFD(clientfd, proc);
- X proc->p_returnval = read(fd, buf, size);
- X proc->p_errno = fixdir(fd, buf, proc->p_returnval);
- X debug1("%d = read(%d->%d, 0x%x, %d);\n",
- X proc->p_returnval, clientfd, fd, buf, size);
- X sendreturn(proc, host->h_cmdfd, buf, 0);
- X}
- X
- Xs_write(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long clientfd = msg->m_args[0],
- X fd,
- X size = msg->m_args[1],
- X totlen = msg->m_totlen;
- X register char *buf;
- X
- X if (totlen > BIGBUF)
- X msg = (struct message *)getbuf(totlen);
- X buf = (char *)&msg->m_args[R_DATA];
- X gobble_last_msg(host->h_cmdfd, msg);
- X fd = MAPFD(clientfd, proc);
- X proc->p_returnval = write(fd, buf, size);
- X proc->p_errno = errno;
- X debug1("%d = write(%d->%d, 0x%x, %d);\n",
- X proc->p_returnval, clientfd, fd, buf, size);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- X/*
- X * Open a file. Also interface for creat(). Note that we pass back
- X * the current file offset.
- X */
- Xs_open(msg, proc)
- X struct message *msg;
- X register process *proc;
- X{
- X#define mask args[ 3 ]
- X#define clientfd args[ 2 ]
- X#define mode args[ 1 ]
- X#define flags args[ 0 ]
- X
- X register long ourfd,
- X *args = msg->m_args;
- X register char *path = path1addr(msg);
- X
- X change_to_umask(mask);
- X ourfd = open(path, flags, mode);
- X proc->p_errno = errno;
- X proc->p_returnval = allocate_fd(ourfd, proc, clientfd);
- X debug1("%d = open(\"%s\", 0%o, %d)\n",
- X proc->p_returnval, path, flags, mode);
- X sendreturn(proc, host->h_cmdfd, NULL, 1, lseek(ourfd, 0, L_INCR));
- X
- X#undef mask
- X#undef clientfd
- X#undef mode
- X#undef flags
- X}
- X
- Xs_fd1(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long clientfd = msg->m_args[0],
- X fd,
- X syscall = msg->m_syscall;
- X
- X fd = MAPFD(clientfd, proc);
- X /*
- X * No return sent for close or fsync!
- X */
- X if (syscall == RSYS_close || syscall == RSYS_fsync)
- X proc->p_returnval = deallocate_fd(proc, msg->m_args[0]);
- X else
- X {
- X proc->p_returnval = (*smap[ syscall ].s_syscall)(fd);
- X proc->p_errno = errno;
- X if (syscall != RSYS_fsync)
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X }
- X debug1("%d = %s(%d->%d)\n",
- X proc->p_returnval, syscallnames[ syscall ], clientfd, fd);
- X}
- X
- Xs_fd1_plus(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X#define arg1 msg->m_args[1]
- X#define arg2 msg->m_args[2]
- X register long clientfd = msg->m_args[0],
- X fd;
- X
- X fd = MAPFD(clientfd, proc);
- X proc->p_returnval = (*smap[ msg->m_syscall ].s_syscall)(fd, arg1, arg2);
- X proc->p_errno = errno;
- X debug1("%d = %s(%d->%d, %d(0%o), %d(0%o))\n",
- X proc->p_returnval, syscallnames[ msg->m_syscall ],
- X clientfd, fd, arg1, arg1, arg2, arg2);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X#undef arg1
- X#undef arg2
- X}
- X
- X/*
- X * link, symlink and rename
- X */
- Xs_path2(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X#define mask msg->m_args[0]
- X register char *path1, *path2;
- X register short syscall = msg->m_syscall;
- X
- X change_to_umask(mask);
- X path2 = twopath2addr(msg);
- X path1 = twopath1addr(msg);
- X proc->p_returnval = (*smap[ syscall ].s_syscall)(path1, path2);
- X proc->p_errno = errno;
- X debug1("%d = %s(\"%s\", \"%s\")\n", syscallnames[ syscall ],
- X proc->p_returnval, path1, path2);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X#undef mask
- X}
- X
- Xs_path1(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register char *path;
- X register short syscall = msg->m_syscall;
- X register long mask = msg->m_args[0];
- X struct stat statb;
- X extern struct stat root;
- X register struct stat *statp = &statb;
- X
- X change_to_umask(mask);
- X path = path1addr(msg);
- X proc->p_returnval = (*smap[ syscall ].s_syscall)(path);
- X proc->p_errno = errno;
- X debug1("%d = %s(\"%s\")\n",
- X proc->p_returnval, syscallnames[ syscall ], path);
- X if (syscall == RSYS_chdir)
- X if (proc->p_returnval == -1)
- X debug1("can't chdir to %s\n", path);
- X else
- X {
- X if (stat(".", statp) == 0 && isroot(statp))
- X in_root_directory = TRUE;
- X else
- X in_root_directory = FALSE;
- X debug10("Now I'm %sin root\n",
- X !in_root_directory ? "not " : "");
- X }
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- Xs_access(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register char *path;
- X register long perm = msg->m_args[0];
- X
- X path = path1addr(msg);
- X
- X /*
- X * The kernel access is strange: it first sets the effective uid
- X * and gid to be the real uid/gid and THEN it does the access.
- X * Well, our real uid is always 0 (so we can change our effective
- X * uid at will), so the effect is different than a normal user
- X * would expect. i.e. access always succeeds no matter what
- X * the arguments. This is clearly not what we want, so we apply
- X * an awful kludge here; change our real uid to be the user we
- X * are pretending to be, and then call access.
- X */
- X change_to_uid(0);
- X setreuid(proc->p_ruser->r_user->u_local_uid, 0);
- X proc->p_returnval = access(path, perm);
- X proc->p_errno = errno;
- X debug1("%d = access(\"%s\", 0%o\n", proc->p_returnval, path, perm);
- X setreuid(0, 0);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- Xs_path1_plus(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register char *path;
- X register long syscall = msg->m_syscall,
- X arg1 = msg->m_args[0],
- X arg2 = msg->m_args[1],
- X mask = msg->m_args[2];
- X
- X path = path1addr(msg);
- X change_to_umask(mask);
- X
- X proc->p_returnval = (*smap[ syscall ].s_syscall)(path, arg1, arg2);
- X proc->p_errno = errno;
- X debug1("%d = %s(\"%s\", %d(0%o), %d(%o))\n",
- X proc->p_returnval,
- X syscallnames[ syscall ], path, arg1, arg1, arg2, arg2);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- Xs_stat(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X union a {
- X char *path;
- X long fd;
- X } arg;
- X register short syscall = msg->m_syscall;
- X register long clientfd = msg->m_args[0];
- X struct stat statbuf;
- X register struct stat *statp = &statbuf;
- X
- X if (syscall == RSYS_fstat)
- X arg.fd = MAPFD(clientfd, proc);
- X else
- X arg.path = path1addr(msg);
- X proc->p_returnval = (*smap[ syscall ].s_syscall)(arg.path, statp);
- X proc->p_errno = errno;
- X#ifdef RFSDEBUG
- X if (syscall == RSYS_fstat)
- X debug1("%d = fstat(%d->%d, 0x%x)\n",
- X proc->p_returnval, clientfd, arg.fd, &statbuf);
- X else
- X debug1("%d = %s(\"%s\", 0x%x)\n", proc->p_returnval,
- X syscallnames[ syscall ], arg.path, &statbuf);
- X#endif RFSDEBUG
- X if (proc->p_returnval == -1)
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X else
- X sendreturn(proc, host->h_cmdfd, NULL, 14,
- X statp->st_dev,
- X statp->st_ino,
- X statp->st_mode,
- X statp->st_nlink,
- X statp->st_uid,
- X statp->st_gid,
- X statp->st_rdev,
- X statp->st_size,
- X statp->st_atime,
- X statp->st_mtime,
- X statp->st_ctime,
- X statp->st_blksize,
- X statp->st_blocks,
- X isroot(statp));
- X}
- X
- Xs_lseek(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long clientfd = msg->m_args[0], fd;
- X
- X fd = MAPFD(clientfd, proc);
- X proc->p_returnval = lseek(fd, msg->m_args[1], msg->m_args[2]);
- X proc->p_errno = errno;
- X debug1("%d = lseek(%d->%d, %d, %d)\n", proc->p_returnval,
- X clientfd, fd, msg->m_args[1], msg->m_args[2]);
- X if (msg->m_syscall == RSYS_lseek)
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- Xs_dup(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long clientfd = msg->m_args[0], fd,
- X newclientfd = msg->m_args[1],
- X ourfd,
- X newfd;
- X
- X fd = MAPFD(clientfd, proc);
- X if (msg->m_syscall == RSYS_dup2)
- X {
- X newfd = MAPFD(newclientfd, proc);
- X if (newfd >= 0)
- X {
- X proc->p_returnval = deallocate_fd(proc, newclientfd, 0);
- X debug1("%d = (dup2)close(%d->%d)... ",
- X proc->p_returnval, newclientfd, newfd);
- X }
- X }
- X if (fd >= 0)
- X {
- X ourfd = dup(fd);
- X proc->p_returnval = allocate_fd(ourfd, proc, newclientfd);
- X proc->p_errno = errno;
- X }
- X else if (msg->m_syscall == RSYS_dup2 && newfd >= 0)
- X proc->p_returnval = newclientfd;
- X else
- X {
- X proc->p_returnval = -1;
- X proc->p_errno = EINVAL;
- X }
- X debug1("%d = dup(%d->%d)\n", proc->p_returnval, clientfd, fd);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- Xs_ioctl(msg, proc)
- X struct message *msg;
- X process *proc;
- X{
- X long fd = msg->m_args[0];
- X}
- X
- Xs_readlink(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long size = msg->m_args[0];
- X register char *buf = get_data_buf(size),
- X *path = path1addr(msg);
- X
- X proc->p_returnval = readlink(path, buf, size);
- X proc->p_errno = errno;
- X debug1("%d = readlink(\"%s\", 0x%x, %d);\n",
- X proc->p_returnval, path, buf, size);
- X sendreturn(proc, host->h_cmdfd, buf, 0);
- X}
- X
- X/*
- X * Send exec information the remote host.
- X */
- Xs_execinfo(msg, proc)
- X register struct message *msg;
- X register process *proc;
- X{
- X register long hdrsize = msg->m_args[ 0 ],
- X red,
- X err = 0,
- X msglen = R_MINRMSG + sizeof(long)*R_EXECDATA;
- X register char *path = path1addr(msg),
- X *p;
- X struct stat st;
- X struct message msgbuf;
- X
- X errno = 0;
- X if (hdrsize > (R_MAXARGS - R_EXECDATA)*sizeof(long))
- X {
- X log("exec: hdrsize = %d!!\n", hdrsize);
- X err = EINVAL;
- X goto done;
- X }
- X /*
- X * Start building the outgoing message... get header,
- X * check permissions and open file.
- X */
- X msg = &msgbuf;
- X if ((proc->p_execfd = open(path, O_RDONLY)) == -1)
- X goto done;
- X fstat(proc->p_execfd, &st);
- X if ((st.st_mode & S_IFMT) != S_IFREG
- X || ! myaccess(&st, proc->p_ruser->r_user, X_OK))
- X {
- X err = ENOEXEC;
- X debug12("%s mode=0%o %sreg file, %sexecutable\n",
- X path, st.st_mode,
- X (st.st_mode & S_IFMT) != S_IFREG ? "not " : "",
- X myaccess(&st, proc->p_ruser->r_user, X_OK) ?
- X "" : "not ");
- X goto done;
- X }
- X msg->m_args[ R_EXECREADONLY ] =
- X (myaccess(&st, proc->p_ruser->r_user, W_OK) == FALSE);
- X msg->m_args[R_EXECDATA] = 0; /* for zero-length files */
- X red = read(proc->p_execfd, msg->m_args + R_EXECDATA, hdrsize);
- X if (red <= 0)
- X {
- X debug12("read on exec fd %d=%d\n", proc->p_execfd, red);
- X err = EINVAL;
- X goto done;
- X }
- X msglen += red;
- X
- X
- X /*
- X * Check setuid/setgid info
- X */
- X if (st.st_mode & S_ISUID)
- X msg->m_args[ R_EXECUID ] = htonl(st.st_uid);
- X else
- X msg->m_args[ R_EXECUID ] = htonl(-1);
- X if (st.st_mode & S_ISGID)
- X msg->m_args[ R_EXECGID ] = htonl(st.st_gid);
- X else
- X msg->m_args[ R_EXECGID ] = htonl(-1);
- X
- Xdone:
- X proc->p_execstarted = FALSE;
- X msg->m_hdlen = htons(msglen);
- X msg->m_totlen = htonl(msglen);
- X if (errno)
- X err = errno;
- X if (err)
- X {
- X debug12("execinfo: err=%d\n", err);
- X close(proc->p_execfd);
- X proc->p_execfd = -1;
- X }
- X debug1("%d = execve(\"%s\");\n", proc->p_returnval, path);
- X if (msg->m_errno = htons(err))
- X msg->m_args[ R_RETVAL ] = htonl(-1);
- X else
- X msg->m_args[ R_RETVAL ] = htonl(st.st_size);
- X msg->m_pid = htons(proc->p_pid);
- X msg->m_uid = htons(proc->p_uid);
- X sndmsg(host->h_cmdfd, msg, msglen, 0, 0);
- X}
- X
- X/*
- X * Send exec text and data to remote host.
- X */
- Xs_execread(msg, proc)
- X struct message *msg;
- X process *proc;
- X{
- X register long fd = proc->p_execfd,
- X hdrsize = msg->m_args[0],
- X size = msg->m_args[1],
- X red;
- X register char *buf = get_data_buf(size);
- X
- X if (!proc->p_execstarted)
- X {
- X if (lseek(fd, hdrsize, 0) != hdrsize)
- X {
- X log("can't seek to %d on fd %d for exec\n",
- X hdrsize, fd);
- X proc->p_errno = EINVAL;
- X }
- X proc->p_execstarted = TRUE;
- X }
- X if (size)
- X {
- X proc->p_returnval = read(fd, buf, size);
- X proc->p_errno = errno;
- X debug1("%d = execread(%d)\n", proc->p_returnval, size);
- X }
- X else /* all done; send no return */
- X {
- X proc->p_returnval = close(proc->p_execfd);
- X proc->p_execfd = -1;
- X debug1("%d = execread(%d)\n", proc->p_returnval, size);
- X return;
- X }
- X
- X sendreturn(proc, host->h_cmdfd, buf, 0);
- X}
- X
- Xs_utimes(msg, proc)
- X struct message *msg;
- X process *proc;
- X{
- X char *path;
- X struct timeval tv[2];
- X
- X path = path1addr(msg);
- X tv[0].tv_sec = msg->m_args[0];
- X tv[0].tv_usec = msg->m_args[1];
- X tv[1].tv_sec = msg->m_args[2];
- X tv[1].tv_usec = msg->m_args[3];
- X
- X
- X proc->p_returnval = utimes(path, tv);
- X proc->p_errno = errno;
- X debug1("%d = utimes(\"%s\", 0x%x\n", proc->p_returnval, path, tv);
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- X
- X/*
- X * Let a process exit.
- X */
- Xs_exit(msg, proc)
- X struct message *msg;
- X process *proc;
- X{
- X long otherprocs = 0;
- X process *p2;
- X
- X /*
- X * No return message sent!
- X */
- X debug1("exit()\n");
- X deletelist(&host->h_proclist, proc);
- X freeproc(proc);
- X if (! i_am_gateway)
- X {
- X for (proc=host->h_proclist; proc; proc=proc->p_next)
- X if (proc->p_handler == current_pid)
- X otherprocs++;
- X if (otherprocs == 0)
- X {
- X gobble_last_msg(host->h_cmdfd, msg);
- X say_something(S_ALLDONE, 0);
- X mourne();
- X exit(0);
- X }
- X else
- X say_something(S_PROCEXIT, msg->m_pid);
- X }
- X}
- X
- Xnoop(msg, proc)
- X struct message *msg;
- X process *proc;
- X{
- X extern long errno;
- X
- X log("*** FUNCTION IGNORED ***\n", proc->p_pid);
- X proc->p_returnval = -1;
- X proc->p_errno = EINVAL;
- X sendreturn(proc, host->h_cmdfd, NULL, 0);
- X}
- SHAREOF
- chmod 444 remote/serversyscall.c
- #
- # remote/shells
- #
- mkdir remote/shells
- chmod 775 remote/shells
- #
- # remote/shells/makemake
- #
- if [ -f remote/shells/makemake ]; then
- echo -n 'Hit <return> to overwrite remote/shells/makemake or ^C to quit'
- read ans
- rm -f remote/shells/makemake
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/makemake
- X#!/bin/sh
- XMAKEFILE=Makefile
- X
- Xcase "$1" in
- X"")
- X echo "Usage: $0 <machinetype>"
- X exit 1
- X ;;
- XM68)
- X MAKEFILE=M68
- X ;;
- Xesac
- X
- Xif [ ! -f make.base.$1 ]
- Xthen
- X echo No machine type $1 supported.
- X exit 1
- Xfi
- X
- Xcat make.base.$1 make.base > $MAKEFILE
- SHAREOF
- chmod 755 remote/shells/makemake
- #
- # remote/shells/mkdist
- #
- if [ -f remote/shells/mkdist ]; then
- echo -n 'Hit <return> to overwrite remote/shells/mkdist or ^C to quit'
- read ans
- rm -f remote/shells/mkdist
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/mkdist
- X#!/bin/sh
- X
- XFILES='
- X remote/README
- X remote/*.[ch]
- X remote/doc
- X remote/make.*
- X remote/shells
- X remote/usr.*'
- X
- XFILES=`echo $FILES`
- Xcd ..
- Xtar cvhf - $FILES > remote/remotefs.tar
- SHAREOF
- chmod 755 remote/shells/mkdist
- #
- # remote/shells/mkdist.shar
- #
- if [ -f remote/shells/mkdist.shar ]; then
- echo -n 'Hit <return> to overwrite remote/shells/mkdist.shar or ^C to quit'
- read ans
- rm -f remote/shells/mkdist.shar
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/mkdist.shar
- X#!/bin/sh
- X
- XFILES='
- X remote/README
- X remote/*.[ch]
- X remote/doc
- X remote/make.*
- X remote/shells
- X remote/usr.*'
- X
- Xset -x
- Xcd ..
- Xshar $FILES
- Xmv shar.? remote
- X
- X#
- X# put in the count
- X#
- XCOUNT=`ls remote/shar.? | grep -c .`
- Xcnt=1
- Xwhile [ $cnt -le $COUNT ]
- Xdo
- X
- Xed remote/shar.$cnt << EOF
- X1a
- X#
- X# RFS, a kernel-resident remote file system. Shar $cnt of $COUNT
- X#
- X.
- Xw
- Xq
- XEOF
- X cnt=`expr $cnt + 1`
- Xdone
- X
- X#
- X# add in the intro
- X#
- Xed remote/shar.1 << \EOF
- X1i
- XThese seven shar files contain the software and documentatino for
- Xinstallation, maintenance and adjustment of RFS, a public domain,
- Xkernel-resident distributed file system, written at Tektronix Computer
- XResearch Laboratories* by me for partial fulfillment of the master's
- Xdegree program at the University of Denver. It was designed to provide
- Xcomplete transparency with respect to file access and protections for
- Xall programs whether they use local or remote files and directories.
- XIt has been installed on VAX BSD 4.2 and 4.3 UNIX, Pyramid 4.2/5.0
- XUNIX, version 2.5, and on a Tektronix internal proprietary workstation,
- Xcalled Magnolia. The instructions are designed in a way that keeps all
- Xchanges separate from your standard sources, in hope that it will
- Xencourage sites to try the installation.
- X
- X Todd Brunhoff
- X toddb%crl@tektronix.csnet
- X decvax!tektronix!crl!toddb
- X
- X* RFS should not be confused with another completely different (but
- X excellent) implementation from Tektronix available on the 6000 series
- X workstation, called DFS, and done by a separate product group. The
- X work on RFS was designed and written strictly by the author of this
- X paper at about the same time as DFS, and draws none of its
- X implementation details from DFS. RFS is public domain, while DFS is
- X proprietary.
- X
- X.
- Xw
- Xq
- XEOF
- SHAREOF
- chmod 755 remote/shells/mkdist.shar
- #
- # remote/shells/rfs_clean
- #
- if [ -f remote/shells/rfs_clean ]; then
- echo -n 'Hit <return> to overwrite remote/shells/rfs_clean or ^C to quit'
- read ans
- rm -f remote/shells/rfs_clean
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_clean
- X#!/bin/sh
- X
- Xcd /usr/tmp
- Xfor file in rfs_log.*.*
- Xdo
- X pid=`expr "$file" : '.*\.\(.*\)'`
- X result=`kill -19 $pid 2>&1`
- X case "$result" in
- X *"No such process") (set -x; rm -f $file);;
- X esac
- Xdone
- SHAREOF
- chmod 755 remote/shells/rfs_clean
- #
- # remote/shells/rfs_kerninstall
- #
- if [ -f remote/shells/rfs_kerninstall ]; then
- echo -n 'Hit <return> to overwrite remote/shells/rfs_kerninstall or ^C to quit'
- read ans
- rm -f remote/shells/rfs_kerninstall
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_kerninstall
- X#!/bin/sh
- X
- X#
- X# Install script for added RFS kernel sources.
- X#
- X NL='
- X'
- X SRC=$1
- X DEST=$2
- X VER=$3
- X USAGE="${NL}Usage: $0 src-dir dest-dir VAX4.3|VAX4.2|PYR2.5"
- XRemove_start=
- X Remove_end=
- X Delete=
- X
- X#
- X# Figure out what software we are running...
- X#
- Xcase "$VER" in
- XVAX4.3) Remove_start='^#else[ ]BSD4_3'
- X Remove_end='^#endif[ ]BSD4_3'
- X Delete='^#ifdef[ ]BSD4_3'
- X ;;
- XVAX4.2) Remove_start='^#ifdef[ ]BSD4_3'
- X Remove_end='^#else[ ]BSD4_3'
- X Delete='^#endif[ ]BSD4_3'
- X ;;
- XPYR2.5) Remove_start='^#ifdef[ ]BSD4_3'
- X Remove_end='^#else[ ]BSD4_3'
- X Delete='^#endif[ ]BSD4_3'
- X ;;
- X*) echo "$0: Unknown type = $VER" \
- X "$USAGE"
- X exit 1
- X ;;
- Xesac
- Xif [ "$SRC" = "" -o ! -d "$SRC" \
- X -o "$DEST" = "" -o ! -d "$DEST" ]
- Xthen
- X echo "Either \"$SRC\" or \"$DEST\" is not a directory!" \
- X "$USAGE"
- X exit 1
- Xfi
- X
- Xfor file in `ls $SRC`
- Xdo
- X echo -n "${NL}$file "
- X sed -e "/$Remove_start/,/$Remove_end/d" \
- X -e "/$Delete/d" \
- X < $SRC/$file > $DEST/$file
- Xdone
- Xchmod 0755 $DEST/remote_mkdata
- Xecho
- SHAREOF
- chmod 755 remote/shells/rfs_kerninstall
- #
- # remote/shells/rfs_kernpatch
- #
- if [ -f remote/shells/rfs_kernpatch ]; then
- echo -n 'Hit <return> to overwrite remote/shells/rfs_kernpatch or ^C to quit'
- read ans
- rm -f remote/shells/rfs_kernpatch
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_kernpatch
- X#!/bin/sh
- X#
- X# Kernel level setup for compiling RFS.
- X#
- XCHANGELIST=' h/errno.h
- X h/param.h
- X h/user.h
- X sys/init_sysent.c
- X sys/kern_exec.c
- X sys/kern_exit.c
- X sys/ufs_syscalls.c'
- XCHANGE_42=' sys/sys_inode.c
- X sys/ufs_nami.c
- X sys/uipc_socket.c
- X machine/trap.c
- X conf/files'
- XCHANGE_43=' sys/ufs_namei.c
- X machine/trap.c
- X conf/files'
- XCHANGE_PYR=' sys/kern_trap.c'
- X PATCHES=$1
- X SRC=$2
- X DEST=$3
- X VER=$4
- X USAGE="Usage: $0 patch-dir src-dir dest-dir VAX4.3|VAX4.2|PYR2.5"
- X NL='
- X'
- X
- Xif [ ! -d "$PATCHES" -o ! -d "$SRC" -o ! -d "$DEST" ]
- Xthen
- X echo "One of \"$PATCHES\", \"$SRC\" or \"$DEST\" is not a directory" \
- X "$NL$USAGE"
- X exit 1
- Xfi
- X
- Xcase "$VER" in
- XVAX4.3) CHANGELIST="$CHANGELIST $CHANGE_43"
- X if [ -f $SRC/conf/Makefile.vax ]
- X then
- X CHANGELIST="$CHANGELIST conf/Makefile.vax"
- X else
- X CHANGELIST="$CHANGELIST conf/makefile.vax"
- X fi
- X ;;
- XVAX4.2) CHANGELIST="$CHANGELIST $CHANGE_42 conf/makefile.vax" ;;
- XPYR2.5) CHANGELIST="$CHANGELIST $CHANGE_PYR conf/makefromsource" ;;
- X*) echo "Invalid version = \"$VER\"$NL$USAGE"
- X exit 1
- X ;;
- Xesac
- X
- X#
- X# copy the target files for the patches.
- X#
- Xcase "$DEST" in
- X
- X$SRC) ;; # no need to copy
- X
- X*) echo "Copy in files that must be changed..."
- X (cd $DEST; rm -f $CHANGELIST)
- X for file in $CHANGELIST
- X do
- X (set -x; cp $SRC/$file $DEST/$file)
- X done
- X ;;
- Xesac
- X(cd $DEST; chmod 0644 $CHANGELIST)
- X
- X#
- X# do the patches
- X#
- Xfor file in $CHANGELIST
- Xdo
- X while :
- X do
- X echo -n "${NL}${NL}Hit <return> to patch" \
- X "$file or 'n' to skip: "
- X read prompt
- X case "$prompt" in
- X "") (set -x; patch $DEST/$file $PATCHES/$file.diff)
- X ;;
- X n) ;;
- X *) echo "Enter <return> or the letter 'n' only!"
- X continue
- X ;;
- X esac
- X break
- X done
- Xdone
- SHAREOF
- chmod 755 remote/shells/rfs_kernpatch
- #
- # remote/shells/rfs_setup
- #
- if [ -f remote/shells/rfs_setup ]; then
- echo -n 'Hit <return> to overwrite remote/shells/rfs_setup or ^C to quit'
- read ans
- rm -f remote/shells/rfs_setup
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_setup
- X#!/bin/sh
- X#
- X# Setup for compiling RFS.
- X#
- XPWD=`pwd`
- XKERNELDIRS=' conf
- X h
- X net
- X netimp
- X netinet
- X remote
- X sys'
- XKDIRS_42=' vax
- X vaxif
- X vaxmba
- X vaxuba
- X netpup'
- XKDIRS_43=' vax
- X vaxif
- X vaxmba
- X vaxuba
- X bbnnet
- X netns'
- XKDIRS_PYR=' ether
- X io
- X kernel
- X kernel_m
- X ml
- X netpup
- X vls'
- XINCLUDEFILE=syscall.h
- X NL='
- X'
- XEXECDIR=`expr $0 : '\(.*\)\/.*'`
- X
- X#
- X# Figure out what software they are running...
- X#
- Xwhile :
- Xdo
- X echo -n "Are you running" \
- X "${NL} 1. VAX 4.3 BSD" \
- X "${NL} 2. VAX 4.2 BSD" \
- X "${NL} 3. Pyramid 2.5 (4.2/5.0)" \
- X "${NL}enter 1, 2 or 3: "
- X read ans
- X case "$ans" in
- X 1) VER=VAX4.3
- X MACH=vax
- X KERNELDIRS="$KERNELDIRS $KDIRS_43"
- X ;;
- X 2) VER=VAX4.2
- X MACH=vax
- X KERNELDIRS="$KERNELDIRS $KDIRS_42"
- X ;;
- X 3) VER=PYR2.5
- X MACH=pyr
- X KERNELDIRS="$KERNELDIRS $KDIRS_PYR"
- X ;;
- X *) echo "only 1, 2 and 3 are supported..."
- X continue
- X ;;
- X esac
- X break;
- Xdone
- X
- X#
- X# Find out the sys directory
- X#
- XSYSDIR=
- Xwhile :
- Xdo
- X echo -n "${NL}${NL}What is the top-level path of your kernel source" \
- X "${NL}directory (normally it is /usr/sys)? "
- X read ans
- X if [ "$ans" = "" -o ! -d "$ans" ]
- X then
- X echo "...but \"$ans\" is not a directory!"
- X continue
- X fi
- X
- X #
- X # Ensure that the path begins with /
- X #
- X case "$ans" in
- X /*) ;;
- X *) echo "\"$ans\" must begin with '/'"
- X continue
- X ;;
- X esac
- X
- X SYSDIR=$ans
- X break
- Xdone
- X
- X#
- X# ask if the changes are to be permanent
- X#
- Xwhile :
- Xdo
- X echo -n "${NL}${NL}Do you want these changes" \
- X "$NL 1. installed in $SYSDIR and in /usr/include" \
- X "$NL 2. installed in this directory (reccomended 1st pass)" \
- X "${NL}enter 1 or 2: "
- X read ans
- X case "$ans" in
- X 1) DEST=$SYSDIR
- X INCLUDEDIR=/usr/include
- X ;;
- X 2) DEST=$PWD/sys
- X INCLUDEDIR=usr.include
- X ;;
- X *) echo "only 1 or 2 allowed."
- X continue
- X ;;
- X esac
- X break
- Xdone
- X
- X
- Xumask 022
- Xcase "$DEST" in
- X
- X"$SYSDIR") # don't need to make local directories, 'cept one.
- X mkdir $SYSDIR/remote
- X ;;
- X
- X*) #
- X # make directories
- X #
- X echo "${NL}${NL}Make kernel source directories in `pwd` ..."
- X ERR=
- X mkdir sys
- X for dir in $KERNELDIRS
- X do
- X mkdir sys/$dir
- X
- X case "$dir" in
- X remote) continue;; # don't check its existence...
- X esac
- X
- X if [ ! -d $SYSDIR/$dir ]
- X then
- X echo "Kernel sources not in $SYSDIR/$dir ???"
- X ERR=true
- X fi
- X done
- X case "$ERR" in
- X "") ;;
- X *) exit 1;;
- X esac
- X
- X case "$VER" in
- X VAX4.2|VAX4.3) (cd sys; ln -s vax machine);;
- X esac
- X
- X #
- X # make the symbolic links
- X #
- X for dir in $KERNELDIRS
- X do
- X case "$dir" in
- X remote) continue;;
- X esac
- X
- X echo "Make symbolic links from $DEST/$dir/*" \
- X "${NL}to $SYSDIR/$dir/*..."
- X (cd $DEST/$dir; ln -s $SYSDIR/$dir/* .)
- X done
- X ;;
- Xesac
- X
- X#
- X# move the remote kernel stuff into place...
- X#
- Xecho "${NL}${NL}Copy $PWD/remote/usr.sys.remote/* files" \
- X "${NL}to $DEST/remote (and remove" \
- X "${NL}#ifdef BSD4_3 at the same time)..."
- X$EXECDIR/rfs_kerninstall $PWD/remote/usr.sys.remote $DEST/remote $VER
- X
- X#
- X# Now run patch on each files to install
- X# the changes necessary.
- X#
- Xcat <<EOF
- X
- X
- XI will now install all the kernel changes for you in
- X$DEST with the 'patch' utility, so you must have that
- Xprogram to continue. You will be given an opportunity to either suspend
- Xthis program or kill it before each file is patched so that you may
- Xmake adjustments as you think of them. You may also skip the patches
- Xif you know that they are already installed (Better be sure, though).
- X
- XFor the C-source files with the exception of two bug fixes, all changes
- Xwill be installed between the control statements:
- X
- X#ifdef REMOTEFS
- X#endif REMOTEFS
- X
- XEOF
- X
- X$EXECDIR/rfs_kernpatch remote/usr.sys.$VER $SYSDIR $DEST $VER
- X$EXECDIR/rfs_userpatch remote/usr.include.$VER $INCLUDEDIR $DEST
- X
- Xcat <<EOF
- X
- X
- XRfs software is set up and ready for compilation. See the installation
- Xmanual.
- X
- XEOF
- SHAREOF
- chmod 755 remote/shells/rfs_setup
- #
- # remote/shells/rfs_userpatch
- #
- if [ -f remote/shells/rfs_userpatch ]; then
- echo -n 'Hit <return> to overwrite remote/shells/rfs_userpatch or ^C to quit'
- read ans
- rm -f remote/shells/rfs_userpatch
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_userpatch
- X#!/bin/sh
- X#
- X# User-level software setup for compiling RFS.
- X#
- Xumask 02
- X PATCHES=$1
- XINCLUDEDIR=$2
- X SYS=$3
- X NL='
- X'
- X
- Xecho "$NL"
- X
- Xif [ ! -d $PATCHES -o ! -d $SYS ]
- Xthen
- X echo "Either \"$PATCHES\" or \"$SYS\" is not a directory"
- X exit 1
- Xfi
- X
- X#
- X# Make the proper include directories if they don't already exist.
- X# link in remotefs.h and param.h
- X#
- Xif [ ! -d $INCLUDEDIR ]
- Xthen
- X mkdir $INCLUDEDIR
- Xfi
- Xif [ ! -d $INCLUDEDIR/remote ]
- Xthen
- X mkdir $INCLUDEDIR/remote
- Xfi
- Xif [ ! -d $INCLUDEDIR/sys ]
- Xthen
- X mkdir $INCLUDEDIR/sys
- Xfi
- X
- Xrm -f $INCLUDEDIR/remote/remotefs.h $INCLUDEDIR/sys/param.h
- X
- Xln -s $SYS/remote/remotefs.h $INCLUDEDIR/remote/remotefs.h
- Xln -s $SYS/h/param.h $INCLUDEDIR/sys/param.h
- X
- X#
- X# Finally make the change to syscall.h. If the changes go in usr.include,
- X# then assume that we must copy it there first. Otherwise, we make the
- X# changes in place.
- X#
- Xcase "$INCLUDEDIR" in
- X
- X/usr/include) ;;
- X
- X*) rm -f $INCLUDEDIR/syscall.h
- X cat /usr/include/syscall.h > $INCLUDEDIR/syscall.h
- X ;;
- Xesac
- X
- Xwhile :
- Xdo
- X echo -n "${NL}${NL}Hit <return> to patch" \
- X "$INCLUDEDIR/syscall.h or 'n' to skip: "
- X read prompt
- X case "$prompt" in
- X "") (set -x; patch $INCLUDEDIR/syscall.h $PATCHES/syscall.h.diff)
- X ;;
- X n) ;;
- X *) echo "Enter <return> or the letter 'n' only!"
- X continue
- X ;;
- X esac
- X break
- Xdone
- SHAREOF
- chmod 755 remote/shells/rfs_userpatch
- #
- # remote/usr.include.PYR2.5
- #
- mkdir remote/usr.include.PYR2.5
- chmod 775 remote/usr.include.PYR2.5
- #
- # remote/usr.include.PYR2.5/syscall.h.diff
- #
- if [ -f remote/usr.include.PYR2.5/syscall.h.diff ]; then
- echo -n 'Hit <return> to overwrite remote/usr.include.PYR2.5/syscall.h.diff or ^C to quit'
- read ans
- rm -f remote/usr.include.PYR2.5/syscall.h.diff
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.include.PYR2.5/syscall.h.diff
- XIf the changes to sys/init_sysent.c succeeded, then this should be fine.
- XIf not, you should check that the system call numbers added coincide with
- Xthose in sys/init_sysent.c.
- X***************
- X*** 154,159
- X /* 152 thru 165 reserved */
- X #define SYS_setprocesshost 166
- X #define SYS_getprocesshost 167
- X
- X /*
- X * BTL system call header table.
- X
- X--- 154,162 -----
- X /* 152 thru 165 reserved */
- X #define SYS_setprocesshost 166
- X #define SYS_getprocesshost 167
- X+ #define SYS_remoteon 168
- X+ #define SYS_remoteoff 169
- X+ #define SYS_remotename 170
- X
- X /*
- X * BTL system call header table.
- SHAREOF
- chmod 664 remote/usr.include.PYR2.5/syscall.h.diff
- #
- # remote/usr.include.VAX4.2
- #
- mkdir remote/usr.include.VAX4.2
- chmod 775 remote/usr.include.VAX4.2
- if [ -f remote/usr.include.VAX4.3 ]; then
- echo -n 'Hit <return> to overwrite remote/usr.include.VAX4.2 or ^C to quit'
- read ans
- rm -rf remote/usr.include.VAX4.3
- fi
- ln -s remote/usr.include.VAX4.2 remote/usr.include.VAX4.3
- #
- # remote/usr.include.VAX4.2/syscall.h.diff
- #
- if [ -f remote/usr.include.VAX4.2/syscall.h.diff ]; then
- echo -n 'Hit <return> to overwrite remote/usr.include.VAX4.2/syscall.h.diff or ^C to quit'
- read ans
- rm -f remote/usr.include.VAX4.2/syscall.h.diff
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.include.VAX4.2/syscall.h.diff
- XIf the changes to sys/init_sysent.c succeeded, then this should be fine.
- XIf not, you should check that the system call numbers added coincide with
- Xthose in sys/init_sysent.c.
- X***************
- X*** 150,152
- X #define SYS_setquota 148
- X #define SYS_quota 149
- X #define SYS_getsockname 150
- X
- X--- 150,155 -----
- X #define SYS_setquota 148
- X #define SYS_quota 149
- X #define SYS_getsockname 150
- X+ #define SYS_remoteon 151
- X+ #define SYS_remoteoff 152
- X+ #define SYS_remotename 153
- SHAREOF
- chmod 664 remote/usr.include.VAX4.2/syscall.h.diff
- #
- # remote/usr.src.lib.libc
- #
- mkdir remote/usr.src.lib.libc
- chmod 775 remote/usr.src.lib.libc
- #
- # remote/usr.src.lib.libc/Makefile
- #
- if [ -f remote/usr.src.lib.libc/Makefile ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/Makefile or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/Makefile
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/Makefile
- X#
- X# This makefile is present only to build a temporary libc... until
- X# you decide that the files compiled here should be installed in the
- X# source directory. This makefile should not be installed anywhere.
- X#
- XOBJS= remotename.o remoteon.o remoteoff.o errlst.o
- XSRC=/usr/src
- XLIBSRC=${SRC}/lib/libc
- XUSR_INCLUDE=../../usr.include
- XLIBDIR=/lib
- X
- Xnothing:
- X echo "Nothing made!"
- X echo "You must type 'make vax' or 'make pyr'"
- X
- Xvax: /tmp
- X make INCLUDE="-I${LIBSRC}/vax/sys -I${USR_INCLUDE}" \
- X MACHTYPE=vax \
- X SUFFIX=c \
- X LIBDIR=${LIBDIR} \
- X SRC=${SRC} \
- X install
- X
- Xpyr: /tmp
- X make INCLUDE="-I${USR_INCLUDE}" \
- X MACHTYPE=pyr \
- X SUFFIX=s \
- X LIBDIR=${LIBDIR} \
- X SRC=${SRC} \
- X install
- X
- Xnewlibc.a: ${OBJS} libc.a
- X cp libc.a newlibc.a
- X ar cru newlibc.a ${OBJS}
- X
- Xinstall: newlibc.a libc.a
- X -cp ${LIBDIR}/libc.a ${LIBDIR}/libc.a.bak
- X cp newlibc.a ${LIBDIR}/libc.a
- X ranlib ${LIBDIR}/libc.a
- X
- Xlibc.a: /lib/libc.a
- X cp /lib/libc.a .
- X
- Xerrlst.o: errlst.c
- Xremotename.o remoteon.o remoteoff.o:
- Xremotename.o: ${MACHTYPE}/sys/remotename.${SUFFIX}
- X /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
- X -ld -x -r $@
- X mv a.out $@
- Xremoteon.o: ${MACHTYPE}/sys/remoteon.${SUFFIX}
- X /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
- X -ld -x -r $@
- X mv a.out $@
- Xremoteoff.o: ${MACHTYPE}/sys/remoteoff.${SUFFIX}
- X /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
- X -ld -x -r $@
- X mv a.out $@
- X
- Xerrlst.c: ${LIBSRC}/gen/errlst.c
- X cp ${LIBSRC}/gen/errlst.c nerrlst.c
- X patch nerrlst.c gen/${MACHTYPE}.errlst.c.diff
- X mv nerrlst.c errlst.c
- SHAREOF
- chmod 664 remote/usr.src.lib.libc/Makefile
- #
- # remote/usr.src.lib.libc/gen
- #
- mkdir remote/usr.src.lib.libc/gen
- chmod 775 remote/usr.src.lib.libc/gen
- #
- # remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
- #
- if [ -f remote/usr.src.lib.libc/gen/pyr.errlst.c.diff ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/gen/pyr.errlst.c.diff or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
- XThese changes being installed should be just fine if you were able to make
- Xthe earlier changes to h/errno.h. Otherwise, you must install these changes
- Xby hand.
- X***************
- X*** 82,88
- X "Too many processes", /* 67 - EPROCLIM */
- X "Too many users", /* 68 - EUSERS */
- X "Disc quota exceeded", /* 69 - EDQUOT */
- X! "","","","","","","","","","", /* 70-79 - spare */
- X "","","","","","","","","","", /* 80-89 - spare */
- X "","","","","","","","","","", /* 90-99 - spare */
- X
- X
- X--- 82,91 -----
- X "Too many processes", /* 67 - EPROCLIM */
- X "Too many users", /* 68 - EUSERS */
- X "Disc quota exceeded", /* 69 - EDQUOT */
- X! "File is on remote host", /* 70 - EISREMOTE */
- X! "Too many remote hosts defined", /* 71 - ETOOMANYREMOTE */
- X! "No remote file system", /* 72 - ENOREMOTEFS */
- X! "","","","","","","", /* 73-79 - spare */
- X "","","","","","","","","","", /* 80-89 - spare */
- X "","","","","","","","","","", /* 90-99 - spare */
- X
- SHAREOF
- chmod 664 remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
- #
- # remote/usr.src.lib.libc/gen/vax.errlst.c.diff
- #
- if [ -f remote/usr.src.lib.libc/gen/vax.errlst.c.diff ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/gen/vax.errlst.c.diff or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/gen/vax.errlst.c.diff
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/gen/vax.errlst.c.diff
- XThese changes being installed should be just fine if you were able to make
- Xthe earlier changes to h/errno.h. Otherwise, you must install these changes
- Xby hand.
- X***************
- X*** 81,85
- X "Too many processes", /* 67 - EPROCLIM */
- X "Too many users", /* 68 - EUSERS */
- X "Disc quota exceeded", /* 69 - EDQUOT */
- X };
- X int sys_nerr = { sizeof sys_errlist/sizeof sys_errlist[0] };
- X
- X--- 81,88 -----
- X "Too many processes", /* 67 - EPROCLIM */
- X "Too many users", /* 68 - EUSERS */
- X "Disc quota exceeded", /* 69 - EDQUOT */
- X+ "File is on remote host", /* 70 - EISREMOTE */
- X+ "Too many remote hosts defined", /* 71 - ETOOMANYREMOTE */
- X+ "No remote file system", /* 72 - ENOREMOTEFS */
- X };
- X int sys_nerr = { sizeof sys_errlist/sizeof sys_errlist[0] };
- SHAREOF
- chmod 664 remote/usr.src.lib.libc/gen/vax.errlst.c.diff
- #
- # remote/usr.src.lib.libc/pyr
- #
- mkdir remote/usr.src.lib.libc/pyr
- chmod 775 remote/usr.src.lib.libc/pyr
- #
- # remote/usr.src.lib.libc/pyr/sys
- #
- mkdir remote/usr.src.lib.libc/pyr/sys
- chmod 775 remote/usr.src.lib.libc/pyr/sys
- #
- # remote/usr.src.lib.libc/pyr/sys/remotename.s
- #
- if [ -f remote/usr.src.lib.libc/pyr/sys/remotename.s ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remotename.s or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/pyr/sys/remotename.s
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remotename.s
- X#include "syscall.h"
- X .globl cerror
- X .globl _remotename
- X .align 2
- X_remotename:
- X ###entry###
- X movw pr0,tr1
- X movw pr1,tr2
- X movw pr2,tr3
- X movw pr3,tr4
- X movw pr4,tr5
- X movw $/**/SYS_remotename, tr0
- X callk $0
- X cmpw $0,tr0
- X bne err
- X movw tr1,pr0
- X ret
- Xerr:
- X jump cerror
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/pyr/sys/remotename.s
- #
- # remote/usr.src.lib.libc/pyr/sys/remoteoff.s
- #
- if [ -f remote/usr.src.lib.libc/pyr/sys/remoteoff.s ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remoteoff.s or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/pyr/sys/remoteoff.s
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remoteoff.s
- X#include "syscall.h"
- X .globl cerror
- X .globl _remoteoff
- X .align 2
- X_remoteoff:
- X ###entry###
- X movw pr0,tr1
- X movw $/**/SYS_remoteoff, tr0
- X callk $0
- X cmpw $0,tr0
- X bne err
- X movw tr1,pr0
- X ret
- Xerr:
- X jump cerror
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/pyr/sys/remoteoff.s
- #
- # remote/usr.src.lib.libc/pyr/sys/remoteon.s
- #
- if [ -f remote/usr.src.lib.libc/pyr/sys/remoteon.s ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remoteon.s or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/pyr/sys/remoteon.s
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remoteon.s
- X#include "syscall.h"
- X .globl cerror
- X .globl _remoteon
- X .align 2
- X_remoteon:
- X ###entry###
- X movw pr0,tr1
- X movw pr1,tr2
- X movw pr2,tr3
- X movw pr3,tr4
- X movw $/**/SYS_remoteon, tr0
- X callk $0
- X cmpw $0,tr0
- X bne err
- X movw tr1,pr0
- X ret
- Xerr:
- X jump cerror
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/pyr/sys/remoteon.s
- #
- # remote/usr.src.lib.libc/vax
- #
- mkdir remote/usr.src.lib.libc/vax
- chmod 775 remote/usr.src.lib.libc/vax
- #
- # remote/usr.src.lib.libc/vax/sys
- #
- mkdir remote/usr.src.lib.libc/vax/sys
- chmod 775 remote/usr.src.lib.libc/vax/sys
- #
- # remote/usr.src.lib.libc/vax/sys/remotename.c
- #
- if [ -f remote/usr.src.lib.libc/vax/sys/remotename.c ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remotename.c or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/vax/sys/remotename.c
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remotename.c
- X/* remotename.c 4.2 85/10/25 */
- X
- X#include "SYS.h"
- X
- XSYSCALL(remotename)
- X ret
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/vax/sys/remotename.c
- #
- # remote/usr.src.lib.libc/vax/sys/remoteoff.c
- #
- if [ -f remote/usr.src.lib.libc/vax/sys/remoteoff.c ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remoteoff.c or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/vax/sys/remoteoff.c
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remoteoff.c
- X/* remoteoff.c 4.2 85/10/25 */
- X
- X#include "SYS.h"
- X
- XSYSCALL(remoteoff)
- X ret
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/vax/sys/remoteoff.c
- #
- # remote/usr.src.lib.libc/vax/sys/remoteon.c
- #
- if [ -f remote/usr.src.lib.libc/vax/sys/remoteon.c ]; then
- echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remoteon.c or ^C to quit'
- read ans
- rm -f remote/usr.src.lib.libc/vax/sys/remoteon.c
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remoteon.c
- X/* remoteon.c 4.2 85/10/25 */
- X
- X#include "SYS.h"
- X
- XSYSCALL(remoteon)
- X ret
- SHAREOF
- chmod 644 remote/usr.src.lib.libc/vax/sys/remoteon.c
- #
- # remote/usr.sys.PYR2.5
- #
- mkdir remote/usr.sys.PYR2.5
- chmod 775 remote/usr.sys.PYR2.5
- #
- # remote/usr.sys.PYR2.5/conf
- #
- mkdir remote/usr.sys.PYR2.5/conf
- chmod 775 remote/usr.sys.PYR2.5/conf
- #
- # remote/usr.sys.PYR2.5/conf/makefromsource.diff
- #
- if [ -f remote/usr.sys.PYR2.5/conf/makefromsource.diff ]; then
- echo -n 'Hit <return> to overwrite remote/usr.sys.PYR2.5/conf/makefromsource.diff or ^C to quit'
- read ans
- rm -f remote/usr.sys.PYR2.5/conf/makefromsource.diff
- fi
-
- sed -e 's/^.//' << \SHAREOF > remote/usr.sys.PYR2.5/conf/makefromsource.diff
- X*** /usr/toddb/crl/pyr/conf/makefromsource Wed Sep 18 00:25:15 1985
- X--- makefromsource Thu Jan 2 15:18:44 1986
- X***************
- X*** 31,37
- X # Compile options that are passed to all other source files:
- X # do not change (other than adding new options)
- X #
- X! OPTIONS = -DKERNEL -DINET -DRcsIdent -DNITP=8 -DXT -DWATCH
- X
- X CFLAGS = ${PROFILE} -O $(OPTIONS) ${DUALCPU}
- X ENTRY = _initcpus
- X
- X--- 31,37 -----
- X # Compile options that are passed to all other source files:
- X # do not change (other than adding new options)
- X #
- X! OPTIONS = -DKERNEL -DINET -DRcsIdent -DNITP=8 -DXT -DWATCH -DREMOTEFS
- X
- X CFLAGS = ${PROFILE} -O $(OPTIONS) ${DUALCPU}
- X ENTRY = _initcpus
- X***************
- X*** 87,92
- X -mv param.c oldparam.c
- X cp ../conf/param.c .
- X
- X FRC:
- X # MAKEFROMBINARY ENDS HERE -- Do not delete this line.
- X
- X
- X--- 87,99 -----
- X -mv param.c oldparam.c
- X cp ../conf/param.c .
- X
- X+ ../remote/rmt_data.c: ../remote/rmt_data_template ../remote/remotefs.h \
- X+ ../sys/init_sysent.c
- X+ cat ../remote/rmt_data_template > ../remote/nrmt_data.c
- X+ /lib/cpp ${CFLAGS} ../sys/init_sysent.c | sh ../remote/remote_mkdata \
- X+ ../remote/remotefs.h >> ../remote/nrmt_data.c
- X+ mv ../remote/nrmt_data.c ../remote/rmt_data.c
- X+
- X FRC:
- X # MAKEFROMBINARY ENDS HERE -- Do not delete this line.
- X
- X***************
- X*** 101,107
- X netimp debug
- X
- X LIBS = sys${LIB} io${LIB} net${LIB} ether${LIB} drw${LIB} \
- X! imp${LIB} dbg${LIB}
- X
- X # The following lines are automatically generated; do not modify them manually.
- X # LISTS BEGIN HERE -- Do not delete this line: make lists uses it
- X
- X--- 108,114 -----
- X netimp debug
- X
- X LIBS = sys${LIB} io${LIB} net${LIB} ether${LIB} drw${LIB} \
- X! imp${LIB} dbg${LIB} remote${LIB}
- X
- X # The following lines are automatically generated; do not modify them manually.
- X # LISTS BEGIN HERE -- Do not delete this line: make lists uses it
- X***************
- X*** 205,210
- X debugOBJS= \
- X debug1.o debug2.o debug3.o dis.o
- X
- X CFILES= \
- X ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
- X ${dr11wSRCS} ${netimpSRCS} ${debugSRCS}
- X
- X--- 212,227 -----
- X debugOBJS= \
- X debug1.o debug2.o debug3.o dis.o
- X
- X+ remoteSRCS= \
- X+ ../remote/rmt_data.c ../remote/rmt_exec.c ../remote/rmt_final.c \
- X+ ../remote/rmt_general.c ../remote/rmt_generic.c ../remote/rmt_io.c \
- X+ ../remote/rmt_subr.c ../remote/rmt_syscall1.c ../remote/rmt_syscall2.c \
- X+ ../remote/rmt_syscall3.c
- X+
- X+ remoteOBJS= \
- X+ rmt_data.o rmt_exec.o rmt_final.o rmt_general.o rmt_generic.o \
- X+ rmt_io.o rmt_subr.o rmt_syscall1.o rmt_syscall2.o rmt_syscall3.o
- X+
- X CFILES= \
- X ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
- X ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} ${remoteSRCS}
- X***************
- X*** 207,213
- X
- X CFILES= \
- X ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
- X! ${dr11wSRCS} ${netimpSRCS} ${debugSRCS}
- X
- X MLFILES= \
- X ../ml/asm.s ../ml/ml.s
- X
- X--- 224,230 -----
- X
- X CFILES= \
- X ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
- X! ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} ${remoteSRCS}
- X
- X MLFILES= \
- X ../ml/asm.s ../ml/ml.s
- X***************
- X*** 244,250
- X ../netinet/ip_var.h ../netinet/tcp.h ../netinet/tcp_debug.h \
- X ../netinet/tcp_fsm.h ../netinet/tcp_seq.h ../netinet/tcp_timer.h \
- X ../netinet/tcp_var.h ../netinet/tcpip.h ../netinet/udp.h \
- X! ../netinet/udp_var.h
- X # LISTS END HERE -- Do not delete this line: make lists uses it
- X
- X # Special treatment for these files (symbolic links) which are used to
- X
- X--- 261,267 -----
- X ../netinet/ip_var.h ../netinet/tcp.h ../netinet/tcp_debug.h \
- X ../netinet/tcp_fsm.h ../netinet/tcp_seq.h ../netinet/tcp_timer.h \
- X ../netinet/tcp_var.h ../netinet/tcpip.h ../netinet/udp.h \
- X! ../netinet/udp_var.h ../remote/remotefs.h
- X # LISTS END HERE -- Do not delete this line: make lists uses it
- X
- X # Special treatment for these files (symbolic links) which are used to
- X***************
- X*** 308,313
- X dbg${LIB}: $(debugOBJS)
- X ar cr $@ $? && ranlib $@
- X
- X
- X ml.o: ${MLFILES}
- X rm -f mltemp.[cs]
- X
- X--- 325,332 -----
- X dbg${LIB}: $(debugOBJS)
- X ar cr $@ $? && ranlib $@
- X
- X+ remote${LIB}: $(remoteOBJS)
- X+ ar cr $@ $? && ranlib $@
- X
- X ml.o: ${MLFILES}
- X rm -f mltemp.[cs]
- X***************
- X*** 763,768
- X ${LD} -x -r $@ && mv a.out $@
- X dis.o: ../debug/dis.c
- X ${CC} -I. -c ${CFLAGS} ../debug/dis.c
- X ${LD} -x -r $@ && mv a.out $@
- X # RULES END HERE -- Do not delete this line: make rules uses it
- X
- X
- X--- 782,817 -----
- X ${LD} -x -r $@ && mv a.out $@
- X dis.o: ../debug/dis.c
- X ${CC} -I. -c ${CFLAGS} ../debug/dis.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_data.o: ../remote/rmt_data.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_data.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_exec.o: ../remote/rmt_exec.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_exec.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_final.o: ../remote/rmt_final.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_final.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_general.o: ../remote/rmt_general.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_general.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_generic.o: ../remote/rmt_generic.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_generic.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_io.o: ../remote/rmt_io.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_io.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_subr.o: ../remote/rmt_subr.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_subr.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_syscall1.o: ../remote/rmt_syscall1.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall1.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_syscall2.o: ../remote/rmt_syscall2.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall2.c
- X+ ${LD} -x -r $@ && mv a.out $@
- X+ rmt_syscall3.o: ../remote/rmt_syscall3.c
- X+ ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall3.c
- X ${LD} -x -r $@ && mv a.out $@
- X # RULES END HERE -- Do not delete this line: make rules uses it
- X
- SHAREOF
- chmod 664 remote/usr.sys.PYR2.5/conf/makefromsource.diff
- #
- # remote/usr.sys.PYR2.5/h
- #
- mkdir remote/usr.sys.PYR2.5/h
- chmod 775 remote/usr.sys.PYR2.5/h
-
-