date and time created 91/03/07 20:28:05 by bostic
[unix-history] / usr / src / bin / csh / func.c
index f281a6e..14c7a9f 100644 (file)
@@ -1,9 +1,16 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley Software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)func.c      4.14 (Berkeley) %G%";
+static char *sccsid = "@(#)func.c      5.10 (Berkeley) %G%";
 #endif
 
 #include "sh.h"
 #include <sys/ioctl.h>
 #endif
 
 #include "sh.h"
 #include <sys/ioctl.h>
+#include "pathnames.h"
 
 /*
  * C shell
 
 /*
  * C shell
@@ -169,26 +176,11 @@ dologin(v)
        islogin();
        rechist();
        (void) signal(SIGTERM, parterm);
        islogin();
        rechist();
        (void) signal(SIGTERM, parterm);
-       execl("/bin/login", "login", v[1], 0);
+       execl(_PATH_LOGIN, "login", v[1], 0);
        untty();
        exit(1);
 }
 
        untty();
        exit(1);
 }
 
-#ifdef NEWGRP
-donewgrp(v)
-       char **v;
-{
-
-       if (chkstop == 0 && setintr)
-               panystop(0);
-       (void) signal(SIGTERM, parterm);
-       execl("/bin/newgrp", "newgrp", v[1], 0);
-       execl("/usr/bin/newgrp", "newgrp", v[1], 0);
-       untty();
-       exit(1);
-}
-#endif
-
 islogin()
 {
 
 islogin()
 {
 
@@ -412,7 +404,7 @@ preread()
 
        whyles->w_end = -1;
        if (setintr)
 
        whyles->w_end = -1;
        if (setintr)
-               (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
+               (void) sigsetmask(sigblock(0L) & ~sigmask(SIGINT));
        search(ZBREAK, 0);
        if (setintr)
                (void) sigblock(sigmask(SIGINT));
        search(ZBREAK, 0);
        if (setintr)
                (void) sigblock(sigmask(SIGINT));
@@ -461,7 +453,8 @@ dorepeat(v, kp)
        char **v;
        struct command *kp;
 {
        char **v;
        struct command *kp;
 {
-       register int i, omask;
+       register int i;
+       register long   omask;
 
        i = getn(v[1]);
        if (setintr)
 
        i = getn(v[1]);
        if (setintr)
@@ -725,7 +718,7 @@ echo(sep, v)
        int nonl = 0;
 
        if (setintr)
        int nonl = 0;
 
        if (setintr)
-               (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
+               (void) sigsetmask(sigblock(0L) & ~sigmask(SIGINT));
        v++;
        if (*v == 0)
                return;
        v++;
        if (*v == 0)
                return;
@@ -742,12 +735,12 @@ echo(sep, v)
                register int c;
 
                while (c = *cp++)
                register int c;
 
                while (c = *cp++)
-                       putchar(c | QUOTE);
+                       cshputchar(c | QUOTE);
                if (*v)
                if (*v)
-                       putchar(sep | QUOTE);
+                       cshputchar(sep | QUOTE);
        }
        if (sep && nonl == 0)
        }
        if (sep && nonl == 0)
-               putchar('\n');
+               cshputchar('\n');
        else
                flush();
        if (setintr)
        else
                flush();
        if (setintr)
@@ -761,10 +754,22 @@ char      **environ;
 dosetenv(v)
        register char **v;
 {
 dosetenv(v)
        register char **v;
 {
-       char *lp = globone(v[2]);
+       char *vp, *lp;
+
+       v++;
+       if ((vp = *v++) == 0) {
+               register char **ep;
 
 
-       setenv(v[1], lp);
-       if (eq(v[1], "PATH")) {
+               if (setintr)
+                       (void) sigsetmask(sigblock(0L) & ~ sigmask(SIGINT));
+               for (ep = environ; *ep; ep++)
+                       printf("%s\n", *ep);
+               return;
+       }
+       if ((lp = *v++) == 0)
+               lp = "";
+       setenv(vp, lp = globone(lp));
+       if (eq(vp, "PATH")) {
                importpath(lp);
                dohash();
        }
                importpath(lp);
                dohash();
        }
@@ -888,20 +893,25 @@ dolimit(v)
 {
        register struct limits *lp;
        register int limit;
 {
        register struct limits *lp;
        register int limit;
+       char hard = 0;
 
        v++;
 
        v++;
+       if (*v && eq(*v, "-h")) {
+               hard = 1;
+               v++;
+       }
        if (*v == 0) {
        if (*v == 0) {
-               for (lp = limits+1; lp->limconst >= 0; lp++)
-                       plim(lp);
+               for (lp = limits; lp->limconst >= 0; lp++)
+                       plim(lp, hard);
                return;
        }
        lp = findlim(v[0]);
        if (v[1] == 0) {
                return;
        }
        lp = findlim(v[0]);
        if (v[1] == 0) {
-               plim(lp);
+               plim(lp,  hard);
                return;
        }
        limit = getval(lp, v+1);
                return;
        }
        limit = getval(lp, v+1);
-       if (setlim(lp, limit) < 0)
+       if (setlim(lp, hard, limit) < 0)
                error(NOSTR);
 }
 
                error(NOSTR);
 }
 
@@ -984,19 +994,22 @@ limtail(cp, str0)
                error("Bad scaling; did you mean ``%s''?", str0);
 }
 
                error("Bad scaling; did you mean ``%s''?", str0);
 }
 
-plim(lp)
+plim(lp, hard)
        register struct limits *lp;
        register struct limits *lp;
+       char hard;
 {
        struct rlimit rlim;
 {
        struct rlimit rlim;
+       int limit;
 
        printf("%s \t", lp->limname);
        (void) getrlimit(lp->limconst, &rlim);
 
        printf("%s \t", lp->limname);
        (void) getrlimit(lp->limconst, &rlim);
-       if (rlim.rlim_cur == RLIM_INFINITY)
+       limit = hard ? rlim.rlim_max : rlim.rlim_cur;
+       if (limit == RLIM_INFINITY)
                printf("unlimited");
        else if (lp->limconst == RLIMIT_CPU)
                printf("unlimited");
        else if (lp->limconst == RLIMIT_CPU)
-               psecs((long)rlim.rlim_cur);
+               psecs((long)limit);
        else
        else
-               printf("%d %s", rlim.rlim_cur / lp->limdiv, lp->limscale);
+               printf("%d %s", limit / lp->limdiv, lp->limscale);
        printf("\n");
 }
 
        printf("\n");
 }
 
@@ -1005,11 +1018,16 @@ dounlimit(v)
 {
        register struct limits *lp;
        int err = 0;
 {
        register struct limits *lp;
        int err = 0;
+       char hard = 0;
 
        v++;
 
        v++;
+       if (*v && eq(*v, "-h")) {
+               hard = 1;
+               v++;
+       }
        if (*v == 0) {
        if (*v == 0) {
-               for (lp = limits+1; lp->limconst >= 0; lp++)
-                       if (setlim(lp, (int)RLIM_INFINITY) < 0)
+               for (lp = limits; lp->limconst >= 0; lp++)
+                       if (setlim(lp, hard, (int)RLIM_INFINITY) < 0)
                                err++;
                if (err)
                        error(NOSTR);
                                err++;
                if (err)
                        error(NOSTR);
@@ -1017,24 +1035,28 @@ dounlimit(v)
        }
        while (*v) {
                lp = findlim(*v++);
        }
        while (*v) {
                lp = findlim(*v++);
-               if (setlim(lp, (int)RLIM_INFINITY) < 0)
+               if (setlim(lp, hard, (int)RLIM_INFINITY) < 0)
                        error(NOSTR);
        }
 }
 
                        error(NOSTR);
        }
 }
 
-setlim(lp, limit)
+setlim(lp, hard, limit)
        register struct limits *lp;
        register struct limits *lp;
+       char hard;
 {
        struct rlimit rlim;
 
        (void) getrlimit(lp->limconst, &rlim);
 {
        struct rlimit rlim;
 
        (void) getrlimit(lp->limconst, &rlim);
-       if (limit == RLIM_INFINITY && geteuid() != 0)
+       if (hard)
+               rlim.rlim_max = limit;
+       else if (limit == RLIM_INFINITY && geteuid() != 0)
                rlim.rlim_cur = rlim.rlim_max;
        else
                rlim.rlim_cur = limit;
        if (setrlimit(lp->limconst, &rlim) < 0) {
                rlim.rlim_cur = rlim.rlim_max;
        else
                rlim.rlim_cur = limit;
        if (setrlimit(lp->limconst, &rlim) < 0) {
-               printf("%s: %s: Can't %s limit\n", bname, lp->limname,
-                   limit == RLIM_INFINITY ? "remove" : "set");
+               printf("%s: %s: Can't %s%s limit\n", bname, lp->limname,
+                   limit == RLIM_INFINITY ? "remove" : "set",
+                   hard ? " hard" : "");
                return (-1);
        }
        return (0);
                return (-1);
        }
        return (0);
@@ -1042,8 +1064,8 @@ setlim(lp, limit)
 
 dosuspend()
 {
 
 dosuspend()
 {
+       sig_t old;
        int ldisc, ctpgrp;
        int ldisc, ctpgrp;
-       int (*old)();
 
        if (loginsh)
                error("Can't suspend a login shell (yet)");
 
        if (loginsh)
                error("Can't suspend a login shell (yet)");
@@ -1061,14 +1083,8 @@ retry:
                        (void) signal(SIGTTIN, old);
                        goto retry;
                }
                        (void) signal(SIGTTIN, old);
                        goto retry;
                }
-               (void) ioctl(FSHTTY, TIOCSPGRP, (char *)&shpgrp);
                (void) setpgrp(0, shpgrp);
                (void) setpgrp(0, shpgrp);
-       }
-       (void) ioctl(FSHTTY, TIOCGETD, (char *)&oldisc);
-       if (oldisc != NTTYDISC) {
-               printf("Switching to new tty driver...\n");
-               ldisc = NTTYDISC;
-               (void) ioctl(FSHTTY, TIOCSETD, (char *)&ldisc);
+               (void) ioctl(FSHTTY, TIOCSPGRP, (char *)&shpgrp);
        }
 }
 
        }
 }