home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume3 / rfs / part4 < prev    next >
Encoding:
Internet Message Format  |  1986-11-30  |  63.2 KB

  1. Subject: RFS: remote file system (part 4 of 7)
  2. Newsgroups: mod.sources
  3. Approved: jpn@panda.UUCP
  4.  
  5. Mod.sources:  Volume 3, Issue 80
  6. Submitted by: tektronix!tekcrl!toddb
  7.  
  8. #!/bin/sh
  9. #
  10. # RFS, a kernel-resident remote file system.  Shar 4 of 7
  11. #
  12. #
  13. # This is a shell archive, meaning:
  14. # 1. Remove everything above the #!/bin/sh line.
  15. # 2. Save the resulting text in a file.
  16. # 3. Execute the file with /bin/sh (not csh) to create the files:
  17. #    remote/serverio.c
  18. #    remote/serversyscall.c
  19. #    remote/shells
  20. #    remote/shells/makemake
  21. #    remote/shells/mkdist
  22. #    remote/shells/mkdist.shar
  23. #    remote/shells/rfs_clean
  24. #    remote/shells/rfs_kerninstall
  25. #    remote/shells/rfs_kernpatch
  26. #    remote/shells/rfs_setup
  27. #    remote/shells/rfs_userpatch
  28. #    remote/usr.include.PYR2.5
  29. #    remote/usr.include.PYR2.5/syscall.h.diff
  30. #    remote/usr.include.VAX4.3
  31. #    remote/usr.include.VAX4.2
  32. #    remote/usr.include.VAX4.2/syscall.h.diff
  33. #    remote/usr.src.lib.libc
  34. #    remote/usr.src.lib.libc/Makefile
  35. #    remote/usr.src.lib.libc/gen
  36. #    remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
  37. #    remote/usr.src.lib.libc/gen/vax.errlst.c.diff
  38. #    remote/usr.src.lib.libc/pyr
  39. #    remote/usr.src.lib.libc/pyr/sys
  40. #    remote/usr.src.lib.libc/pyr/sys/remotename.s
  41. #    remote/usr.src.lib.libc/pyr/sys/remoteoff.s
  42. #    remote/usr.src.lib.libc/pyr/sys/remoteon.s
  43. #    remote/usr.src.lib.libc/vax
  44. #    remote/usr.src.lib.libc/vax/sys
  45. #    remote/usr.src.lib.libc/vax/sys/remotename.c
  46. #    remote/usr.src.lib.libc/vax/sys/remoteoff.c
  47. #    remote/usr.src.lib.libc/vax/sys/remoteon.c
  48. #    remote/usr.sys.PYR2.5
  49. #    remote/usr.sys.PYR2.5/conf
  50. #    remote/usr.sys.PYR2.5/conf/makefromsource.diff
  51. #    remote/usr.sys.PYR2.5/h
  52. #
  53. # remote/serverio.c
  54. #
  55. if [ -f remote/serverio.c ]; then 
  56.     echo -n 'Hit <return> to overwrite remote/serverio.c or ^C to quit' 
  57.     read ans 
  58.     rm -f remote/serverio.c 
  59. fi 
  60.  
  61. sed -e 's/^.//' << \SHAREOF > remote/serverio.c
  62. X/*
  63. X * Copyright 1985, Todd Brunhoff.
  64. X *
  65. X * This software was written at Tektronix Computer Research Laboratories
  66. X * as partial fulfillment of a Master's degree at the University of Denver.
  67. X * This is not Tektronix proprietary software and should not be
  68. X * confused with any software product sold by Tektronix.  No warranty is
  69. X * expressed or implied on the reliability of this software; the author,
  70. X * the University of Denver, and Tektronix, inc. accept no liability for
  71. X * any damage done directly or indirectly by this software.  This software
  72. X * may be copied, modified or used in any way, without fee, provided this
  73. X * notice remains an unaltered part of the software.
  74. X *
  75. X * $Log:    serverio.c,v $
  76. X * Revision 2.0  85/12/07  18:22:33  toddb
  77. X * First public release.
  78. X * 
  79. X */
  80. Xstatic char    *rcsid = "$Header: serverio.c,v 2.0 85/12/07 18:22:33 toddb Rel $";
  81. X#include <errno.h>
  82. X#include <stdio.h>
  83. X#include "server.h"
  84. X#include <sys/uio.h>
  85. X#include <sys/file.h>
  86. X#include <netdb.h>
  87. X#include <signal.h>
  88. X
  89. X/*
  90. X * This routine prepares to recieve a connection from another process.  
  91. X * To be any good it must be followed by a call to tcpaccept().
  92. X */
  93. Xextern long    errno;
  94. Xextern short    current_pid;
  95. Xextern char    *sys_errlist[],
  96. X        *service,
  97. X        *logfile,
  98. X        *stdlogfile,
  99. X        *getbuf();
  100. Xextern boolean    i_am_gateway;
  101. Xextern hosts    *host;
  102. Xextern long    serviceport,
  103. X        errno;
  104. Xextern short    last_sentry;
  105. X
  106. Xint    read(),
  107. X    write();
  108. X
  109. X/*
  110. X * Get ready to accept connections.
  111. X */
  112. Xtcppassive()
  113. X{
  114. X    int    f;
  115. X    struct sockaddr_in    sin;
  116. X    struct servent    *servp;
  117. X
  118. X    if ((servp = getservbyname(service, "tcp")) == NULL)
  119. X        log_fatal("%s: unknown service\n", service);
  120. X    serviceport = servp->s_port;
  121. X
  122. X    sin.sin_port = serviceport;
  123. X    sin.sin_addr.s_addr = INADDR_ANY;
  124. X    sin.sin_family = AF_INET;
  125. X
  126. X    f = socket(AF_INET, SOCK_STREAM, 0);
  127. X    setsockopt(f, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
  128. X    setsockopt(f, SOL_SOCKET, SO_REUSEADDR, 0, 0);
  129. X
  130. X    while (bind(f, (caddr_t)&sin, sizeof (sin)) < 0) {
  131. X        if (last_sentry && errno == EADDRINUSE)
  132. X        {
  133. X            log("shutting down old sentry (pid %d)\n",
  134. X                last_sentry);
  135. X            if (! sendsig(last_sentry, SIGTERM))
  136. X                last_sentry = 0;
  137. X            sleep(2);    /* give it time to die */
  138. X            continue;
  139. X        }
  140. X        log("cannot bind %s\n", service);
  141. X        return(-1);
  142. X    }
  143. X
  144. X    listen(f, 5);
  145. X    return(f);
  146. X}
  147. X
  148. X/*
  149. X * Here we passively accept a connection from another process.
  150. X * We return a pointer to the hosts structure.  If there is no
  151. X * corresponding host for a given connection, we make up a new one
  152. X * and return that.
  153. X */
  154. Xhosts *tcpaccept(f)
  155. X    int    f;
  156. X{
  157. X    hosts    *h = NULL;
  158. X    struct sockaddr_in    sin;
  159. X    int    g,
  160. X        i,
  161. X        len = sizeof (struct sockaddr_in);
  162. X
  163. X    for (i = 0, g = -1; g < 0 && i < 10; i++) {
  164. X        g = accept(f, &sin, &len);
  165. X        if (g < 0)
  166. X        {
  167. X            log("accept failed\n");
  168. X            continue;
  169. X        }
  170. X
  171. X        /*
  172. X         * Ok, we have recieved a connection.  Find out what we
  173. X         * know about this fella, and save the command file descriptor
  174. X         * and the port number.
  175. X         */
  176. X        h = findhostaddr(&sin.sin_addr);
  177. X        h->h_cmdfd = g;
  178. X        h->h_portnum = htons((u_short)sin.sin_port);
  179. X    }
  180. X
  181. X    return(h);
  182. X}
  183. X
  184. X/*
  185. X * Call another host's server.  We assume that he is using the same service
  186. X * as we.
  187. X */
  188. Xtcpconnect(h)
  189. X    register hosts    *h;
  190. X{
  191. X    struct sockaddr_in sin;
  192. X    register long    s;
  193. X
  194. X    bzero((char *)&sin, sizeof (sin));
  195. X    bcopy(&h->h_addr, (char *)&sin.sin_addr, sizeof(struct in_addr));
  196. X    sin.sin_family = AF_INET;
  197. X    sin.sin_port = serviceport;
  198. X    s = socket(AF_INET, SOCK_STREAM, 0);
  199. X    if (s < 0)
  200. X    {
  201. X        log("can't get socket to remote server\n");
  202. X        return(-1);
  203. X    }
  204. X
  205. X    /*
  206. X     * time out on connection rather quickly.
  207. X     */
  208. X    alarm(5);
  209. X    if (connect(s, (char *)&sin, sizeof (sin)) < 0) {
  210. X        alarm(0);
  211. X        log("can't connect to server\n");
  212. X        close(s);
  213. X        return(-1);
  214. X    }
  215. X    alarm(0);
  216. X    return(s);
  217. X}
  218. X
  219. Xalarmsig()
  220. X{
  221. X    log("timeout\n");
  222. X    errno = EINTR;
  223. X}
  224. X
  225. Xlog(x1, x2, x3, x4, x5, x6, x7, x8, x9)
  226. X{
  227. X    char        buf[ BUFSIZ ];
  228. X    register char    *p = buf;
  229. X    static boolean    printpid = TRUE;
  230. X
  231. X    *p = '\0';
  232. X    if (printpid)
  233. X    {
  234. X        sprintf(p, "(%d)", current_pid);
  235. X        p += strlen(p);
  236. X        if (errno)
  237. X        {
  238. X            sprintf(p, "%s: ", sys_errlist[ errno ]);
  239. X            p += strlen(p);
  240. X            errno = 0;
  241. X        }
  242. X    }
  243. X    sprintf(p, x1, x2, x3, x4, x5, x6, x7, x8, x9);
  244. X    p += strlen(p);
  245. X    if (*(p-1) == '\n')
  246. X        printpid = TRUE;
  247. X    else
  248. X        printpid = FALSE;
  249. X    write(2, buf, p-buf);
  250. X}
  251. X
  252. Xlog_fatal(x1, x2, x3, x4, x5, x6, x7, x8, x9)
  253. X{
  254. X    static boolean        entered = FALSE;
  255. X
  256. X    if (! entered)
  257. X    {
  258. X        entered = TRUE;
  259. X        log ("fileserver: FATAL ERROR: ");
  260. X        log (x1, x2, x3, x4, x5, x6, x7, x8, x9);
  261. X        cleanup();
  262. X    }
  263. X    exit (1);
  264. X}
  265. X
  266. X/*
  267. X * Set up the log file for the current process.  If there is no current
  268. X * host defined, then we are the sentry server and simply use the
  269. X * standard logfile:  this should be done once only.  If 'host' is defined,
  270. X * then set up a logfile for this particular connection.
  271. X *
  272. X * The sentry server always puts his signature at the top of the file
  273. X * (pid number).  So as a side effect, the global variable last_sentry
  274. X * is set to this signature (if there exists one).
  275. X */
  276. Xsetlogfile()
  277. X{
  278. X    char    buf[ BUFSIZ ];
  279. X    register char    *pbuf = buf;
  280. X    register long    newstderr;
  281. X    boolean    sentry = FALSE;
  282. X    FILE    *fd;
  283. X
  284. X    if (logfile)
  285. X        free (logfile);
  286. X    if (host == NULL)
  287. X    {
  288. X        sentry = TRUE;
  289. X        strcpy(pbuf, stdlogfile);
  290. X    }
  291. X    else
  292. X        sprintf(pbuf, "%s.%s.%d",
  293. X            stdlogfile, host->h_names[0], current_pid);
  294. X    logfile = malloc(strlen(pbuf)+1);
  295. X    strcpy(logfile, pbuf);
  296. X
  297. X    /*
  298. X     * Get the previous signature.
  299. X     */
  300. X    if (sentry) 
  301. X    {
  302. X        if ((fd = fopen(logfile, "r")) != NULL)
  303. X        {
  304. X            *pbuf = '\0';
  305. X            fgets(pbuf, BUFSIZ, fd);
  306. X            last_sentry = atoi(pbuf+1);
  307. X            fclose(fd);
  308. X        }
  309. X    }
  310. X
  311. X    newstderr = open(logfile, O_RDWR|O_APPEND|O_CREAT|O_TRUNC, 0444);
  312. X    if (newstderr < 0)
  313. X        log_fatal("cannot reopen stderr\n");
  314. X    dup2(newstderr, 2);
  315. X    close(newstderr);
  316. X    log("startup.\n");    /* put down our signature. */
  317. X}
  318. X
  319. Xcleanup()
  320. X{
  321. X    register process    *proc;
  322. X
  323. X    if (i_am_gateway && host)
  324. X        for (proc=host->h_proclist; proc; proc=proc->p_next)
  325. X            if (proc->p_handler != current_pid)
  326. X                sendsig(proc->p_handler, SIGKILL);
  327. X    mourne();
  328. X}
  329. X
  330. Xsndmsg(fd, msg, msglen, data, len)
  331. X    register struct message    *msg;
  332. X    register char    *data;
  333. X    register int    fd, msglen, len;
  334. X{
  335. X    register int    num;
  336. X    struct iovec    iov[2];
  337. X
  338. X
  339. X    showmsg(msg, TRUE);
  340. X    /*
  341. X     * set up for the write and if there is any data to send, try to send
  342. X     * a bunch of it.
  343. X     */
  344. X    if (len > 0 && data)
  345. X    {
  346. X        iov[0].iov_base = (char *)msg;
  347. X        iov[0].iov_len = msglen;
  348. X        iov[1].iov_base = data;
  349. X        iov[1].iov_len = len;
  350. X        if ((num = writev(fd, iov, 2)) == len + msglen)
  351. X        {
  352. X            debug8("wrote data and msg (%d)!!\n", len + msglen);
  353. X            return(TRUE);
  354. X        }
  355. X        debug8("wrote %d of %d msg + data\n", num, len+msglen);
  356. X        if (num < 0)
  357. X            return(FALSE);
  358. X        if (_rmtio(write, fd, data+num, len-num) <= 0)
  359. X            return(FALSE);
  360. X    }
  361. X    else if (_rmtio(write, fd, msg, msglen) <= 0)
  362. X        return(FALSE);
  363. X    return(TRUE);
  364. X}
  365. X
  366. X/*
  367. X * Read the next message.  Its format is null-separated hex-ascii strings.
  368. X * In order, they are:
  369. X *    total_length    length of this request
  370. X *    header_length    length of the message request (minus length of data)
  371. X *    pid        Process id on requesting machine
  372. X *    uid        user id of process on requesting machine
  373. X *    syscall        our internal syscall number
  374. X *    args...        between 0 and ?
  375. X *
  376. X * Followed by actual data (if any).  We grab the first two fields, and
  377. X * use them for making sure we read all that is necessary.  The remainder
  378. X * are returned in a array of character pointers.  It there is any data
  379. X * in this request, then it is pointed to by the last character pointer.
  380. X *
  381. X * The way that we read messages is as follows:
  382. X *
  383. X *    last message length = 0
  384. X *    while no more messages
  385. X *    do
  386. X *         if last message length > 0
  387. X *             gobbleup last message length bytes
  388. X *        peek at next message
  389. X *        if this message is for another process
  390. X *        then
  391. X *            wake up the other process
  392. X *            last message length = 0
  393. X *            go to sleep
  394. X *            continue
  395. X *        endif
  396. X *        if data in this message
  397. X *        then
  398. X *            read the message
  399. X *            last message length = 0
  400. X *        else
  401. X *            last message length = length of this message
  402. X *        endif
  403. X *        service request
  404. X *    done
  405. X */
  406. X
  407. Xstruct message *getmsg(fd)
  408. X    register long    fd;
  409. X{
  410. X    register long    cnt,
  411. X            lastcnt = 0,
  412. X            len;
  413. X    register struct message    *msg;
  414. X
  415. X    msg = (struct message *)getbuf(BIGBUF);
  416. X    /*
  417. X     * Check to see if there is a message still in the queue, that has
  418. X     * been processed, but not yet read.
  419. X     */
  420. X    gobble_last_msg(fd, msg);
  421. X    for (;;)
  422. X    {
  423. X        debug8("peek at fd %d... ", fd);
  424. X        cnt = recv(fd, (char *)msg, BIGBUF, MSG_PEEK);
  425. X        if (cnt < R_MINRMSG)
  426. X        {
  427. X            if (cnt < 0 && errno == EINTR)
  428. X                continue;
  429. X            debug8("eof, cnt=%d\n", cnt);
  430. X            return(NULL);
  431. X        }
  432. X        debug8("got %d from peek\n", cnt);
  433. X
  434. X        /*
  435. X         * Now find out how long the request is (excluding data)
  436. X         * and make sure that we have at least that amount.
  437. X         */
  438. X#ifdef magnolia
  439. X        len = msg->m_hdlen;
  440. X#else     /* magnolias don't need to do this garbage (MC68000) */
  441. X        msg->m_totlen = ntohl(msg->m_totlen);
  442. X        len = msg->m_hdlen = ntohs(msg->m_hdlen);
  443. X        msg->m_pid = ntohs(msg->m_pid);
  444. X        msg->m_uid = ntohs(msg->m_uid);
  445. X        msg->m_syscall = ntohs(msg->m_syscall);
  446. X        msg->m_args[0] = ntohl(msg->m_args[0]);
  447. X        msg->m_args[1] = ntohl(msg->m_args[1]);
  448. X        msg->m_args[2] = ntohl(msg->m_args[2]);
  449. X        msg->m_args[3] = ntohl(msg->m_args[3]);
  450. X#endif
  451. X        if (len > cnt)
  452. X        {
  453. X            if (cnt == lastcnt)
  454. X            {
  455. X                log("most but not all of message is in\n");
  456. X                dumpmsg(msg, cnt);
  457. X                return(NULL);
  458. X            }
  459. X            else
  460. X                debug8("didn't get all of message headder\n");
  461. X            lastcnt = cnt;
  462. X            sleep(5);
  463. X        }
  464. X        else if (len < R_MINRMSG)
  465. X        {
  466. X            log("bad soft msg len=%d, got %d\n", len, cnt);
  467. X            dumpmsg(msg, cnt);
  468. X            if (i_am_gateway)
  469. X                log_fatal("");
  470. X            say_something(S_CORRUPTED, 0);
  471. X            sendsig(current_pid, SIGSTOP);
  472. X        }
  473. X        else
  474. X            break;
  475. X    }
  476. X    showmsg(msg, FALSE);
  477. X    return(msg);
  478. X}
  479. X
  480. X/*
  481. X * Here we format the response to be sent to the client.  Note that
  482. X * the client can never tolerate a message shorter than
  483. X * R_MINRMSG + sizeof(long).  The declaration of x0-xf is for the
  484. X * sake of stupid Pyramid argument conventions.
  485. X */
  486. Xsendreturn(proc, fd, data, cnt,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)
  487. X    process        *proc;
  488. X    register long    cnt;
  489. X    register char    *data;
  490. X    long        fd;
  491. X{
  492. X    char    buf[ BUFSIZ ];
  493. X    struct message        msgbuf;
  494. X    register struct message    *msg = &msgbuf;
  495. X    register    *argp = &x0, msglen, i;
  496. X
  497. X    msg->m_errno = htons(proc->p_errno);
  498. X    msg->m_pid = htons(proc->p_pid);
  499. X    msg->m_uid = htons(proc->p_uid);
  500. X    if (proc->p_errno > 0) /* -1 is valid errno: says its a local file */
  501. X    {
  502. X        msglen = R_MINRMSG + sizeof(long);
  503. X        msg->m_totlen = htonl(msglen);
  504. X        proc->p_returnval = -1;
  505. X    }
  506. X    else
  507. X    {
  508. X        msglen = R_MINRMSG + (cnt+1)*sizeof(long);
  509. X        if (data)
  510. X            msg->m_totlen = htonl(msglen + proc->p_returnval);
  511. X        else
  512. X            msg->m_totlen = htonl(msglen);
  513. X#ifdef pyr /* Pyramid */
  514. X        msg->m_args[ R_RETVAL+1 ] = htonl(x0);
  515. X        msg->m_args[ R_RETVAL+2 ] = htonl(x1);
  516. X        msg->m_args[ R_RETVAL+3 ] = htonl(x2);
  517. X        msg->m_args[ R_RETVAL+4 ] = htonl(x3);
  518. X        msg->m_args[ R_RETVAL+5 ] = htonl(x4);
  519. X        msg->m_args[ R_RETVAL+6 ] = htonl(x5);
  520. X        msg->m_args[ R_RETVAL+7 ] = htonl(x6);
  521. X        msg->m_args[ R_RETVAL+8 ] = htonl(x7);
  522. X        msg->m_args[ R_RETVAL+9 ] = htonl(x8);
  523. X        msg->m_args[ R_RETVAL+10 ] = htonl(x9);
  524. X        msg->m_args[ R_RETVAL+11 ] = htonl(xa);
  525. X        msg->m_args[ R_RETVAL+12 ] = htonl(xb);
  526. X        msg->m_args[ R_RETVAL+13 ] = htonl(xc);
  527. X        msg->m_args[ R_RETVAL+14 ] = htonl(xd);
  528. X        msg->m_args[ R_RETVAL+15 ] = htonl(xe);
  529. X        msg->m_args[ R_RETVAL+16 ] = htonl(xf);
  530. X#else pyr
  531. X        for (i=0; i<cnt; i++)
  532. X            msg->m_args[ R_RETVAL+1+i ] = htonl(argp[ i ]);
  533. X#endif
  534. X    }
  535. X    msg->m_args[ R_RETVAL ] = htonl(proc->p_returnval);
  536. X    msg->m_hdlen = htons(msglen);
  537. X    sndmsg(fd, msg, msglen, data, proc->p_returnval);
  538. X    errno = 0;
  539. X}
  540. X
  541. X_shutdown(fd)
  542. X    int    fd;
  543. X{
  544. X    log("shutdown fd %d\n", fd);
  545. X    close(fd);
  546. X}
  547. X
  548. Xchar *getbuf(size)
  549. X{
  550. X    static char    *buf, *calloc(), *realloc();
  551. X    static int    cursize;
  552. X    static int    highwater;
  553. X
  554. X    if (size > highwater)
  555. X    {
  556. X        if (buf == NULL)
  557. X            buf = calloc(cursize = size, sizeof(char));
  558. X        else
  559. X        {
  560. X            buf = realloc(buf, highwater = size);
  561. X            debug8("resize buffer to %d\n", size);
  562. X        }
  563. X        highwater = size;
  564. X        if (buf == NULL)
  565. X            log_fatal("cannot allocate buffer space\n");
  566. X    }
  567. X    return(buf);
  568. X}
  569. X
  570. Xchar *get_data_buf(size)
  571. X{
  572. X    static char    *buf, *malloc(), *realloc();
  573. X    static int    cursize;
  574. X    static int    highwater;
  575. X
  576. X    if (size > highwater)
  577. X    {
  578. X        if (buf == NULL)
  579. X            buf = malloc(cursize = size);
  580. X        else
  581. X        {
  582. X            buf = realloc(buf, highwater = size);
  583. X            debug8("resize data buffer to %d\n", size);
  584. X        }
  585. X        highwater = size;
  586. X        if (buf == NULL)
  587. X            log_fatal("cannot allocate data buffer space\n");
  588. X    }
  589. X    return(buf);
  590. X}
  591. X
  592. Xgobble_last_msg(fd, msg)
  593. X    register long        fd;
  594. X    register struct message    *msg;
  595. X{
  596. X    if (msg->m_totlen)
  597. X    {
  598. X        debug8("gobble up last %d byte message... ", msg->m_totlen);
  599. X        _rmtio(read, fd, msg, msg->m_totlen);
  600. X        msg->m_totlen = 0;
  601. X    }
  602. X}
  603. X
  604. X_rmtio(iofunc, fd, buf, len)
  605. X    register func    iofunc;
  606. X    register int    fd, len;
  607. X    register char    *buf;
  608. X{
  609. X    register int    cnt, need = len;
  610. X
  611. X    debug8("io %d bytes, fd=%d...", len, fd);
  612. X    while(need)
  613. X    {
  614. X        if ((cnt = (*iofunc)(fd, buf+len-need, need)) <= 0)
  615. X        {
  616. X            _shutdown(fd);
  617. X            return(cnt);
  618. X        }
  619. X        need -= cnt;
  620. X    }
  621. X    debug8("did %d.\n", len - need);
  622. X    return(len);
  623. X}
  624. X
  625. X_rmtiov(iofunc, fd, iovec, len)
  626. X    register func    iofunc;
  627. X    register int    fd, len;
  628. X    register struct iovec    *iovec;
  629. X{
  630. X
  631. X    debug8("io %d vectors, fd=%d...", len, fd);
  632. X    if ((len = (*iofunc)(fd, iovec, len)) <= 0)
  633. X        _shutdown(fd);
  634. X    debug8("did %d.\n", len);
  635. X    return(len);
  636. X}
  637. X
  638. X/*
  639. X * Show the message in characters and hex.
  640. X */
  641. Xdumpmsg(msg, len)
  642. X    char    *msg;
  643. X    long    len;
  644. X{
  645. X    char    string[ 100 ], *pstring = string,
  646. X        words[ 100 ], *pwords = words,
  647. X        dwords[ 100 ], *pdwords = dwords,
  648. X        longs[ 100 ], *plongs = longs,
  649. X        *p;
  650. X    long    cnt = 0;
  651. X
  652. X    for(p = msg; cnt<len; cnt++, p++)
  653. X    {
  654. X        /* character */
  655. X        if (*p >= ' ')
  656. X            sprintf(pstring, "%c  ", *p > '~' ? '?' : *p);
  657. X        else
  658. X            sprintf(pstring, "^%c ", *p | 0x40);
  659. X        pstring += 3;
  660. X        if ((cnt & 0x1) == 0)
  661. X        {
  662. X            sprintf(pwords, "%-4.4x  ",
  663. X                *((unsigned short *)p));
  664. X            sprintf(pdwords, "%-5.5d ",
  665. X                *((unsigned short *)p));
  666. X            pwords += 6;
  667. X            pdwords += 6;
  668. X        }
  669. X        if ((cnt & 0x3) == 0)
  670. X        {
  671. X            sprintf(plongs, "%-8.8x    ", *((long *)p));
  672. X            plongs += 12;
  673. X        }
  674. X        if (pstring >= string+72)
  675. X        {    
  676. X            log("%s\n", pstring = string);
  677. X            log("%s\n", pwords = words);
  678. X            log("%s\n", pdwords = dwords);
  679. X            log("%s\n\n", plongs = longs);
  680. X        }
  681. X    }
  682. X    log("%s\n", string);
  683. X    log("%s\n", words);
  684. X    log("%s\n", dwords);
  685. X    log("%s\n", longs);
  686. X}
  687. X
  688. X#ifdef RFSDEBUG
  689. X
  690. Xshowmsg(msg, fromserver)
  691. X    register struct message    *msg;
  692. X    long    fromserver;
  693. X{
  694. X    register long    end, len, pid, uid, totlen;
  695. X
  696. X    if ((remote_debug & 0x100) == 0)
  697. X        return;
  698. X    if (fromserver)
  699. X        len = ntohs(msg->m_hdlen),
  700. X        totlen = ntohl(msg->m_totlen),
  701. X        pid = ntohs(msg->m_pid),
  702. X        uid = ntohs(msg->m_uid);
  703. X    else
  704. X        len = msg->m_hdlen,
  705. X        totlen = msg->m_totlen,
  706. X        pid = msg->m_pid,
  707. X        uid = msg->m_uid;
  708. X    log("%s server: len=%d,tot=%d,pid=%d,uid=%d",
  709. X        fromserver ? "from" : "to", len, totlen, pid, uid);
  710. X
  711. X    /* round up into long words */
  712. X    len = (len - R_MINRMSG + 3) >> 2;
  713. X    if (fromserver)
  714. X    {
  715. X        log(",errno=%d,retval=%d",
  716. X            htons(msg->m_errno), htonl(msg->m_args[ R_RETVAL ]));
  717. X        end = R_RETVAL+1;
  718. X    }
  719. X    else
  720. X    {
  721. X        log(",syscall=%d", msg->m_syscall);
  722. X        end = 0;
  723. X    }
  724. X    for (; end<len; end++)
  725. X        log(",0x%x", ntohl(msg->m_args[ end ]));
  726. X    log("\n");
  727. X}
  728. X
  729. X/*
  730. X * Set new debug levels.
  731. X */
  732. Xnewdebug()
  733. X{
  734. X    register long    fd, cnt;
  735. X    char    *dbfile = "/usr/tmp/rfs_debug",
  736. X        buf[ BUFSIZ ];
  737. X    register char    *p = buf;
  738. X
  739. X    fd = open(dbfile, O_RDONLY);
  740. X    if (fd < 0) {
  741. X        log("can't open %s\n", dbfile);
  742. X        goto out;
  743. X    }
  744. X
  745. X    cnt = read(fd, buf, BUFSIZ);
  746. X    close(fd);
  747. X    if (cnt <= 0) {
  748. X        log("can't read %s\n", dbfile);
  749. X        goto out;
  750. X    }
  751. X
  752. X    while ((*p >= 'a' && *p <= 'f')
  753. X        || (*p >= 'A' && *p <= 'F')
  754. X        || (*p >= '0' && *p <= '9'))
  755. X        p++;
  756. X    *p = '\0';
  757. X    remote_debug = atox(buf);
  758. Xout:
  759. X    log("debug=%x\n", remote_debug);
  760. X}
  761. X#endif RFSDEBUG
  762. SHAREOF
  763. chmod 444 remote/serverio.c
  764. #
  765. # remote/serversyscall.c
  766. #
  767. if [ -f remote/serversyscall.c ]; then 
  768.     echo -n 'Hit <return> to overwrite remote/serversyscall.c or ^C to quit' 
  769.     read ans 
  770.     rm -f remote/serversyscall.c 
  771. fi 
  772.  
  773. sed -e 's/^.//' << \SHAREOF > remote/serversyscall.c
  774. X/*
  775. X * Copyright 1985, Todd Brunhoff.
  776. X *
  777. X * This software was written at Tektronix Computer Research Laboratories
  778. X * as partial fulfillment of a Master's degree at the University of Denver.
  779. X * This is not Tektronix proprietary software and should not be
  780. X * confused with any software product sold by Tektronix.  No warranty is
  781. X * expressed or implied on the reliability of this software; the author,
  782. X * the University of Denver, and Tektronix, inc. accept no liability for
  783. X * any damage done directly or indirectly by this software.  This software
  784. X * may be copied, modified or used in any way, without fee, provided this
  785. X * notice remains an unaltered part of the software.
  786. X *
  787. X * $Log:    serversyscall.c,v $
  788. X * Revision 2.0  85/12/07  18:22:44  toddb
  789. X * First public release.
  790. X * 
  791. X */
  792. Xstatic char    *rcsid = "$Header: serversyscall.c,v 2.0 85/12/07 18:22:44 toddb Rel $";
  793. X#include    "server.h"
  794. X#include    <sys/stat.h>
  795. X#include    <sys/dir.h>
  796. X#include    <sys/file.h>
  797. X#include    <sys/user.h>
  798. X#include    <errno.h>
  799. X
  800. Xextern char    *syscallnames[];
  801. Xextern short    current_pid;
  802. Xextern short    gateway_server;
  803. Xextern boolean    i_am_gateway;
  804. Xextern boolean    in_root_directory;
  805. Xextern syscallmap    smap[];
  806. Xextern struct stat    filetypes[];
  807. Xextern hosts    *host;
  808. Xextern long    errno;
  809. X
  810. Xs_fork(msg, proc)
  811. X    register struct message    *msg;
  812. X    register process    *proc;
  813. X{
  814. X    register process    *newproc;
  815. X    register long    newpid = msg->m_args[ 0 ],
  816. X                i, fd;
  817. X    register short    syscall = msg->m_syscall;
  818. X    boolean needtofork = FALSE;
  819. X
  820. X    if (newproc = findprocess(newpid, msg->m_uid))
  821. X        debug1("%d = %sfork(%d), redundant\n",
  822. X            newpid, syscall == RSYS_vfork ? "v" : "",
  823. X            msg->m_args[ 1 ]);
  824. X    else
  825. X    {
  826. X        debug1("%d = %sfork(%d)\n",
  827. X            newpid, syscall == RSYS_vfork ? "v" : "",
  828. X            proc->p_pid);
  829. X        newproc = add_new_process(msg->m_uid, newpid);
  830. X        for (i=0; i<NOFILE; i++)
  831. X            if ((fd = proc->p_fds[ i ]) >= 0)
  832. X                newproc->p_fds[ i ] = fd, needtofork = TRUE;
  833. X
  834. X        if (needtofork)
  835. X            become_server(msg);
  836. X        else if (! i_am_gateway)
  837. X            say_something(S_NEWPROCESS, newpid);
  838. X    }
  839. X    /*
  840. X     * No return message is sent!
  841. X     */
  842. X}
  843. X
  844. Xs_read(msg, proc)
  845. X    register struct message  *msg;
  846. X    register process    *proc;
  847. X{
  848. X    register long    clientfd = msg->m_args[0],
  849. X            fd,
  850. X            size = msg->m_args[1];
  851. X    register char    *buf = get_data_buf(size);
  852. X
  853. X    fd = MAPFD(clientfd, proc);
  854. X    proc->p_returnval = read(fd, buf, size);
  855. X    proc->p_errno = fixdir(fd, buf, proc->p_returnval);
  856. X    debug1("%d = read(%d->%d, 0x%x, %d);\n",
  857. X        proc->p_returnval, clientfd, fd, buf, size);
  858. X    sendreturn(proc, host->h_cmdfd, buf, 0);
  859. X}
  860. X
  861. Xs_write(msg, proc)
  862. X    register struct message  *msg;
  863. X    register process    *proc;
  864. X{
  865. X    register long    clientfd = msg->m_args[0],
  866. X            fd,
  867. X            size = msg->m_args[1],
  868. X            totlen = msg->m_totlen;
  869. X    register char    *buf;
  870. X
  871. X    if (totlen > BIGBUF)
  872. X        msg = (struct message *)getbuf(totlen);
  873. X    buf = (char *)&msg->m_args[R_DATA];
  874. X    gobble_last_msg(host->h_cmdfd, msg);
  875. X    fd = MAPFD(clientfd, proc);
  876. X    proc->p_returnval = write(fd, buf, size);
  877. X    proc->p_errno = errno;
  878. X    debug1("%d = write(%d->%d, 0x%x, %d);\n",
  879. X        proc->p_returnval, clientfd, fd, buf, size);
  880. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  881. X}
  882. X
  883. X/*
  884. X * Open a file.  Also interface for creat().  Note that we pass back
  885. X * the current file offset.
  886. X */
  887. Xs_open(msg, proc)
  888. X    struct message      *msg;
  889. X    register process    *proc;
  890. X{
  891. X#define mask        args[ 3 ]
  892. X#define    clientfd    args[ 2 ]
  893. X#define    mode        args[ 1 ]
  894. X#define    flags        args[ 0 ]
  895. X
  896. X    register long    ourfd,
  897. X            *args = msg->m_args;
  898. X    register char    *path = path1addr(msg);
  899. X
  900. X    change_to_umask(mask);
  901. X    ourfd = open(path, flags, mode);
  902. X    proc->p_errno = errno;
  903. X    proc->p_returnval =  allocate_fd(ourfd, proc, clientfd);
  904. X    debug1("%d = open(\"%s\", 0%o, %d)\n",
  905. X        proc->p_returnval, path, flags, mode);
  906. X    sendreturn(proc, host->h_cmdfd, NULL, 1, lseek(ourfd, 0, L_INCR));
  907. X
  908. X#undef    mask
  909. X#undef    clientfd
  910. X#undef    mode
  911. X#undef    flags
  912. X}
  913. X
  914. Xs_fd1(msg, proc)
  915. X    register struct message  *msg;
  916. X    register process    *proc;
  917. X{
  918. X    register long    clientfd = msg->m_args[0],
  919. X            fd,
  920. X            syscall = msg->m_syscall;
  921. X
  922. X    fd = MAPFD(clientfd, proc);
  923. X    /*
  924. X     * No return sent for close or fsync!
  925. X     */
  926. X    if (syscall == RSYS_close || syscall == RSYS_fsync)
  927. X        proc->p_returnval = deallocate_fd(proc, msg->m_args[0]);
  928. X    else
  929. X    {
  930. X        proc->p_returnval = (*smap[ syscall ].s_syscall)(fd);
  931. X        proc->p_errno = errno;
  932. X        if (syscall != RSYS_fsync)
  933. X            sendreturn(proc, host->h_cmdfd, NULL, 0);
  934. X    }
  935. X    debug1("%d = %s(%d->%d)\n",
  936. X        proc->p_returnval, syscallnames[ syscall ], clientfd, fd);
  937. X}
  938. X
  939. Xs_fd1_plus(msg, proc)
  940. X    register struct message  *msg;
  941. X    register process    *proc;
  942. X{
  943. X#define    arg1        msg->m_args[1]
  944. X#define    arg2        msg->m_args[2]
  945. X    register long    clientfd = msg->m_args[0],
  946. X            fd;
  947. X
  948. X    fd = MAPFD(clientfd, proc);
  949. X    proc->p_returnval = (*smap[ msg->m_syscall ].s_syscall)(fd, arg1, arg2);
  950. X    proc->p_errno = errno;
  951. X    debug1("%d = %s(%d->%d, %d(0%o), %d(0%o))\n",
  952. X        proc->p_returnval, syscallnames[ msg->m_syscall ],
  953. X        clientfd, fd, arg1, arg1, arg2, arg2);
  954. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  955. X#undef    arg1
  956. X#undef    arg2
  957. X}
  958. X
  959. X/*
  960. X * link, symlink and rename
  961. X */
  962. Xs_path2(msg, proc)
  963. X    register struct message  *msg;
  964. X    register process    *proc;
  965. X{
  966. X#define    mask    msg->m_args[0]
  967. X    register char    *path1, *path2;
  968. X    register short    syscall = msg->m_syscall;
  969. X
  970. X    change_to_umask(mask);
  971. X    path2 = twopath2addr(msg);
  972. X    path1 = twopath1addr(msg);
  973. X    proc->p_returnval = (*smap[ syscall ].s_syscall)(path1, path2);
  974. X    proc->p_errno = errno;
  975. X    debug1("%d = %s(\"%s\", \"%s\")\n", syscallnames[ syscall ],
  976. X        proc->p_returnval, path1, path2);
  977. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  978. X#undef    mask
  979. X}
  980. X
  981. Xs_path1(msg, proc)
  982. X    register struct message  *msg;
  983. X    register process    *proc;
  984. X{
  985. X    register char    *path;
  986. X    register short    syscall = msg->m_syscall;
  987. X    register long    mask = msg->m_args[0];
  988. X    struct stat    statb;
  989. X    extern struct stat    root;
  990. X    register struct    stat *statp = &statb;
  991. X
  992. X    change_to_umask(mask);
  993. X    path = path1addr(msg);
  994. X    proc->p_returnval = (*smap[ syscall ].s_syscall)(path);
  995. X    proc->p_errno = errno;
  996. X    debug1("%d = %s(\"%s\")\n",
  997. X        proc->p_returnval, syscallnames[ syscall ], path);
  998. X    if (syscall == RSYS_chdir)
  999. X        if (proc->p_returnval == -1)
  1000. X            debug1("can't chdir to %s\n", path);
  1001. X        else
  1002. X        {
  1003. X            if (stat(".", statp) == 0 && isroot(statp))
  1004. X                in_root_directory = TRUE;
  1005. X            else
  1006. X                in_root_directory = FALSE;
  1007. X            debug10("Now I'm %sin root\n",
  1008. X                !in_root_directory ? "not " : "");
  1009. X        }
  1010. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1011. X}
  1012. X
  1013. Xs_access(msg, proc)
  1014. X    register struct message  *msg;
  1015. X    register process    *proc;
  1016. X{
  1017. X    register char    *path;
  1018. X    register long    perm = msg->m_args[0];
  1019. X
  1020. X    path = path1addr(msg);
  1021. X    
  1022. X    /*
  1023. X     * The kernel access is strange:  it first sets the effective uid
  1024. X     * and gid to be the real uid/gid and THEN it does the access.
  1025. X     * Well, our real uid is always 0 (so we can change our effective
  1026. X     * uid at will), so the effect is different than a normal user
  1027. X     * would expect.  i.e. access always succeeds no matter what
  1028. X     * the arguments.  This is clearly not what we want, so we apply
  1029. X     * an awful kludge here; change our real uid to be the user we
  1030. X     * are pretending to be, and then call access.
  1031. X     */
  1032. X    change_to_uid(0);
  1033. X    setreuid(proc->p_ruser->r_user->u_local_uid, 0);
  1034. X    proc->p_returnval = access(path, perm);
  1035. X    proc->p_errno = errno;
  1036. X    debug1("%d = access(\"%s\", 0%o\n", proc->p_returnval, path, perm);
  1037. X    setreuid(0, 0);
  1038. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1039. X}
  1040. X
  1041. Xs_path1_plus(msg, proc)
  1042. X    register struct message  *msg;
  1043. X    register process    *proc;
  1044. X{
  1045. X    register char    *path;
  1046. X    register long    syscall = msg->m_syscall,
  1047. X            arg1 = msg->m_args[0],
  1048. X            arg2 = msg->m_args[1],
  1049. X            mask = msg->m_args[2];
  1050. X
  1051. X    path = path1addr(msg);
  1052. X    change_to_umask(mask);
  1053. X    
  1054. X    proc->p_returnval = (*smap[ syscall ].s_syscall)(path, arg1, arg2);
  1055. X    proc->p_errno = errno;
  1056. X    debug1("%d = %s(\"%s\", %d(0%o), %d(%o))\n",
  1057. X        proc->p_returnval,
  1058. X        syscallnames[ syscall ], path, arg1, arg1, arg2, arg2);
  1059. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1060. X}
  1061. X
  1062. Xs_stat(msg, proc)
  1063. X    register struct message  *msg;
  1064. X    register process    *proc;
  1065. X{
  1066. X    union a {
  1067. X        char    *path;
  1068. X        long    fd;
  1069. X    } arg;
  1070. X    register short    syscall = msg->m_syscall;
  1071. X    register long    clientfd = msg->m_args[0];
  1072. X    struct stat        statbuf;
  1073. X    register struct stat    *statp = &statbuf;
  1074. X
  1075. X    if (syscall == RSYS_fstat)
  1076. X        arg.fd = MAPFD(clientfd, proc);
  1077. X    else
  1078. X        arg.path = path1addr(msg);
  1079. X    proc->p_returnval = (*smap[ syscall ].s_syscall)(arg.path, statp);
  1080. X    proc->p_errno = errno;
  1081. X#ifdef RFSDEBUG
  1082. X    if (syscall == RSYS_fstat)
  1083. X        debug1("%d = fstat(%d->%d, 0x%x)\n",
  1084. X            proc->p_returnval, clientfd, arg.fd, &statbuf);
  1085. X    else
  1086. X        debug1("%d = %s(\"%s\", 0x%x)\n", proc->p_returnval,
  1087. X            syscallnames[ syscall ], arg.path, &statbuf);
  1088. X#endif RFSDEBUG
  1089. X    if (proc->p_returnval == -1)
  1090. X        sendreturn(proc, host->h_cmdfd, NULL, 0);
  1091. X    else
  1092. X        sendreturn(proc, host->h_cmdfd, NULL, 14,
  1093. X            statp->st_dev,
  1094. X            statp->st_ino,
  1095. X            statp->st_mode,
  1096. X            statp->st_nlink,
  1097. X            statp->st_uid,
  1098. X            statp->st_gid,
  1099. X            statp->st_rdev,
  1100. X            statp->st_size,
  1101. X            statp->st_atime,
  1102. X            statp->st_mtime,
  1103. X            statp->st_ctime,
  1104. X            statp->st_blksize,
  1105. X            statp->st_blocks,
  1106. X            isroot(statp));
  1107. X}
  1108. X
  1109. Xs_lseek(msg, proc)
  1110. X    register struct message  *msg;
  1111. X    register process    *proc;
  1112. X{
  1113. X    register long    clientfd = msg->m_args[0], fd;
  1114. X
  1115. X    fd = MAPFD(clientfd, proc);
  1116. X    proc->p_returnval = lseek(fd, msg->m_args[1], msg->m_args[2]);
  1117. X    proc->p_errno = errno;
  1118. X    debug1("%d = lseek(%d->%d, %d, %d)\n", proc->p_returnval,
  1119. X        clientfd, fd, msg->m_args[1], msg->m_args[2]);
  1120. X    if (msg->m_syscall == RSYS_lseek)
  1121. X        sendreturn(proc, host->h_cmdfd, NULL, 0);
  1122. X}
  1123. X
  1124. Xs_dup(msg, proc)
  1125. X    register struct message  *msg;
  1126. X    register process    *proc;
  1127. X{
  1128. X    register long    clientfd = msg->m_args[0], fd,
  1129. X            newclientfd = msg->m_args[1],
  1130. X            ourfd,
  1131. X            newfd;
  1132. X
  1133. X    fd = MAPFD(clientfd, proc);
  1134. X    if (msg->m_syscall == RSYS_dup2)
  1135. X    {
  1136. X        newfd = MAPFD(newclientfd, proc);
  1137. X        if (newfd >= 0)
  1138. X        {
  1139. X            proc->p_returnval = deallocate_fd(proc, newclientfd, 0);
  1140. X            debug1("%d = (dup2)close(%d->%d)... ",
  1141. X                proc->p_returnval, newclientfd, newfd);
  1142. X        }
  1143. X    }
  1144. X    if (fd >= 0)
  1145. X    {
  1146. X        ourfd = dup(fd);
  1147. X        proc->p_returnval =  allocate_fd(ourfd, proc, newclientfd);
  1148. X        proc->p_errno = errno;
  1149. X    }
  1150. X    else if (msg->m_syscall == RSYS_dup2 && newfd >= 0)
  1151. X        proc->p_returnval = newclientfd;
  1152. X    else
  1153. X    {
  1154. X        proc->p_returnval = -1;
  1155. X        proc->p_errno = EINVAL;
  1156. X    }
  1157. X    debug1("%d = dup(%d->%d)\n", proc->p_returnval, clientfd, fd);
  1158. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1159. X}
  1160. X
  1161. Xs_ioctl(msg, proc)
  1162. X    struct message  *msg;
  1163. X    process    *proc;
  1164. X{
  1165. X    long    fd = msg->m_args[0];
  1166. X}
  1167. X
  1168. Xs_readlink(msg, proc)
  1169. X    register struct message  *msg;
  1170. X    register process    *proc;
  1171. X{
  1172. X    register long    size = msg->m_args[0];
  1173. X    register char    *buf = get_data_buf(size),
  1174. X            *path = path1addr(msg);
  1175. X
  1176. X    proc->p_returnval = readlink(path, buf, size);
  1177. X    proc->p_errno = errno;
  1178. X    debug1("%d = readlink(\"%s\", 0x%x, %d);\n",
  1179. X        proc->p_returnval, path, buf, size);
  1180. X    sendreturn(proc, host->h_cmdfd, buf, 0);
  1181. X}
  1182. X
  1183. X/*
  1184. X * Send exec information the remote host.
  1185. X */
  1186. Xs_execinfo(msg, proc)
  1187. X    register struct message  *msg;
  1188. X    register process    *proc;
  1189. X{
  1190. X    register long    hdrsize = msg->m_args[ 0 ],
  1191. X            red,
  1192. X            err = 0,
  1193. X            msglen = R_MINRMSG + sizeof(long)*R_EXECDATA;
  1194. X    register char    *path = path1addr(msg),
  1195. X            *p;
  1196. X    struct stat    st;
  1197. X    struct message    msgbuf;
  1198. X
  1199. X    errno = 0;
  1200. X    if (hdrsize > (R_MAXARGS - R_EXECDATA)*sizeof(long))
  1201. X    {
  1202. X        log("exec: hdrsize = %d!!\n", hdrsize);
  1203. X        err = EINVAL;
  1204. X        goto done;
  1205. X    }
  1206. X    /*
  1207. X     * Start building the outgoing message... get header,
  1208. X     * check permissions and open file.
  1209. X     */
  1210. X    msg = &msgbuf;
  1211. X    if ((proc->p_execfd = open(path, O_RDONLY)) == -1)
  1212. X        goto done;
  1213. X    fstat(proc->p_execfd, &st);
  1214. X    if ((st.st_mode & S_IFMT) != S_IFREG
  1215. X    || ! myaccess(&st, proc->p_ruser->r_user, X_OK))
  1216. X    {
  1217. X        err = ENOEXEC;
  1218. X        debug12("%s mode=0%o %sreg file, %sexecutable\n",
  1219. X            path, st.st_mode,
  1220. X            (st.st_mode & S_IFMT) != S_IFREG ? "not " : "",
  1221. X            myaccess(&st, proc->p_ruser->r_user, X_OK) ?
  1222. X            "" : "not ");
  1223. X        goto done;
  1224. X    }
  1225. X    msg->m_args[ R_EXECREADONLY ] =
  1226. X        (myaccess(&st, proc->p_ruser->r_user, W_OK) == FALSE);
  1227. X    msg->m_args[R_EXECDATA] = 0; /* for zero-length files */
  1228. X    red = read(proc->p_execfd, msg->m_args + R_EXECDATA, hdrsize);
  1229. X    if (red <= 0)
  1230. X    {
  1231. X        debug12("read on exec fd %d=%d\n", proc->p_execfd, red);
  1232. X        err = EINVAL;
  1233. X        goto done;
  1234. X    }
  1235. X    msglen += red;
  1236. X
  1237. X
  1238. X    /*
  1239. X     * Check setuid/setgid info
  1240. X     */
  1241. X    if (st.st_mode & S_ISUID)
  1242. X        msg->m_args[ R_EXECUID ] = htonl(st.st_uid);
  1243. X    else
  1244. X        msg->m_args[ R_EXECUID ] = htonl(-1);
  1245. X    if (st.st_mode & S_ISGID)
  1246. X        msg->m_args[ R_EXECGID ] = htonl(st.st_gid);
  1247. X    else
  1248. X        msg->m_args[ R_EXECGID ] = htonl(-1);
  1249. X
  1250. Xdone:
  1251. X    proc->p_execstarted = FALSE;
  1252. X    msg->m_hdlen = htons(msglen);
  1253. X    msg->m_totlen = htonl(msglen);
  1254. X    if (errno)
  1255. X        err = errno;
  1256. X    if (err)
  1257. X    {
  1258. X        debug12("execinfo: err=%d\n", err);
  1259. X        close(proc->p_execfd);
  1260. X        proc->p_execfd = -1;
  1261. X    }
  1262. X    debug1("%d = execve(\"%s\");\n", proc->p_returnval, path);
  1263. X    if (msg->m_errno = htons(err))
  1264. X        msg->m_args[ R_RETVAL ] = htonl(-1);
  1265. X    else
  1266. X        msg->m_args[ R_RETVAL ] = htonl(st.st_size);
  1267. X    msg->m_pid = htons(proc->p_pid);
  1268. X    msg->m_uid = htons(proc->p_uid);
  1269. X    sndmsg(host->h_cmdfd, msg, msglen, 0, 0);
  1270. X}
  1271. X
  1272. X/*
  1273. X * Send exec text and data to remote host.
  1274. X */
  1275. Xs_execread(msg, proc)
  1276. X    struct message  *msg;
  1277. X    process    *proc;
  1278. X{
  1279. X    register long    fd = proc->p_execfd,
  1280. X            hdrsize = msg->m_args[0],
  1281. X            size = msg->m_args[1],
  1282. X            red;
  1283. X    register char    *buf = get_data_buf(size);
  1284. X
  1285. X    if (!proc->p_execstarted)
  1286. X    {
  1287. X        if (lseek(fd, hdrsize, 0) != hdrsize)
  1288. X        {
  1289. X            log("can't seek to %d on fd %d for exec\n",
  1290. X                hdrsize, fd);
  1291. X            proc->p_errno = EINVAL;
  1292. X        }
  1293. X        proc->p_execstarted = TRUE;
  1294. X    }
  1295. X    if (size)
  1296. X    {
  1297. X        proc->p_returnval = read(fd, buf, size);
  1298. X        proc->p_errno = errno;
  1299. X        debug1("%d = execread(%d)\n", proc->p_returnval, size);
  1300. X    }
  1301. X    else /* all done; send no return */
  1302. X    {
  1303. X        proc->p_returnval = close(proc->p_execfd);
  1304. X        proc->p_execfd = -1;
  1305. X        debug1("%d = execread(%d)\n", proc->p_returnval, size);
  1306. X        return;
  1307. X    }
  1308. X
  1309. X    sendreturn(proc, host->h_cmdfd, buf, 0);
  1310. X}
  1311. X
  1312. Xs_utimes(msg, proc)
  1313. X    struct message  *msg;
  1314. X    process    *proc;
  1315. X{
  1316. X    char    *path;
  1317. X    struct timeval    tv[2];
  1318. X
  1319. X    path = path1addr(msg);
  1320. X    tv[0].tv_sec  = msg->m_args[0];
  1321. X    tv[0].tv_usec = msg->m_args[1];
  1322. X    tv[1].tv_sec  = msg->m_args[2];
  1323. X    tv[1].tv_usec = msg->m_args[3];
  1324. X    
  1325. X    
  1326. X    proc->p_returnval = utimes(path, tv);
  1327. X    proc->p_errno = errno;
  1328. X    debug1("%d = utimes(\"%s\", 0x%x\n", proc->p_returnval, path, tv);
  1329. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1330. X}
  1331. X
  1332. X/*
  1333. X * Let a process exit.
  1334. X */
  1335. Xs_exit(msg, proc)
  1336. X    struct message  *msg;
  1337. X    process    *proc;
  1338. X{
  1339. X    long    otherprocs = 0;
  1340. X    process    *p2;
  1341. X
  1342. X    /*
  1343. X     * No return message sent!
  1344. X     */
  1345. X    debug1("exit()\n");
  1346. X    deletelist(&host->h_proclist, proc);
  1347. X    freeproc(proc);
  1348. X    if (! i_am_gateway)
  1349. X    {
  1350. X        for (proc=host->h_proclist; proc; proc=proc->p_next)
  1351. X            if (proc->p_handler == current_pid)
  1352. X                otherprocs++;
  1353. X        if (otherprocs == 0)
  1354. X        {
  1355. X            gobble_last_msg(host->h_cmdfd, msg);
  1356. X            say_something(S_ALLDONE, 0);
  1357. X            mourne();
  1358. X            exit(0);
  1359. X        }
  1360. X        else
  1361. X            say_something(S_PROCEXIT, msg->m_pid);
  1362. X    }
  1363. X}
  1364. X
  1365. Xnoop(msg, proc)
  1366. X    struct message  *msg;
  1367. X    process    *proc;
  1368. X{
  1369. X    extern long    errno;
  1370. X
  1371. X    log("*** FUNCTION IGNORED ***\n", proc->p_pid);
  1372. X    proc->p_returnval = -1;
  1373. X    proc->p_errno = EINVAL;
  1374. X    sendreturn(proc, host->h_cmdfd, NULL, 0);
  1375. X}
  1376. SHAREOF
  1377. chmod 444 remote/serversyscall.c
  1378. #
  1379. # remote/shells
  1380. #
  1381. mkdir remote/shells
  1382. chmod 775 remote/shells
  1383. #
  1384. # remote/shells/makemake
  1385. #
  1386. if [ -f remote/shells/makemake ]; then 
  1387.     echo -n 'Hit <return> to overwrite remote/shells/makemake or ^C to quit' 
  1388.     read ans 
  1389.     rm -f remote/shells/makemake 
  1390. fi 
  1391.  
  1392. sed -e 's/^.//' << \SHAREOF > remote/shells/makemake
  1393. X#!/bin/sh
  1394. XMAKEFILE=Makefile
  1395. X
  1396. Xcase "$1" in
  1397. X"")
  1398. X    echo "Usage: $0 <machinetype>"
  1399. X    exit 1
  1400. X    ;;
  1401. XM68)
  1402. X    MAKEFILE=M68
  1403. X    ;;
  1404. Xesac
  1405. X
  1406. Xif [ ! -f make.base.$1 ]
  1407. Xthen
  1408. X    echo No machine type $1 supported.
  1409. X    exit 1
  1410. Xfi
  1411. X
  1412. Xcat make.base.$1 make.base > $MAKEFILE
  1413. SHAREOF
  1414. chmod 755 remote/shells/makemake
  1415. #
  1416. # remote/shells/mkdist
  1417. #
  1418. if [ -f remote/shells/mkdist ]; then 
  1419.     echo -n 'Hit <return> to overwrite remote/shells/mkdist or ^C to quit' 
  1420.     read ans 
  1421.     rm -f remote/shells/mkdist 
  1422. fi 
  1423.  
  1424. sed -e 's/^.//' << \SHAREOF > remote/shells/mkdist
  1425. X#!/bin/sh
  1426. X
  1427. XFILES='
  1428. X    remote/README
  1429. X    remote/*.[ch]
  1430. X    remote/doc
  1431. X    remote/make.*
  1432. X    remote/shells
  1433. X    remote/usr.*'
  1434. X
  1435. XFILES=`echo $FILES`
  1436. Xcd ..
  1437. Xtar cvhf - $FILES > remote/remotefs.tar
  1438. SHAREOF
  1439. chmod 755 remote/shells/mkdist
  1440. #
  1441. # remote/shells/mkdist.shar
  1442. #
  1443. if [ -f remote/shells/mkdist.shar ]; then 
  1444.     echo -n 'Hit <return> to overwrite remote/shells/mkdist.shar or ^C to quit' 
  1445.     read ans 
  1446.     rm -f remote/shells/mkdist.shar 
  1447. fi 
  1448.  
  1449. sed -e 's/^.//' << \SHAREOF > remote/shells/mkdist.shar
  1450. X#!/bin/sh
  1451. X
  1452. XFILES='
  1453. X    remote/README
  1454. X    remote/*.[ch]
  1455. X    remote/doc
  1456. X    remote/make.*
  1457. X    remote/shells
  1458. X    remote/usr.*'
  1459. X
  1460. Xset -x
  1461. Xcd ..
  1462. Xshar $FILES
  1463. Xmv shar.? remote
  1464. X
  1465. X#
  1466. X# put in the count
  1467. X#
  1468. XCOUNT=`ls remote/shar.? | grep -c .`
  1469. Xcnt=1
  1470. Xwhile [ $cnt -le $COUNT ]
  1471. Xdo
  1472. X
  1473. Xed remote/shar.$cnt << EOF
  1474. X1a
  1475. X#
  1476. X# RFS, a kernel-resident remote file system.  Shar $cnt of $COUNT
  1477. X#
  1478. X.
  1479. Xw
  1480. Xq
  1481. XEOF
  1482. X    cnt=`expr $cnt + 1`
  1483. Xdone
  1484. X
  1485. X#
  1486. X# add in the intro
  1487. X#
  1488. Xed remote/shar.1 << \EOF
  1489. X1i
  1490. XThese seven shar files contain the software and documentatino for
  1491. Xinstallation, maintenance and adjustment of RFS, a public domain,
  1492. Xkernel-resident distributed file system, written at Tektronix Computer
  1493. XResearch Laboratories* by me for partial fulfillment of the master's
  1494. Xdegree program at the University of Denver.  It was designed to provide
  1495. Xcomplete transparency with respect to file access and protections for
  1496. Xall programs whether they use local or remote files and directories.
  1497. XIt has been installed on VAX BSD 4.2 and 4.3 UNIX, Pyramid 4.2/5.0
  1498. XUNIX, version 2.5, and on a Tektronix internal proprietary workstation,
  1499. Xcalled Magnolia.  The instructions are designed in a way that keeps all
  1500. Xchanges separate from your standard sources, in hope that it will
  1501. Xencourage sites to try the installation.
  1502. X
  1503. X            Todd Brunhoff
  1504. X            toddb%crl@tektronix.csnet
  1505. X            decvax!tektronix!crl!toddb
  1506. X
  1507. X* RFS should not be confused with another completely different (but
  1508. X  excellent) implementation from Tektronix available on the 6000 series
  1509. X  workstation, called DFS, and done by a separate product group.  The
  1510. X  work on RFS was designed and written strictly by the author of this
  1511. X  paper at about the same time as DFS, and draws none of its
  1512. X  implementation details from DFS.  RFS is public domain, while DFS is
  1513. X  proprietary.
  1514. X
  1515. X.
  1516. Xw
  1517. Xq
  1518. XEOF
  1519. SHAREOF
  1520. chmod 755 remote/shells/mkdist.shar
  1521. #
  1522. # remote/shells/rfs_clean
  1523. #
  1524. if [ -f remote/shells/rfs_clean ]; then 
  1525.     echo -n 'Hit <return> to overwrite remote/shells/rfs_clean or ^C to quit' 
  1526.     read ans 
  1527.     rm -f remote/shells/rfs_clean 
  1528. fi 
  1529.  
  1530. sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_clean
  1531. X#!/bin/sh
  1532. X
  1533. Xcd /usr/tmp
  1534. Xfor file in rfs_log.*.*
  1535. Xdo
  1536. X    pid=`expr "$file" : '.*\.\(.*\)'`
  1537. X    result=`kill -19 $pid 2>&1`
  1538. X    case "$result" in
  1539. X    *"No such process")    (set -x; rm -f $file);;
  1540. X    esac
  1541. Xdone
  1542. SHAREOF
  1543. chmod 755 remote/shells/rfs_clean
  1544. #
  1545. # remote/shells/rfs_kerninstall
  1546. #
  1547. if [ -f remote/shells/rfs_kerninstall ]; then 
  1548.     echo -n 'Hit <return> to overwrite remote/shells/rfs_kerninstall or ^C to quit' 
  1549.     read ans 
  1550.     rm -f remote/shells/rfs_kerninstall 
  1551. fi 
  1552.  
  1553. sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_kerninstall
  1554. X#!/bin/sh
  1555. X
  1556. X#
  1557. X# Install script for added RFS kernel sources.
  1558. X#
  1559. X          NL='
  1560. X'
  1561. X     SRC=$1
  1562. X    DEST=$2
  1563. X     VER=$3
  1564. X      USAGE="${NL}Usage: $0 src-dir dest-dir VAX4.3|VAX4.2|PYR2.5"
  1565. XRemove_start=
  1566. X  Remove_end=
  1567. X      Delete=
  1568. X
  1569. X#
  1570. X# Figure out what software we are running...
  1571. X#
  1572. Xcase "$VER" in
  1573. XVAX4.3)    Remove_start='^#else[     ]BSD4_3'
  1574. X      Remove_end='^#endif[     ]BSD4_3'
  1575. X          Delete='^#ifdef[     ]BSD4_3'
  1576. X    ;;
  1577. XVAX4.2)    Remove_start='^#ifdef[     ]BSD4_3'
  1578. X      Remove_end='^#else[     ]BSD4_3'
  1579. X          Delete='^#endif[     ]BSD4_3'
  1580. X    ;;
  1581. XPYR2.5)    Remove_start='^#ifdef[     ]BSD4_3'
  1582. X      Remove_end='^#else[     ]BSD4_3'
  1583. X          Delete='^#endif[     ]BSD4_3'
  1584. X    ;;
  1585. X*)    echo "$0: Unknown type = $VER" \
  1586. X        "$USAGE"
  1587. X    exit 1
  1588. X    ;;
  1589. Xesac
  1590. Xif [    "$SRC" = "" -o ! -d "$SRC" \
  1591. X    -o "$DEST" = "" -o ! -d "$DEST" ]
  1592. Xthen
  1593. X    echo "Either \"$SRC\" or \"$DEST\" is not a directory!" \
  1594. X        "$USAGE"
  1595. X    exit 1
  1596. Xfi
  1597. X
  1598. Xfor file in `ls $SRC`
  1599. Xdo
  1600. X    echo -n "${NL}$file  "
  1601. X    sed    -e "/$Remove_start/,/$Remove_end/d" \
  1602. X        -e "/$Delete/d" \
  1603. X        < $SRC/$file > $DEST/$file
  1604. Xdone
  1605. Xchmod 0755 $DEST/remote_mkdata
  1606. Xecho
  1607. SHAREOF
  1608. chmod 755 remote/shells/rfs_kerninstall
  1609. #
  1610. # remote/shells/rfs_kernpatch
  1611. #
  1612. if [ -f remote/shells/rfs_kernpatch ]; then 
  1613.     echo -n 'Hit <return> to overwrite remote/shells/rfs_kernpatch or ^C to quit' 
  1614.     read ans 
  1615.     rm -f remote/shells/rfs_kernpatch 
  1616. fi 
  1617.  
  1618. sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_kernpatch
  1619. X#!/bin/sh
  1620. X#
  1621. X# Kernel level setup for compiling RFS.
  1622. X#
  1623. XCHANGELIST='    h/errno.h
  1624. X        h/param.h
  1625. X        h/user.h
  1626. X        sys/init_sysent.c
  1627. X        sys/kern_exec.c
  1628. X        sys/kern_exit.c
  1629. X        sys/ufs_syscalls.c'
  1630. XCHANGE_42='    sys/sys_inode.c
  1631. X        sys/ufs_nami.c
  1632. X        sys/uipc_socket.c
  1633. X        machine/trap.c
  1634. X        conf/files'
  1635. XCHANGE_43='    sys/ufs_namei.c
  1636. X        machine/trap.c
  1637. X        conf/files'
  1638. XCHANGE_PYR='    sys/kern_trap.c'
  1639. X   PATCHES=$1
  1640. X       SRC=$2
  1641. X      DEST=$3
  1642. X       VER=$4
  1643. X     USAGE="Usage: $0 patch-dir src-dir dest-dir VAX4.3|VAX4.2|PYR2.5"
  1644. X    NL='
  1645. X'
  1646. X
  1647. Xif [ ! -d "$PATCHES" -o ! -d "$SRC" -o ! -d "$DEST" ]
  1648. Xthen
  1649. X    echo "One of \"$PATCHES\", \"$SRC\" or \"$DEST\" is not a directory" \
  1650. X        "$NL$USAGE"
  1651. X    exit 1
  1652. Xfi
  1653. X
  1654. Xcase "$VER" in
  1655. XVAX4.3) CHANGELIST="$CHANGELIST $CHANGE_43"
  1656. X    if [ -f $SRC/conf/Makefile.vax ]
  1657. X    then
  1658. X        CHANGELIST="$CHANGELIST conf/Makefile.vax"
  1659. X    else
  1660. X        CHANGELIST="$CHANGELIST conf/makefile.vax"
  1661. X    fi
  1662. X    ;;
  1663. XVAX4.2) CHANGELIST="$CHANGELIST $CHANGE_42 conf/makefile.vax" ;;
  1664. XPYR2.5) CHANGELIST="$CHANGELIST $CHANGE_PYR conf/makefromsource" ;;
  1665. X*)    echo "Invalid version = \"$VER\"$NL$USAGE"
  1666. X    exit 1
  1667. X    ;;
  1668. Xesac
  1669. X
  1670. X#
  1671. X# copy the target files for the patches.
  1672. X#
  1673. Xcase "$DEST" in
  1674. X
  1675. X$SRC)    ;; # no need to copy
  1676. X
  1677. X*)    echo "Copy in files that must be changed..."
  1678. X    (cd $DEST; rm -f $CHANGELIST)
  1679. X    for file in $CHANGELIST
  1680. X    do
  1681. X        (set -x; cp $SRC/$file $DEST/$file)
  1682. X    done
  1683. X    ;;
  1684. Xesac
  1685. X(cd $DEST; chmod 0644 $CHANGELIST)
  1686. X
  1687. X#
  1688. X# do the patches
  1689. X#
  1690. Xfor file in $CHANGELIST
  1691. Xdo
  1692. X    while :
  1693. X    do
  1694. X        echo -n "${NL}${NL}Hit <return> to patch" \
  1695. X            "$file or 'n' to skip: "
  1696. X        read prompt
  1697. X        case "$prompt" in
  1698. X        "")    (set -x; patch $DEST/$file $PATCHES/$file.diff)
  1699. X            ;;    
  1700. X        n)    ;;
  1701. X        *)    echo "Enter <return> or the letter 'n' only!"
  1702. X            continue
  1703. X            ;;
  1704. X        esac
  1705. X        break
  1706. X    done
  1707. Xdone
  1708. SHAREOF
  1709. chmod 755 remote/shells/rfs_kernpatch
  1710. #
  1711. # remote/shells/rfs_setup
  1712. #
  1713. if [ -f remote/shells/rfs_setup ]; then 
  1714.     echo -n 'Hit <return> to overwrite remote/shells/rfs_setup or ^C to quit' 
  1715.     read ans 
  1716.     rm -f remote/shells/rfs_setup 
  1717. fi 
  1718.  
  1719. sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_setup
  1720. X#!/bin/sh
  1721. X#
  1722. X# Setup for compiling RFS.
  1723. X#
  1724. XPWD=`pwd`
  1725. XKERNELDIRS='    conf
  1726. X        h
  1727. X        net
  1728. X        netimp
  1729. X        netinet
  1730. X        remote
  1731. X        sys'
  1732. XKDIRS_42='    vax
  1733. X        vaxif
  1734. X        vaxmba
  1735. X        vaxuba
  1736. X        netpup'
  1737. XKDIRS_43='    vax
  1738. X        vaxif
  1739. X        vaxmba
  1740. X        vaxuba
  1741. X        bbnnet
  1742. X        netns'
  1743. XKDIRS_PYR='    ether
  1744. X        io
  1745. X        kernel
  1746. X        kernel_m
  1747. X        ml
  1748. X        netpup
  1749. X        vls'
  1750. XINCLUDEFILE=syscall.h
  1751. X         NL='
  1752. X'
  1753. XEXECDIR=`expr $0 : '\(.*\)\/.*'`
  1754. X
  1755. X#
  1756. X# Figure out what software they are running...
  1757. X#
  1758. Xwhile :
  1759. Xdo
  1760. X    echo -n "Are you running" \
  1761. X        "${NL}    1. VAX 4.3 BSD" \
  1762. X        "${NL}    2. VAX 4.2 BSD" \
  1763. X        "${NL}    3. Pyramid 2.5 (4.2/5.0)" \
  1764. X        "${NL}enter 1, 2 or 3: "
  1765. X    read ans
  1766. X    case "$ans" in
  1767. X    1)             VER=VAX4.3
  1768. X            MACH=vax
  1769. X          KERNELDIRS="$KERNELDIRS $KDIRS_43"
  1770. X        ;;
  1771. X    2)             VER=VAX4.2
  1772. X            MACH=vax
  1773. X          KERNELDIRS="$KERNELDIRS $KDIRS_42"
  1774. X        ;;
  1775. X    3)             VER=PYR2.5
  1776. X            MACH=pyr
  1777. X          KERNELDIRS="$KERNELDIRS $KDIRS_PYR"
  1778. X        ;;
  1779. X    *)    echo "only 1, 2 and 3 are supported..."
  1780. X        continue
  1781. X        ;;
  1782. X    esac
  1783. X    break;
  1784. Xdone
  1785. X
  1786. X#
  1787. X# Find out the sys directory
  1788. X#
  1789. XSYSDIR=
  1790. Xwhile :
  1791. Xdo
  1792. X    echo -n "${NL}${NL}What is the top-level path of your kernel source" \
  1793. X        "${NL}directory (normally it is /usr/sys)? "
  1794. X    read ans
  1795. X    if [ "$ans" = "" -o ! -d "$ans" ]
  1796. X    then
  1797. X        echo "...but \"$ans\" is not a directory!"
  1798. X        continue
  1799. X    fi
  1800. X
  1801. X    #
  1802. X    # Ensure that the path begins with /
  1803. X    #
  1804. X    case "$ans" in
  1805. X    /*)    ;;
  1806. X    *)    echo "\"$ans\" must begin with '/'"
  1807. X        continue
  1808. X        ;;
  1809. X    esac
  1810. X
  1811. X    SYSDIR=$ans
  1812. X    break
  1813. Xdone
  1814. X
  1815. X#
  1816. X# ask if the changes are to be permanent
  1817. X#
  1818. Xwhile :
  1819. Xdo
  1820. X    echo -n "${NL}${NL}Do you want these changes" \
  1821. X    "$NL    1. installed in $SYSDIR and in /usr/include" \
  1822. X    "$NL    2. installed in this directory (reccomended 1st pass)" \
  1823. X    "${NL}enter 1 or 2: "
  1824. X    read ans
  1825. X    case "$ans" in
  1826. X    1)    DEST=$SYSDIR
  1827. X        INCLUDEDIR=/usr/include
  1828. X        ;;
  1829. X    2)    DEST=$PWD/sys
  1830. X        INCLUDEDIR=usr.include
  1831. X        ;;
  1832. X    *)    echo "only 1 or 2 allowed."
  1833. X        continue
  1834. X        ;;
  1835. X    esac
  1836. X    break
  1837. Xdone
  1838. X
  1839. X
  1840. Xumask 022
  1841. Xcase "$DEST" in
  1842. X
  1843. X"$SYSDIR")    # don't need to make local directories, 'cept one.
  1844. X    mkdir $SYSDIR/remote
  1845. X    ;;
  1846. X
  1847. X*)    #
  1848. X    # make directories
  1849. X    #
  1850. X    echo "${NL}${NL}Make kernel source directories in `pwd` ..."
  1851. X    ERR=
  1852. X    mkdir sys
  1853. X    for dir in $KERNELDIRS
  1854. X    do
  1855. X        mkdir    sys/$dir
  1856. X
  1857. X        case "$dir" in
  1858. X        remote)    continue;;    # don't check its existence...
  1859. X        esac
  1860. X
  1861. X        if [ ! -d $SYSDIR/$dir ]
  1862. X        then
  1863. X            echo "Kernel sources not in $SYSDIR/$dir ???"
  1864. X            ERR=true
  1865. X        fi
  1866. X    done
  1867. X    case "$ERR" in
  1868. X    "")    ;;
  1869. X    *)    exit 1;;
  1870. X    esac
  1871. X
  1872. X    case "$VER" in
  1873. X    VAX4.2|VAX4.3) (cd sys; ln -s vax machine);;
  1874. X    esac
  1875. X
  1876. X    #
  1877. X    # make the symbolic links
  1878. X    #
  1879. X    for dir in $KERNELDIRS
  1880. X    do
  1881. X        case "$dir" in
  1882. X        remote)    continue;;
  1883. X        esac
  1884. X
  1885. X        echo "Make symbolic links from $DEST/$dir/*" \
  1886. X            "${NL}to $SYSDIR/$dir/*..."
  1887. X        (cd $DEST/$dir; ln -s $SYSDIR/$dir/* .)
  1888. X    done
  1889. X    ;;
  1890. Xesac
  1891. X
  1892. X#
  1893. X# move the remote kernel stuff into place...
  1894. X#
  1895. Xecho "${NL}${NL}Copy $PWD/remote/usr.sys.remote/* files" \
  1896. X    "${NL}to $DEST/remote (and remove" \
  1897. X    "${NL}#ifdef BSD4_3 at the same time)..."
  1898. X$EXECDIR/rfs_kerninstall $PWD/remote/usr.sys.remote $DEST/remote $VER
  1899. X    
  1900. X#
  1901. X# Now run patch on each files to install
  1902. X# the changes necessary.
  1903. X#
  1904. Xcat <<EOF
  1905. X
  1906. X
  1907. XI will now install all the kernel changes for you in
  1908. X$DEST with the 'patch' utility, so you must have that
  1909. Xprogram to continue.  You will be given an opportunity to either suspend
  1910. Xthis program or kill it before each file is patched so that you may
  1911. Xmake adjustments as you think of them.  You may also skip the patches
  1912. Xif you know that they are already installed (Better be sure, though).
  1913. X
  1914. XFor the C-source files with the exception of two bug fixes, all changes
  1915. Xwill be installed between the control statements:
  1916. X
  1917. X#ifdef REMOTEFS
  1918. X#endif REMOTEFS
  1919. X
  1920. XEOF
  1921. X
  1922. X$EXECDIR/rfs_kernpatch remote/usr.sys.$VER $SYSDIR $DEST $VER
  1923. X$EXECDIR/rfs_userpatch remote/usr.include.$VER $INCLUDEDIR $DEST
  1924. X
  1925. Xcat <<EOF
  1926. X
  1927. X
  1928. XRfs software is set up and ready for compilation.  See the installation
  1929. Xmanual.
  1930. X
  1931. XEOF
  1932. SHAREOF
  1933. chmod 755 remote/shells/rfs_setup
  1934. #
  1935. # remote/shells/rfs_userpatch
  1936. #
  1937. if [ -f remote/shells/rfs_userpatch ]; then 
  1938.     echo -n 'Hit <return> to overwrite remote/shells/rfs_userpatch or ^C to quit' 
  1939.     read ans 
  1940.     rm -f remote/shells/rfs_userpatch 
  1941. fi 
  1942.  
  1943. sed -e 's/^.//' << \SHAREOF > remote/shells/rfs_userpatch
  1944. X#!/bin/sh
  1945. X#
  1946. X# User-level software setup for compiling RFS.
  1947. X#
  1948. Xumask 02
  1949. X   PATCHES=$1
  1950. XINCLUDEDIR=$2
  1951. X       SYS=$3
  1952. X    NL='
  1953. X'
  1954. X
  1955. Xecho "$NL"
  1956. X
  1957. Xif [ ! -d $PATCHES -o ! -d $SYS ]
  1958. Xthen
  1959. X    echo "Either \"$PATCHES\" or \"$SYS\" is not a directory"
  1960. X    exit 1
  1961. Xfi
  1962. X
  1963. X#
  1964. X# Make the proper include directories if they don't already exist.
  1965. X# link in remotefs.h and param.h
  1966. X#
  1967. Xif [ ! -d $INCLUDEDIR ]
  1968. Xthen
  1969. X    mkdir $INCLUDEDIR
  1970. Xfi
  1971. Xif [ ! -d $INCLUDEDIR/remote ]
  1972. Xthen
  1973. X    mkdir $INCLUDEDIR/remote
  1974. Xfi
  1975. Xif [ ! -d $INCLUDEDIR/sys ]
  1976. Xthen
  1977. X    mkdir $INCLUDEDIR/sys
  1978. Xfi
  1979. X
  1980. Xrm -f $INCLUDEDIR/remote/remotefs.h $INCLUDEDIR/sys/param.h
  1981. X
  1982. Xln -s $SYS/remote/remotefs.h $INCLUDEDIR/remote/remotefs.h
  1983. Xln -s $SYS/h/param.h $INCLUDEDIR/sys/param.h
  1984. X
  1985. X#
  1986. X# Finally make the change to syscall.h.  If the changes go in usr.include,
  1987. X# then assume that we must copy it there first.  Otherwise, we make the
  1988. X# changes in place.
  1989. X#
  1990. Xcase "$INCLUDEDIR" in
  1991. X
  1992. X/usr/include)    ;;
  1993. X
  1994. X*)    rm -f $INCLUDEDIR/syscall.h
  1995. X    cat /usr/include/syscall.h > $INCLUDEDIR/syscall.h
  1996. X    ;;
  1997. Xesac
  1998. X
  1999. Xwhile :
  2000. Xdo
  2001. X    echo -n "${NL}${NL}Hit <return> to patch" \
  2002. X        "$INCLUDEDIR/syscall.h or 'n' to skip: "
  2003. X    read prompt
  2004. X    case "$prompt" in
  2005. X    "")    (set -x; patch $INCLUDEDIR/syscall.h $PATCHES/syscall.h.diff)
  2006. X        ;;    
  2007. X    n)    ;;
  2008. X    *)    echo "Enter <return> or the letter 'n' only!"
  2009. X        continue
  2010. X        ;;
  2011. X    esac
  2012. X    break
  2013. Xdone
  2014. SHAREOF
  2015. chmod 755 remote/shells/rfs_userpatch
  2016. #
  2017. # remote/usr.include.PYR2.5
  2018. #
  2019. mkdir remote/usr.include.PYR2.5
  2020. chmod 775 remote/usr.include.PYR2.5
  2021. #
  2022. # remote/usr.include.PYR2.5/syscall.h.diff
  2023. #
  2024. if [ -f remote/usr.include.PYR2.5/syscall.h.diff ]; then 
  2025.     echo -n 'Hit <return> to overwrite remote/usr.include.PYR2.5/syscall.h.diff or ^C to quit' 
  2026.     read ans 
  2027.     rm -f remote/usr.include.PYR2.5/syscall.h.diff 
  2028. fi 
  2029.  
  2030. sed -e 's/^.//' << \SHAREOF > remote/usr.include.PYR2.5/syscall.h.diff
  2031. XIf the changes to sys/init_sysent.c succeeded, then this should be fine.
  2032. XIf not, you should check that the system call numbers added coincide with
  2033. Xthose in sys/init_sysent.c.
  2034. X***************
  2035. X*** 154,159
  2036. X  /* 152 thru 165 reserved */
  2037. X  #define SYS_setprocesshost 166
  2038. X  #define SYS_getprocesshost 167
  2039. X  
  2040. X  /*
  2041. X   * BTL system call header table.
  2042. X
  2043. X--- 154,162 -----
  2044. X  /* 152 thru 165 reserved */
  2045. X  #define SYS_setprocesshost 166
  2046. X  #define SYS_getprocesshost 167
  2047. X+ #define SYS_remoteon    168
  2048. X+ #define SYS_remoteoff    169
  2049. X+ #define SYS_remotename    170
  2050. X  
  2051. X  /*
  2052. X   * BTL system call header table.
  2053. SHAREOF
  2054. chmod 664 remote/usr.include.PYR2.5/syscall.h.diff
  2055. #
  2056. # remote/usr.include.VAX4.2
  2057. #
  2058. mkdir remote/usr.include.VAX4.2
  2059. chmod 775 remote/usr.include.VAX4.2
  2060. if [ -f remote/usr.include.VAX4.3 ]; then 
  2061.     echo -n 'Hit <return> to overwrite remote/usr.include.VAX4.2 or ^C to quit' 
  2062.     read ans 
  2063.     rm -rf remote/usr.include.VAX4.3 
  2064. fi
  2065. ln -s remote/usr.include.VAX4.2 remote/usr.include.VAX4.3
  2066. #
  2067. # remote/usr.include.VAX4.2/syscall.h.diff
  2068. #
  2069. if [ -f remote/usr.include.VAX4.2/syscall.h.diff ]; then 
  2070.     echo -n 'Hit <return> to overwrite remote/usr.include.VAX4.2/syscall.h.diff or ^C to quit' 
  2071.     read ans 
  2072.     rm -f remote/usr.include.VAX4.2/syscall.h.diff 
  2073. fi 
  2074.  
  2075. sed -e 's/^.//' << \SHAREOF > remote/usr.include.VAX4.2/syscall.h.diff
  2076. XIf the changes to sys/init_sysent.c succeeded, then this should be fine.
  2077. XIf not, you should check that the system call numbers added coincide with
  2078. Xthose in sys/init_sysent.c.
  2079. X***************
  2080. X*** 150,152
  2081. X  #define    SYS_setquota    148
  2082. X  #define    SYS_quota    149
  2083. X  #define    SYS_getsockname    150
  2084. X
  2085. X--- 150,155 -----
  2086. X  #define    SYS_setquota    148
  2087. X  #define    SYS_quota    149
  2088. X  #define    SYS_getsockname    150
  2089. X+ #define    SYS_remoteon    151
  2090. X+ #define    SYS_remoteoff    152
  2091. X+ #define    SYS_remotename    153
  2092. SHAREOF
  2093. chmod 664 remote/usr.include.VAX4.2/syscall.h.diff
  2094. #
  2095. # remote/usr.src.lib.libc
  2096. #
  2097. mkdir remote/usr.src.lib.libc
  2098. chmod 775 remote/usr.src.lib.libc
  2099. #
  2100. # remote/usr.src.lib.libc/Makefile
  2101. #
  2102. if [ -f remote/usr.src.lib.libc/Makefile ]; then 
  2103.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/Makefile or ^C to quit' 
  2104.     read ans 
  2105.     rm -f remote/usr.src.lib.libc/Makefile 
  2106. fi 
  2107.  
  2108. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/Makefile
  2109. X#
  2110. X# This makefile is present only to build a temporary libc... until
  2111. X# you decide that the files compiled here should be installed in the
  2112. X# source directory.  This makefile should not be installed anywhere.
  2113. X#
  2114. XOBJS=    remotename.o remoteon.o remoteoff.o errlst.o
  2115. XSRC=/usr/src
  2116. XLIBSRC=${SRC}/lib/libc
  2117. XUSR_INCLUDE=../../usr.include
  2118. XLIBDIR=/lib
  2119. X
  2120. Xnothing:
  2121. X    echo "Nothing made!"
  2122. X    echo "You must type 'make vax' or 'make pyr'"
  2123. X
  2124. Xvax: /tmp
  2125. X    make    INCLUDE="-I${LIBSRC}/vax/sys -I${USR_INCLUDE}" \
  2126. X        MACHTYPE=vax \
  2127. X        SUFFIX=c \
  2128. X        LIBDIR=${LIBDIR} \
  2129. X        SRC=${SRC} \
  2130. X        install
  2131. X
  2132. Xpyr: /tmp
  2133. X    make    INCLUDE="-I${USR_INCLUDE}" \
  2134. X        MACHTYPE=pyr \
  2135. X        SUFFIX=s \
  2136. X        LIBDIR=${LIBDIR} \
  2137. X        SRC=${SRC} \
  2138. X        install
  2139. X
  2140. Xnewlibc.a: ${OBJS} libc.a
  2141. X    cp libc.a newlibc.a
  2142. X    ar cru newlibc.a ${OBJS}
  2143. X
  2144. Xinstall: newlibc.a libc.a
  2145. X    -cp ${LIBDIR}/libc.a ${LIBDIR}/libc.a.bak
  2146. X    cp newlibc.a ${LIBDIR}/libc.a
  2147. X    ranlib ${LIBDIR}/libc.a
  2148. X
  2149. Xlibc.a:    /lib/libc.a
  2150. X    cp /lib/libc.a .
  2151. X
  2152. Xerrlst.o: errlst.c
  2153. Xremotename.o remoteon.o remoteoff.o:
  2154. Xremotename.o: ${MACHTYPE}/sys/remotename.${SUFFIX}
  2155. X    /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
  2156. X    -ld -x -r $@
  2157. X    mv a.out $@
  2158. Xremoteon.o: ${MACHTYPE}/sys/remoteon.${SUFFIX}
  2159. X    /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
  2160. X    -ld -x -r $@
  2161. X    mv a.out $@
  2162. Xremoteoff.o: ${MACHTYPE}/sys/remoteoff.${SUFFIX}
  2163. X    /lib/cpp ${INCLUDE} -E $? | ${AS} -o $@
  2164. X    -ld -x -r $@
  2165. X    mv a.out $@
  2166. X
  2167. Xerrlst.c: ${LIBSRC}/gen/errlst.c
  2168. X    cp ${LIBSRC}/gen/errlst.c nerrlst.c
  2169. X    patch nerrlst.c gen/${MACHTYPE}.errlst.c.diff
  2170. X    mv nerrlst.c errlst.c
  2171. SHAREOF
  2172. chmod 664 remote/usr.src.lib.libc/Makefile
  2173. #
  2174. # remote/usr.src.lib.libc/gen
  2175. #
  2176. mkdir remote/usr.src.lib.libc/gen
  2177. chmod 775 remote/usr.src.lib.libc/gen
  2178. #
  2179. # remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
  2180. #
  2181. if [ -f remote/usr.src.lib.libc/gen/pyr.errlst.c.diff ]; then 
  2182.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/gen/pyr.errlst.c.diff or ^C to quit' 
  2183.     read ans 
  2184.     rm -f remote/usr.src.lib.libc/gen/pyr.errlst.c.diff 
  2185. fi 
  2186.  
  2187. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
  2188. XThese changes being installed should be just fine if you were able to make
  2189. Xthe earlier changes to h/errno.h.  Otherwise, you must install these changes
  2190. Xby hand.
  2191. X***************
  2192. X*** 82,88
  2193. X      "Too many processes",            /* 67 - EPROCLIM */
  2194. X      "Too many users",            /* 68 - EUSERS */
  2195. X      "Disc quota exceeded",            /* 69 - EDQUOT */
  2196. X!     "","","","","","","","","","",          /* 70-79 - spare */
  2197. X      "","","","","","","","","","",          /* 80-89 - spare */
  2198. X      "","","","","","","","","","",          /* 90-99 - spare */
  2199. X  
  2200. X
  2201. X--- 82,91 -----
  2202. X      "Too many processes",            /* 67 - EPROCLIM */
  2203. X      "Too many users",            /* 68 - EUSERS */
  2204. X      "Disc quota exceeded",            /* 69 - EDQUOT */
  2205. X!     "File is on remote host",        /* 70 - EISREMOTE */
  2206. X!     "Too many remote hosts defined",    /* 71 - ETOOMANYREMOTE */
  2207. X!     "No remote file system",        /* 72 - ENOREMOTEFS */
  2208. X!     "","","","","","","",                   /* 73-79 - spare */
  2209. X      "","","","","","","","","","",          /* 80-89 - spare */
  2210. X      "","","","","","","","","","",          /* 90-99 - spare */
  2211. X  
  2212. SHAREOF
  2213. chmod 664 remote/usr.src.lib.libc/gen/pyr.errlst.c.diff
  2214. #
  2215. # remote/usr.src.lib.libc/gen/vax.errlst.c.diff
  2216. #
  2217. if [ -f remote/usr.src.lib.libc/gen/vax.errlst.c.diff ]; then 
  2218.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/gen/vax.errlst.c.diff or ^C to quit' 
  2219.     read ans 
  2220.     rm -f remote/usr.src.lib.libc/gen/vax.errlst.c.diff 
  2221. fi 
  2222.  
  2223. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/gen/vax.errlst.c.diff
  2224. XThese changes being installed should be just fine if you were able to make
  2225. Xthe earlier changes to h/errno.h.  Otherwise, you must install these changes
  2226. Xby hand.
  2227. X***************
  2228. X*** 81,85
  2229. X      "Too many processes",            /* 67 - EPROCLIM */
  2230. X      "Too many users",            /* 68 - EUSERS */
  2231. X      "Disc quota exceeded",            /* 69 - EDQUOT */
  2232. X  };
  2233. X  int    sys_nerr = { sizeof sys_errlist/sizeof sys_errlist[0] };
  2234. X
  2235. X--- 81,88 -----
  2236. X      "Too many processes",            /* 67 - EPROCLIM */
  2237. X      "Too many users",            /* 68 - EUSERS */
  2238. X      "Disc quota exceeded",            /* 69 - EDQUOT */
  2239. X+     "File is on remote host",        /* 70 - EISREMOTE */
  2240. X+     "Too many remote hosts defined",    /* 71 - ETOOMANYREMOTE */
  2241. X+     "No remote file system",        /* 72 - ENOREMOTEFS */
  2242. X  };
  2243. X  int    sys_nerr = { sizeof sys_errlist/sizeof sys_errlist[0] };
  2244. SHAREOF
  2245. chmod 664 remote/usr.src.lib.libc/gen/vax.errlst.c.diff
  2246. #
  2247. # remote/usr.src.lib.libc/pyr
  2248. #
  2249. mkdir remote/usr.src.lib.libc/pyr
  2250. chmod 775 remote/usr.src.lib.libc/pyr
  2251. #
  2252. # remote/usr.src.lib.libc/pyr/sys
  2253. #
  2254. mkdir remote/usr.src.lib.libc/pyr/sys
  2255. chmod 775 remote/usr.src.lib.libc/pyr/sys
  2256. #
  2257. # remote/usr.src.lib.libc/pyr/sys/remotename.s
  2258. #
  2259. if [ -f remote/usr.src.lib.libc/pyr/sys/remotename.s ]; then 
  2260.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remotename.s or ^C to quit' 
  2261.     read ans 
  2262.     rm -f remote/usr.src.lib.libc/pyr/sys/remotename.s 
  2263. fi 
  2264.  
  2265. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remotename.s
  2266. X#include "syscall.h"
  2267. X    .globl cerror
  2268. X    .globl _remotename
  2269. X    .align 2
  2270. X_remotename:
  2271. X    ###entry###
  2272. X    movw    pr0,tr1
  2273. X    movw    pr1,tr2
  2274. X    movw    pr2,tr3
  2275. X    movw    pr3,tr4
  2276. X    movw    pr4,tr5
  2277. X    movw    $/**/SYS_remotename, tr0
  2278. X    callk $0
  2279. X    cmpw    $0,tr0
  2280. X    bne    err
  2281. X    movw    tr1,pr0
  2282. X    ret
  2283. Xerr:
  2284. X    jump cerror
  2285. SHAREOF
  2286. chmod 644 remote/usr.src.lib.libc/pyr/sys/remotename.s
  2287. #
  2288. # remote/usr.src.lib.libc/pyr/sys/remoteoff.s
  2289. #
  2290. if [ -f remote/usr.src.lib.libc/pyr/sys/remoteoff.s ]; then 
  2291.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remoteoff.s or ^C to quit' 
  2292.     read ans 
  2293.     rm -f remote/usr.src.lib.libc/pyr/sys/remoteoff.s 
  2294. fi 
  2295.  
  2296. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remoteoff.s
  2297. X#include "syscall.h"
  2298. X    .globl cerror
  2299. X    .globl _remoteoff
  2300. X    .align 2
  2301. X_remoteoff:
  2302. X    ###entry###
  2303. X    movw    pr0,tr1
  2304. X    movw    $/**/SYS_remoteoff, tr0
  2305. X    callk $0
  2306. X    cmpw    $0,tr0
  2307. X    bne    err
  2308. X    movw    tr1,pr0
  2309. X    ret
  2310. Xerr:
  2311. X    jump cerror
  2312. SHAREOF
  2313. chmod 644 remote/usr.src.lib.libc/pyr/sys/remoteoff.s
  2314. #
  2315. # remote/usr.src.lib.libc/pyr/sys/remoteon.s
  2316. #
  2317. if [ -f remote/usr.src.lib.libc/pyr/sys/remoteon.s ]; then 
  2318.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/pyr/sys/remoteon.s or ^C to quit' 
  2319.     read ans 
  2320.     rm -f remote/usr.src.lib.libc/pyr/sys/remoteon.s 
  2321. fi 
  2322.  
  2323. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/pyr/sys/remoteon.s
  2324. X#include "syscall.h"
  2325. X    .globl cerror
  2326. X    .globl _remoteon
  2327. X    .align 2
  2328. X_remoteon:
  2329. X    ###entry###
  2330. X    movw    pr0,tr1
  2331. X    movw    pr1,tr2
  2332. X    movw    pr2,tr3
  2333. X    movw    pr3,tr4
  2334. X    movw    $/**/SYS_remoteon, tr0
  2335. X    callk $0
  2336. X    cmpw    $0,tr0
  2337. X    bne    err
  2338. X    movw    tr1,pr0
  2339. X    ret
  2340. Xerr:
  2341. X    jump cerror
  2342. SHAREOF
  2343. chmod 644 remote/usr.src.lib.libc/pyr/sys/remoteon.s
  2344. #
  2345. # remote/usr.src.lib.libc/vax
  2346. #
  2347. mkdir remote/usr.src.lib.libc/vax
  2348. chmod 775 remote/usr.src.lib.libc/vax
  2349. #
  2350. # remote/usr.src.lib.libc/vax/sys
  2351. #
  2352. mkdir remote/usr.src.lib.libc/vax/sys
  2353. chmod 775 remote/usr.src.lib.libc/vax/sys
  2354. #
  2355. # remote/usr.src.lib.libc/vax/sys/remotename.c
  2356. #
  2357. if [ -f remote/usr.src.lib.libc/vax/sys/remotename.c ]; then 
  2358.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remotename.c or ^C to quit' 
  2359.     read ans 
  2360.     rm -f remote/usr.src.lib.libc/vax/sys/remotename.c 
  2361. fi 
  2362.  
  2363. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remotename.c
  2364. X/* remotename.c 4.2 85/10/25 */
  2365. X
  2366. X#include "SYS.h"
  2367. X
  2368. XSYSCALL(remotename)
  2369. X    ret
  2370. SHAREOF
  2371. chmod 644 remote/usr.src.lib.libc/vax/sys/remotename.c
  2372. #
  2373. # remote/usr.src.lib.libc/vax/sys/remoteoff.c
  2374. #
  2375. if [ -f remote/usr.src.lib.libc/vax/sys/remoteoff.c ]; then 
  2376.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remoteoff.c or ^C to quit' 
  2377.     read ans 
  2378.     rm -f remote/usr.src.lib.libc/vax/sys/remoteoff.c 
  2379. fi 
  2380.  
  2381. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remoteoff.c
  2382. X/* remoteoff.c 4.2 85/10/25 */
  2383. X
  2384. X#include "SYS.h"
  2385. X
  2386. XSYSCALL(remoteoff)
  2387. X    ret
  2388. SHAREOF
  2389. chmod 644 remote/usr.src.lib.libc/vax/sys/remoteoff.c
  2390. #
  2391. # remote/usr.src.lib.libc/vax/sys/remoteon.c
  2392. #
  2393. if [ -f remote/usr.src.lib.libc/vax/sys/remoteon.c ]; then 
  2394.     echo -n 'Hit <return> to overwrite remote/usr.src.lib.libc/vax/sys/remoteon.c or ^C to quit' 
  2395.     read ans 
  2396.     rm -f remote/usr.src.lib.libc/vax/sys/remoteon.c 
  2397. fi 
  2398.  
  2399. sed -e 's/^.//' << \SHAREOF > remote/usr.src.lib.libc/vax/sys/remoteon.c
  2400. X/* remoteon.c 4.2 85/10/25 */
  2401. X
  2402. X#include "SYS.h"
  2403. X
  2404. XSYSCALL(remoteon)
  2405. X    ret
  2406. SHAREOF
  2407. chmod 644 remote/usr.src.lib.libc/vax/sys/remoteon.c
  2408. #
  2409. # remote/usr.sys.PYR2.5
  2410. #
  2411. mkdir remote/usr.sys.PYR2.5
  2412. chmod 775 remote/usr.sys.PYR2.5
  2413. #
  2414. # remote/usr.sys.PYR2.5/conf
  2415. #
  2416. mkdir remote/usr.sys.PYR2.5/conf
  2417. chmod 775 remote/usr.sys.PYR2.5/conf
  2418. #
  2419. # remote/usr.sys.PYR2.5/conf/makefromsource.diff
  2420. #
  2421. if [ -f remote/usr.sys.PYR2.5/conf/makefromsource.diff ]; then 
  2422.     echo -n 'Hit <return> to overwrite remote/usr.sys.PYR2.5/conf/makefromsource.diff or ^C to quit' 
  2423.     read ans 
  2424.     rm -f remote/usr.sys.PYR2.5/conf/makefromsource.diff 
  2425. fi 
  2426.  
  2427. sed -e 's/^.//' << \SHAREOF > remote/usr.sys.PYR2.5/conf/makefromsource.diff
  2428. X*** /usr/toddb/crl/pyr/conf/makefromsource    Wed Sep 18 00:25:15 1985
  2429. X--- makefromsource    Thu Jan  2 15:18:44 1986
  2430. X***************
  2431. X*** 31,37
  2432. X  # Compile options that are passed to all other source files:
  2433. X  #   do not change (other than adding new options)
  2434. X  #
  2435. X! OPTIONS    = -DKERNEL -DINET -DRcsIdent -DNITP=8 -DXT -DWATCH
  2436. X  
  2437. X  CFLAGS    = ${PROFILE} -O $(OPTIONS) ${DUALCPU}
  2438. X  ENTRY    = _initcpus
  2439. X
  2440. X--- 31,37 -----
  2441. X  # Compile options that are passed to all other source files:
  2442. X  #   do not change (other than adding new options)
  2443. X  #
  2444. X! OPTIONS    = -DKERNEL -DINET -DRcsIdent -DNITP=8 -DXT -DWATCH -DREMOTEFS
  2445. X  
  2446. X  CFLAGS    = ${PROFILE} -O $(OPTIONS) ${DUALCPU}
  2447. X  ENTRY    = _initcpus
  2448. X***************
  2449. X*** 87,92
  2450. X      -mv param.c oldparam.c
  2451. X      cp ../conf/param.c .
  2452. X  
  2453. X  FRC:
  2454. X  # MAKEFROMBINARY ENDS HERE -- Do not delete this line.
  2455. X  
  2456. X
  2457. X--- 87,99 -----
  2458. X      -mv param.c oldparam.c
  2459. X      cp ../conf/param.c .
  2460. X  
  2461. X+ ../remote/rmt_data.c: ../remote/rmt_data_template ../remote/remotefs.h \
  2462. X+     ../sys/init_sysent.c
  2463. X+     cat ../remote/rmt_data_template > ../remote/nrmt_data.c
  2464. X+     /lib/cpp ${CFLAGS} ../sys/init_sysent.c | sh ../remote/remote_mkdata \
  2465. X+         ../remote/remotefs.h >> ../remote/nrmt_data.c
  2466. X+     mv ../remote/nrmt_data.c ../remote/rmt_data.c
  2467. X+ 
  2468. X  FRC:
  2469. X  # MAKEFROMBINARY ENDS HERE -- Do not delete this line.
  2470. X  
  2471. X***************
  2472. X*** 101,107
  2473. X      netimp debug 
  2474. X  
  2475. X  LIBS    = sys${LIB} io${LIB} net${LIB} ether${LIB} drw${LIB} \
  2476. X!     imp${LIB} dbg${LIB} 
  2477. X  
  2478. X  # The following lines are automatically generated; do not modify them manually.
  2479. X  # LISTS BEGIN HERE -- Do not delete this line: make lists uses it
  2480. X
  2481. X--- 108,114 -----
  2482. X      netimp debug 
  2483. X  
  2484. X  LIBS    = sys${LIB} io${LIB} net${LIB} ether${LIB} drw${LIB} \
  2485. X!     imp${LIB} dbg${LIB} remote${LIB}
  2486. X  
  2487. X  # The following lines are automatically generated; do not modify them manually.
  2488. X  # LISTS BEGIN HERE -- Do not delete this line: make lists uses it
  2489. X***************
  2490. X*** 205,210
  2491. X  debugOBJS= \
  2492. X      debug1.o debug2.o debug3.o dis.o 
  2493. X  
  2494. X  CFILES= \
  2495. X      ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
  2496. X      ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} 
  2497. X
  2498. X--- 212,227 -----
  2499. X  debugOBJS= \
  2500. X      debug1.o debug2.o debug3.o dis.o 
  2501. X  
  2502. X+ remoteSRCS= \
  2503. X+     ../remote/rmt_data.c ../remote/rmt_exec.c ../remote/rmt_final.c \
  2504. X+     ../remote/rmt_general.c ../remote/rmt_generic.c ../remote/rmt_io.c \
  2505. X+     ../remote/rmt_subr.c ../remote/rmt_syscall1.c ../remote/rmt_syscall2.c \
  2506. X+     ../remote/rmt_syscall3.c
  2507. X+ 
  2508. X+ remoteOBJS= \
  2509. X+     rmt_data.o rmt_exec.o rmt_final.o rmt_general.o rmt_generic.o \
  2510. X+     rmt_io.o rmt_subr.o rmt_syscall1.o rmt_syscall2.o rmt_syscall3.o
  2511. X+ 
  2512. X  CFILES= \
  2513. X      ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
  2514. X      ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} ${remoteSRCS}
  2515. X***************
  2516. X*** 207,213
  2517. X  
  2518. X  CFILES= \
  2519. X      ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
  2520. X!     ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} 
  2521. X  
  2522. X  MLFILES= \
  2523. X      ../ml/asm.s ../ml/ml.s 
  2524. X
  2525. X--- 224,230 -----
  2526. X  
  2527. X  CFILES= \
  2528. X      ${sysSRCS} ${ioSRCS} ${netSRCS} ${netinetSRCS} ${etherSRCS} \
  2529. X!     ${dr11wSRCS} ${netimpSRCS} ${debugSRCS} ${remoteSRCS}
  2530. X  
  2531. X  MLFILES= \
  2532. X      ../ml/asm.s ../ml/ml.s 
  2533. X***************
  2534. X*** 244,250
  2535. X      ../netinet/ip_var.h ../netinet/tcp.h ../netinet/tcp_debug.h \
  2536. X      ../netinet/tcp_fsm.h ../netinet/tcp_seq.h ../netinet/tcp_timer.h \
  2537. X      ../netinet/tcp_var.h ../netinet/tcpip.h ../netinet/udp.h \
  2538. X!     ../netinet/udp_var.h 
  2539. X  # LISTS END HERE -- Do not delete this line: make lists uses it
  2540. X  
  2541. X  # Special treatment for these files (symbolic links) which are used to
  2542. X
  2543. X--- 261,267 -----
  2544. X      ../netinet/ip_var.h ../netinet/tcp.h ../netinet/tcp_debug.h \
  2545. X      ../netinet/tcp_fsm.h ../netinet/tcp_seq.h ../netinet/tcp_timer.h \
  2546. X      ../netinet/tcp_var.h ../netinet/tcpip.h ../netinet/udp.h \
  2547. X!     ../netinet/udp_var.h ../remote/remotefs.h
  2548. X  # LISTS END HERE -- Do not delete this line: make lists uses it
  2549. X  
  2550. X  # Special treatment for these files (symbolic links) which are used to
  2551. X***************
  2552. X*** 308,313
  2553. X  dbg${LIB}: $(debugOBJS)
  2554. X      ar cr $@ $? && ranlib $@
  2555. X  
  2556. X  
  2557. X  ml.o:    ${MLFILES}
  2558. X      rm -f mltemp.[cs]
  2559. X
  2560. X--- 325,332 -----
  2561. X  dbg${LIB}: $(debugOBJS)
  2562. X      ar cr $@ $? && ranlib $@
  2563. X  
  2564. X+ remote${LIB}: $(remoteOBJS)
  2565. X+     ar cr $@ $? && ranlib $@
  2566. X  
  2567. X  ml.o:    ${MLFILES}
  2568. X      rm -f mltemp.[cs]
  2569. X***************
  2570. X*** 763,768
  2571. X      ${LD} -x -r $@ && mv a.out $@
  2572. X  dis.o: ../debug/dis.c
  2573. X      ${CC} -I. -c ${CFLAGS} ../debug/dis.c
  2574. X      ${LD} -x -r $@ && mv a.out $@
  2575. X  # RULES END HERE -- Do not delete this line: make rules uses it
  2576. X  
  2577. X
  2578. X--- 782,817 -----
  2579. X      ${LD} -x -r $@ && mv a.out $@
  2580. X  dis.o: ../debug/dis.c
  2581. X      ${CC} -I. -c ${CFLAGS} ../debug/dis.c
  2582. X+     ${LD} -x -r $@ && mv a.out $@
  2583. X+ rmt_data.o: ../remote/rmt_data.c
  2584. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_data.c
  2585. X+     ${LD} -x -r $@ && mv a.out $@
  2586. X+ rmt_exec.o: ../remote/rmt_exec.c
  2587. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_exec.c
  2588. X+     ${LD} -x -r $@ && mv a.out $@
  2589. X+ rmt_final.o: ../remote/rmt_final.c
  2590. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_final.c
  2591. X+     ${LD} -x -r $@ && mv a.out $@
  2592. X+ rmt_general.o: ../remote/rmt_general.c
  2593. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_general.c
  2594. X+     ${LD} -x -r $@ && mv a.out $@
  2595. X+ rmt_generic.o: ../remote/rmt_generic.c
  2596. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_generic.c
  2597. X+     ${LD} -x -r $@ && mv a.out $@
  2598. X+ rmt_io.o: ../remote/rmt_io.c
  2599. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_io.c
  2600. X+     ${LD} -x -r $@ && mv a.out $@
  2601. X+ rmt_subr.o: ../remote/rmt_subr.c
  2602. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_subr.c
  2603. X+     ${LD} -x -r $@ && mv a.out $@
  2604. X+ rmt_syscall1.o: ../remote/rmt_syscall1.c
  2605. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall1.c
  2606. X+     ${LD} -x -r $@ && mv a.out $@
  2607. X+ rmt_syscall2.o: ../remote/rmt_syscall2.c
  2608. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall2.c
  2609. X+     ${LD} -x -r $@ && mv a.out $@
  2610. X+ rmt_syscall3.o: ../remote/rmt_syscall3.c
  2611. X+     ${CC} -I. -c -DRFSDEBUG ${CFLAGS} ../remote/rmt_syscall3.c
  2612. X      ${LD} -x -r $@ && mv a.out $@
  2613. X  # RULES END HERE -- Do not delete this line: make rules uses it
  2614. X  
  2615. SHAREOF
  2616. chmod 664 remote/usr.sys.PYR2.5/conf/makefromsource.diff
  2617. #
  2618. # remote/usr.sys.PYR2.5/h
  2619. #
  2620. mkdir remote/usr.sys.PYR2.5/h
  2621. chmod 775 remote/usr.sys.PYR2.5/h
  2622.  
  2623.