date and time created 83/08/05 13:35:32 by sam
[unix-history] / usr / src / old / arff / arff.c
index b7199f7..26f3f4a 100644 (file)
@@ -1,10 +1,13 @@
-static char *sccsid = "@(#)arff.c      4.11 (Berkeley) 82/06/27";
+#ifndef lint
+static char sccsid[] = "@(#)arff.c     4.16 (Berkeley) 83/07/10";
+#endif
 
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <time.h>
+#include <sys/time.h>
 #include <signal.h>
 #include <stdio.h>
 #include <signal.h>
 #include <stdio.h>
+#include <sys/file.h>
 
 #define dbprintf printf
 
 
 #define dbprintf printf
 
@@ -25,7 +28,7 @@ struct rt_ent {
        u_short rt_len;         /* length of file */
        char    rt_chan;        /* only used in temporary files */
        char    rt_job;         /* only used in temporary files */
        u_short rt_len;         /* length of file */
        char    rt_chan;        /* only used in temporary files */
        char    rt_job;         /* only used in temporary files */
-       struct rt_dat rt_date;  /* creation date */
+       struct  rt_dat rt_date; /* creation date */
 };
 
 #define RT_TEMP                1
 };
 
 #define RT_TEMP                1
@@ -50,11 +53,6 @@ struct       rt_dir {
        char            _dirpad[6];
 };
 
        char            _dirpad[6];
 };
 
-extern struct rt_dir   rt_dir[RT_DIRSIZE];
-extern int             rt_entsiz;
-extern int             floppydes;
-extern char            *rt_last;
-
 typedef struct fldope {
        int     startad;
        int     count;
 typedef struct fldope {
        int     startad;
        int     count;
@@ -63,19 +61,20 @@ struct      rt_ent  *rtdope;
 
 FLDOPE *lookup();
 
 
 FLDOPE *lookup();
 
-#define rt(p) ((struct rt_ent *) p )
-#define Ain1 03100
-#define Ain2 050
-#define flag(c) (flg[('c') - 'a'])
+#define        rt(p)   ((struct rt_ent *) p )
+#define        Ain1    03100
+#define        Ain2    050
+#define        flag(c) (flg[('c') - 'a'])
 
 
-char *man = "rxtd";
-char zeroes[512];
+char   *man = "rxtd";
+char   zeroes[512];
 
 extern char *val;
 extern char table[256];
 struct rt_dir rt_dir[RT_DIRSIZE] = {
 
 extern char *val;
 extern char table[256];
 struct rt_dir rt_dir[RT_DIRSIZE] = {
-       {4, 0, 1, 0, 14},
-       { {0, RT_NULL, {0, 0, 0}, 494, 0}, {0, RT_ESEG} }
+       { 4, 0, 1, 0, 14 },
+       { { 0, RT_NULL, { 0, 0, 0 }, 494, 0 },
+         { 0, RT_ESEG } }
 };
 
 int    rt_entsiz;
 };
 
 int    rt_entsiz;
@@ -105,7 +104,6 @@ main(argc, argv)
 
        if (argc < 2)
                usage();
 
        if (argc < 2)
                usage();
-       cp = argv[1];
        for (cp = argv[1]; *cp; cp++)
                switch (*cp) {
 
        for (cp = argv[1]; *cp; cp++)
                switch (*cp) {
 
@@ -116,19 +114,7 @@ main(argc, argv)
                        flg[*cp-'a']++;
                        continue;
                case 'c':
                        flg[*cp-'a']++;
                        continue;
                case 'c':
-                       {
-#define SURE   "Last chance before clobbering floppy?"
-                               int tty;
-                               char response[128];
-
-                               tty = open("/dev/tty", 2);
-                               write(tty, SURE, sizeof(SURE));
-                               read(tty, response, sizeof(response));
-                               if (*response != 'y')
-                                       exit(50);
-                               flag(c)++;
-                               close(tty);
-                       }
+                       flag(c)++;
                        dirdirty++;
                        continue;
 
                        dirdirty++;
                        continue;
 
@@ -200,7 +186,7 @@ notfound()
                        fprintf(stderr, "arff: %s not found\n", namv[i]);
                        n++;
                }
                        fprintf(stderr, "arff: %s not found\n", namv[i]);
                        n++;
                }
-       return(n);
+       return (n);
 }
 
 mesg(c)
 }
 
 mesg(c)
@@ -219,27 +205,27 @@ tcmd()
        register struct rt_ent *rde;
 
        rt_init();
        register struct rt_ent *rde;
 
        rt_init();
-       if (namc == 0)
-               for (segnum = 0; segnum != -1;
-                    segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1)
-               {
-                       last = rt_last + segnum*2*RT_BLOCK;
-                       for (de = ((char *)&rt_dir[segnum])+10; de <= last; 
-                           de += rt_entsiz)
-                               if (rtls(rt(de))) {
-                                       nleft = (last-de)/rt_entsiz;
-#define ENTRIES "\n%d entries remaining in directory segment %d.\n"
-                                       printf(ENTRIES, nleft, segnum+1);
-                                       break;
-                               }
-               }
-       else
+       if (namc != 0) {
                for (i = 0; i < namc; i++)
                        if (dope = lookup(namv[i])) {
                                rde = dope->rtdope;
                                rtls(rde);
                                namv[i] = 0;
                        }
                for (i = 0; i < namc; i++)
                        if (dope = lookup(namv[i])) {
                                rde = dope->rtdope;
                                rtls(rde);
                                namv[i] = 0;
                        }
+               return;
+       }
+       for (segnum = 0; segnum != -1;
+         segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
+               last = rt_last + segnum*2*RT_BLOCK;
+               for (de = ((char *)&rt_dir[segnum])+10; de <= last; 
+                   de += rt_entsiz)
+                       if (rtls(rt(de))) {
+                               nleft = (last-de)/rt_entsiz;
+#define ENTRIES "\n%d entries remaining in directory segment %d.\n"
+                               printf(ENTRIES, nleft, segnum+1);
+                               break;
+                       }
+       }
 }
 
 rtls(de)
 }
 
 rtls(de)
@@ -275,9 +261,9 @@ rtls(de)
                break;
 
        case RT_ESEG:
                break;
 
        case RT_ESEG:
-               return(1);
+               return (1);
        }
        }
-       return(0);
+       return (0);
 }
 
 xcmd()
 }
 
 xcmd()
@@ -288,26 +274,30 @@ xcmd()
        register int i;
 
        rt_init();
        register int i;
 
        rt_init();
-       if (namc == 0) {
-               for (segnum = 0; segnum != -1;
-                    segnum = rt_dir[segnum].rt_axhead.rt_nxtseg-1)
-                       for (last = rt_last+(segnum*2*RT_BLOCK),
-                            de = ((char *)&rt_dir[segnum])+10; de <= last; 
-                            de += rt_entsiz)
-                               switch (rt(de)->rt_stat) {
-                               case RT_ESEG:
-                                       return;
-                               case RT_TEMP:
-                               case RT_FILE:
-                                       sunrad50(name,rt(de)->rt_name);
-                                       rtx(name);
-                               case RT_NULL:
-                               ;
-                               }
-       } else
+       if (namc != 0) {
                for (i = 0; i < namc; i++)
                        if (rtx(namv[i]) == 0)
                                namv[i] = 0;
                for (i = 0; i < namc; i++)
                        if (rtx(namv[i]) == 0)
                                namv[i] = 0;
+               return;
+       }
+       for (segnum = 0; segnum != -1;
+            segnum = rt_dir[segnum].rt_axhead.rt_nxtseg-1)
+               for (last = rt_last+(segnum*2*RT_BLOCK),
+                    de = ((char *)&rt_dir[segnum])+10; de <= last; 
+                    de += rt_entsiz)
+                       switch (rt(de)->rt_stat) {
+
+                       case RT_ESEG:
+                               return;
+
+                       case RT_TEMP:
+                       case RT_FILE:
+                               sunrad50(name,rt(de)->rt_name);
+                               rtx(name);
+
+                       case RT_NULL:
+                               break;
+                       }
 }
 
 rtx(name)
 }
 
 rtx(name)
@@ -327,7 +317,7 @@ rtx(name)
                        printf("x - %s\n",name);
 
                if ((file = creat(name, 0666)) < 0)
                        printf("x - %s\n",name);
 
                if ((file = creat(name, 0666)) < 0)
-                       return(1);
+                       return (1);
                count = dope->count;
                startad = dope->startad;
                for( ; count > 0 ; count -= 512) {
                count = dope->count;
                startad = dope->startad;
                for( ; count > 0 ; count -= 512) {
@@ -336,9 +326,9 @@ rtx(name)
                        startad += 512;
                }
                close(file);
                        startad += 512;
                }
                close(file);
-               return(0);
+               return (0);
        }
        }
-       return(1);
+       return (1);
 }
 
 rt_init()
 }
 
 rt_init()
@@ -353,6 +343,23 @@ rt_init()
        if (initized)
                return;
        initized = 1;
        if (initized)
                return;
        initized = 1;
+       if (flag(c)) {
+               struct stat sb;
+               char response[128];
+               int tty;
+
+               if (stat(defdev, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFREG)
+                       goto ignore;
+               tty = open("/dev/tty", O_RDWR);
+#define SURE   "Are you sure you want to clobber the floppy? "
+               write(tty, SURE, sizeof (SURE));
+               read(tty, response, sizeof (response));
+               if (*response != 'y')
+                       exit(50);
+               close(tty);
+ignore:
+               ;
+       }
        if (flag(c) || flag(d) || flag(r))
                mode = "r+";
        else
        if (flag(c) || flag(d) || flag(r))
                mode = "r+";
        else
@@ -365,6 +372,11 @@ rt_init()
        if (!flag(c)) {
                lread(6*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[0]);
                dirnum = rt_dir[0].rt_axhead.rt_numseg;
        if (!flag(c)) {
                lread(6*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[0]);
                dirnum = rt_dir[0].rt_axhead.rt_numseg;
+               /* check for blank/uninitialized diskette */
+               if (dirnum <= 0) {
+                       fprintf(stderr,"arff: bad directory format\n");
+                       exit(1);
+               }
                if (dirnum > RT_DIRSIZE) {
                        fprintf(stderr,"arff: too many directory segments\n");
                        exit(1);
                if (dirnum > RT_DIRSIZE) {
                        fprintf(stderr,"arff: too many directory segments\n");
                        exit(1);
@@ -422,14 +434,14 @@ lookup(name)
                                        result.startad = 512*
                                                (rt_dir[segnum].rt_axhead.rt_stfile + index);
                                        result.rtdope = (struct rt_ent *) de;
                                        result.startad = 512*
                                                (rt_dir[segnum].rt_axhead.rt_stfile + index);
                                        result.rtdope = (struct rt_ent *) de;
-                                       return(&result);
+                                       return (&result);
                                }
 
                        case RT_NULL:
                                index += rt(de)->rt_len;
                        }
         }
                                }
 
                        case RT_NULL:
                                index += rt(de)->rt_len;
                        }
         }
-       return((FLDOPE *) 0);
+       return ((FLDOPE *) 0);
 
 }
 
 
 }
 
@@ -437,7 +449,7 @@ static
 samename(a, b)
        u_short a[], b[];
 {
 samename(a, b)
        u_short a[], b[];
 {
-       return(*a == *b && a[1] == b[1] && a[2] == b[2] );
+       return (*a == *b && a[1] == b[1] && a[2] == b[2] );
 }
 
 rad50(cp, out)
 }
 
 rad50(cp, out)
@@ -583,7 +595,7 @@ trans(logical)
                sector *= 2;
        sector += 26 + ((track = (logical/26))-1)*6;
        sector %= 26;
                sector *= 2;
        sector += 26 + ((track = (logical/26))-1)*6;
        sector %= 26;
-       return((((track*26)+sector) << 7) + bytes);
+       return ((((track*26)+sector) << 7) + bytes);
 }
 
 lread(startad, count, obuff)
 }
 
 lread(startad, count, obuff)
@@ -649,7 +661,7 @@ rtr(name)
 
        if (stat(name, bufp) < 0) {
                perror(name);
 
        if (stat(name, bufp) < 0) {
                perror(name);
-               return(-1);
+               return (-1);
        }
        if (dope = lookup(name)) {
                /* can replace, no problem */
        }
        if (dope = lookup(name)) {
                /* can replace, no problem */
@@ -658,29 +670,33 @@ rtr(name)
                        printf("r - %s\n",name),
                        toflop(name, bufp->st_size, dope);
                else {
                        printf("r - %s\n",name),
                        toflop(name, bufp->st_size, dope);
                else {
-                       fprintf(stderr, "%s will not fit in currently used file on floppy\n",name);
-                       return(-1);
+                       fprintf(stderr,
+                         "%s will not fit in currently used file on floppy\n",
+                         name);
+                       return (-1);
                }
                }
-       } else {
-               /* Search for vacant spot */
-               for (segnum = 0; segnum != -1;
-                    segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1)
-               {
-                       last = rt_last + segnum*2*RT_BLOCK;
-                       for (de = rt_dir[segnum].rt_ents;
-                           rt(de)->rt_stat != RT_ESEG; de++)
-                               if ((de)->rt_stat == RT_NULL) {
-                                       if (bufp->st_size <= (de->rt_len*512)) {
-                                               printf("a - %s\n",name),
-                                               mkent(de, segnum, bufp,name);
-                                               goto found;
-                                       }
-                                       continue;
+               goto found;
+       }
+       /*
+        * Search for vacant spot
+        */
+       for (segnum = 0; segnum != -1;
+            segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1)
+       {
+               last = rt_last + segnum*2*RT_BLOCK;
+               for (de = rt_dir[segnum].rt_ents;
+                   rt(de)->rt_stat != RT_ESEG; de++)
+                       if ((de)->rt_stat == RT_NULL) {
+                               if (bufp->st_size <= (de->rt_len*512)) {
+                                       printf("a - %s\n",name),
+                                       mkent(de, segnum, bufp,name);
+                                       goto found;
                                }
                                }
-           }
-           printf("%s: no slot for file\n", name);
-           return (-1);
+                               continue;
+                       }
        }
        }
+       printf("%s: no slot for file\n", name);
+       return (-1);
 
 found:
        if (dope = lookup(name)) {
 
 found:
        if (dope = lookup(name)) {
@@ -710,8 +726,8 @@ mkent(de, segnum, bufp, name)
                /* no entries left on segment */
                if (flag(o))
                        goto overwrite;
                /* no entries left on segment */
                if (flag(o))
                        goto overwrite;
-               fprintf(stderr,"Directory segment #%d full on  %s\n",segnum+1,
-                       defdev);
+               fprintf(stderr, "Directory segment #%d full on  %s\n",
+                       segnum+1, defdev);
                exit(1);
        }       
        /* copy directory entries up */
                exit(1);
        }       
        /* copy directory entries up */
@@ -796,11 +812,11 @@ rtk(name)
                de->rt_name[0] = 0;
                de->rt_name[1] = 0;
                de->rt_name[2] = 0;
                de->rt_name[0] = 0;
                de->rt_name[1] = 0;
                de->rt_name[2] = 0;
-               * ((u_short *)&(de->rt_date)) = 0;
+               *((u_short *)&(de->rt_date)) = 0;
                dirdirty = 1;
                dirdirty = 1;
-               return(0);
+               return (0);
        }
        }
-       return(1);
+       return (1);
 }
 
 scrunch()
 }
 
 scrunch()
@@ -810,19 +826,18 @@ scrunch()
 
        for (segnum = 0; segnum != -1;
             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
 
        for (segnum = 0; segnum != -1;
             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
-               dirdirty = 0;
                for (de = rt_dir[segnum].rt_ents; de <= rt_curend[segnum]; de++)
                for (de = rt_dir[segnum].rt_ents; de <= rt_curend[segnum]; de++)
-                       if (de->rt_stat == RT_NULL && de[1].rt_stat == RT_NULL) {
+                       if (de->rt_stat == RT_NULL &&
+                           (de+1)->rt_stat == RT_NULL) {
                                (de+1)->rt_len += de->rt_len;
                                (de+1)->rt_len += de->rt_len;
-                               for (workp = de; workp < rt_curend[segnum]; workp++)
+                               for (workp=de; workp<rt_curend[segnum]; workp++)
                                        *workp = workp[1];
                                de--;
                                rt_curend[segnum]--;
                                rt_nleft++;
                                        *workp = workp[1];
                                de--;
                                rt_curend[segnum]--;
                                rt_nleft++;
-                               dirdirty = 1;
                        }
                        }
-               if (dirdirty)
-                       lwrite((6+segnum*2)*RT_BLOCK, 2*RT_BLOCK,
-                               (char *)&rt_dir[segnum]);
+               lwrite((6+segnum*2)*RT_BLOCK, 2*RT_BLOCK,
+                       (char *)&rt_dir[segnum]);
        }
        }
+       dirdirty = 0;
 }
 }