bit operations generate longword reference which may reference the
[unix-history] / usr / src / bin / sh / var.c
index fa138f8..2c23432 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)var.c      5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)var.c      5.7 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -44,6 +44,7 @@ struct varinit {
 #if ATTY
 struct var vatty;
 #endif
 #if ATTY
 struct var vatty;
 #endif
+struct var vhistsize;
 struct var vifs;
 struct var vmail;
 struct var vmpath;
 struct var vifs;
 struct var vmail;
 struct var vmpath;
@@ -59,11 +60,14 @@ const struct varinit varinit[] = {
 #if ATTY
        {&vatty,        VSTRFIXED|VTEXTFIXED|VUNSET,    "ATTY="},
 #endif
 #if ATTY
        {&vatty,        VSTRFIXED|VTEXTFIXED|VUNSET,    "ATTY="},
 #endif
+       {&vhistsize,    VSTRFIXED|VTEXTFIXED|VUNSET,    "HISTSIZE="},
        {&vifs, VSTRFIXED|VTEXTFIXED,           "IFS= \t\n"},
        {&vmail,        VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL="},
        {&vmpath,       VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH="},
        {&vpath,        VSTRFIXED|VTEXTFIXED,           "PATH=:/bin:/usr/bin"},
        {&vifs, VSTRFIXED|VTEXTFIXED,           "IFS= \t\n"},
        {&vmail,        VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL="},
        {&vmpath,       VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH="},
        {&vpath,        VSTRFIXED|VTEXTFIXED,           "PATH=:/bin:/usr/bin"},
-       {&vps1, VSTRFIXED|VTEXTFIXED,           "PS1=$ "},
+       /* 
+        * vps1 depends on uid
+        */
        {&vps2, VSTRFIXED|VTEXTFIXED,           "PS2=> "},
 #if ATTY
        {&vterm,        VSTRFIXED|VTEXTFIXED|VUNSET,    "TERM="},
        {&vps2, VSTRFIXED|VTEXTFIXED,           "PS2=> "},
 #if ATTY
        {&vterm,        VSTRFIXED|VTEXTFIXED|VUNSET,    "TERM="},
@@ -73,17 +77,9 @@ const struct varinit varinit[] = {
 
 struct var *vartab[VTABSIZE];
 
 
 struct var *vartab[VTABSIZE];
 
-#ifdef __STDC__
-STATIC void unsetvar(char *);
-STATIC struct var **hashvar(char *);
-STATIC int varequal(char *, char *);
-#else
-STATIC void unsetvar();
-STATIC struct var **hashvar();
-STATIC int varequal();
-#endif
-
-
+STATIC int unsetvar __P((char *));
+STATIC struct var **hashvar __P((char *));
+STATIC int varequal __P((char *, char *));
 
 /*
  * Initialize the varable symbol tables and import the environment
 
 /*
  * Initialize the varable symbol tables and import the environment
@@ -118,9 +114,6 @@ initvar() {
 
        for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
                if ((vp->flags & VEXPORT) == 0) {
 
        for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
                if ((vp->flags & VEXPORT) == 0) {
-                       if ((strncmp(ip->text, "PS1=", 4) == 0) &&
-                           getuid() == 0)
-                               ip->text = "PS1=# ";
                        vpp = hashvar(ip->text);
                        vp->next = *vpp;
                        *vpp = vp;
                        vpp = hashvar(ip->text);
                        vp->next = *vpp;
                        *vpp = vp;
@@ -128,7 +121,16 @@ initvar() {
                        vp->flags = ip->flags;
                }
        }
                        vp->flags = ip->flags;
                }
        }
-
+       /*
+        * PS1 depends on uid
+        */
+       if ((vps1.flags & VEXPORT) == 0) {
+               vpp = hashvar("PS1=");
+               vps1.next = *vpp;
+               *vpp = &vps1;
+               vps1.text = geteuid() ? "PS1=$ " : "PS1=# ";
+               vps1.flags = VSTRFIXED|VTEXTFIXED;
+       }
 }
 
 /*
 }
 
 /*
@@ -160,7 +162,7 @@ setvar(name, val, flags)
        }
        namelen = p - name;
        if (isbad)
        }
        namelen = p - name;
        if (isbad)
-               error("%.*s: is read only", namelen, name);
+               error("%.*s: bad variable name", namelen, name);
        len = namelen + 2;              /* 2 is space for '=' and '\0' */
        if (val == NULL) {
                flags |= VUNSET;
        len = namelen + 2;              /* 2 is space for '=' and '\0' */
        if (val == NULL) {
                flags |= VUNSET;
@@ -210,6 +212,8 @@ setvareq(s, flags)
                        vp->text = s;
                        if (vp == &vmpath || (vp == &vmail && ! mpathset()))
                                chkmail(1);
                        vp->text = s;
                        if (vp == &vmpath || (vp == &vmail && ! mpathset()))
                                chkmail(1);
+                       if (vp == &vhistsize)
+                               sethistsize();
                        INTON;
                        return;
                }
                        INTON;
                        return;
                }
@@ -465,8 +469,8 @@ mklocal(name)
        INTOFF;
        lvp = ckmalloc(sizeof (struct localvar));
        if (name[0] == '-' && name[1] == '\0') {
        INTOFF;
        lvp = ckmalloc(sizeof (struct localvar));
        if (name[0] == '-' && name[1] == '\0') {
-               lvp->text = ckmalloc(sizeof optval);
-               bcopy(optval, lvp->text, sizeof optval);
+               lvp->text = ckmalloc(sizeof optlist);
+               bcopy(optlist, lvp->text, sizeof optlist);
                vp = NULL;
        } else {
                vpp = hashvar(name);
                vp = NULL;
        } else {
                vpp = hashvar(name);
@@ -507,10 +511,10 @@ poplocalvars() {
                localvars = lvp->next;
                vp = lvp->vp;
                if (vp == NULL) {       /* $- saved */
                localvars = lvp->next;
                vp = lvp->vp;
                if (vp == NULL) {       /* $- saved */
-                       bcopy(lvp->text, optval, sizeof optval);
+                       bcopy(lvp->text, optlist, sizeof optlist);
                        ckfree(lvp->text);
                } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
                        ckfree(lvp->text);
                } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
-                       unsetvar(vp->text);
+                       (void)unsetvar(vp->text);
                } else {
                        if ((vp->flags & VTEXTFIXED) == 0)
                                ckfree(vp->text);
                } else {
                        if ((vp->flags & VTEXTFIXED) == 0)
                                ckfree(vp->text);
@@ -541,12 +545,27 @@ setvarcmd(argc, argv)  char **argv; {
 
 unsetcmd(argc, argv)  char **argv; {
        char **ap;
 
 unsetcmd(argc, argv)  char **argv; {
        char **ap;
-
-       for (ap = argv + 1 ; *ap ; ap++) {
-               unsetfunc(*ap);
-               unsetvar(*ap);
+       int i;
+       int flg_func = 0;
+       int flg_var = 0;
+       int ret = 0;
+
+       while ((i = nextopt("vf")) != '\0') {
+               if (i == 'f')
+                       flg_func = 1;
+               else
+                       flg_var = 1;
        }
        }
-       return 0;
+       if (flg_func == 0 && flg_var == 0)
+               flg_var = 1;
+                       
+       for (ap = argptr; *ap ; ap++) {
+               if (flg_func)
+                       ret |= unsetfunc(*ap);
+               if (flg_var)
+                       ret |= unsetvar(*ap);
+       }
+       return ret;
 }
 
 
 }
 
 
@@ -554,7 +573,7 @@ unsetcmd(argc, argv)  char **argv; {
  * Unset the specified variable.
  */
 
  * Unset the specified variable.
  */
 
-STATIC void
+STATIC int
 unsetvar(s)
        char *s;
        {
 unsetvar(s)
        char *s;
        {
@@ -564,11 +583,11 @@ unsetvar(s)
        vpp = hashvar(s);
        for (vp = *vpp ; vp ; vpp = &vp->next, vp = *vpp) {
                if (varequal(vp->text, s)) {
        vpp = hashvar(s);
        for (vp = *vpp ; vp ; vpp = &vp->next, vp = *vpp) {
                if (varequal(vp->text, s)) {
+                       if (vp->flags & VREADONLY)
+                               return (1);
                        INTOFF;
                        INTOFF;
-                       if (*(strchr(vp->text, '=') + 1) != '\0'
-                        || vp->flags & VREADONLY) {
+                       if (*(strchr(vp->text, '=') + 1) != '\0')
                                setvar(s, nullstr, 0);
                                setvar(s, nullstr, 0);
-                       }
                        vp->flags &=~ VEXPORT;
                        vp->flags |= VUNSET;
                        if ((vp->flags & VSTRFIXED) == 0) {
                        vp->flags &=~ VEXPORT;
                        vp->flags |= VUNSET;
                        if ((vp->flags & VSTRFIXED) == 0) {
@@ -578,9 +597,11 @@ unsetvar(s)
                                ckfree(vp);
                        }
                        INTON;
                                ckfree(vp);
                        }
                        INTON;
-                       return;
+                       return (0);
                }
        }
                }
        }
+
+       return (1);
 }
 
 
 }