Annotation of 43BSD/contrib/jove/rec.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2:  * This program is copyright (C) 1985, 1986 by Jonathan Payne.  It is    *
                      3:  * provided to you without charge for use only on a licensed Unix        *
                      4:  * system.  You may copy JOVE provided that this notice is included with *
                      5:  * the copy.  You may not sell copies of this program or versions        *
                      6:  * modified for use on microcomputer systems, unless the copies are      *
                      7:  * included with a Unix system distribution and the source is provided.  *
                      8:  *************************************************************************/
                      9: 
                     10: #include "jove.h"
                     11: #include "io.h"
                     12: #include "temp.h"
                     13: #include "rec.h"
                     14: #include <sys/file.h>
                     15: 
                     16: static int     rec_fd = 0;     /* File descriptor of recover file. */
                     17: static char    *recfname;
                     18: static File    *rec_out;
                     19: 
                     20: #ifndef L_SET
                     21: #      define L_SET 0
                     22: #endif
                     23: 
                     24: struct rec_head        Header;
                     25: 
                     26: recinit()
                     27: {
                     28:        recfname = mktemp(RECFILE);
                     29:        rec_fd = creat(recfname, 0644);
                     30:        if (rec_fd == -1) {
                     31:                f_mess("Cannot open \"%s\"; recovery disabled.", recfname);
                     32:                (void) SitFor(7);
                     33:                return;
                     34:        }
                     35:        /* Initialize the record IO. */
                     36:        rec_out = fd_open(recfname, F_WRITE|F_LOCK, rec_fd, iobuff, LBSIZE);
                     37: 
                     38:        /* Initialize the record header. */
                     39:        Header.Uid = getuid();
                     40:        Header.Pid = getpid();
                     41:        Header.UpdTime = 0L;
                     42:        Header.Nbuffers = 0;
                     43:        (void) write(rec_fd, (char *) &Header, sizeof Header);
                     44: }
                     45: 
                     46: recclose()
                     47: {
                     48:        if (rec_fd == -1)
                     49:                return;
                     50:        (void) close(rec_fd);
                     51:        (void) unlink(recfname);
                     52: }
                     53: 
                     54: static
                     55: putaddr(addr, p)
                     56: disk_line      addr;
                     57: register File  *p;
                     58: {
                     59:        register char   *cp = (char *) &addr;
                     60:        register int    nchars = sizeof (disk_line);
                     61: 
                     62:        while (--nchars >= 0)
                     63:                putc(*cp++ & 0377, p);
                     64: }
                     65: 
                     66: static
                     67: putn(cp, nbytes)
                     68: register char  *cp;
                     69: register int   nbytes;
                     70: {
                     71:        while (--nbytes >= 0)
                     72:                putc(*cp++ & 0377, rec_out);
                     73: }
                     74: 
                     75: /* Write out the line pointers for buffer B. */
                     76: 
                     77: static
                     78: dmppntrs(b)
                     79: register Buffer        *b;
                     80: {
                     81:        register Line   *lp;
                     82: 
                     83:        for (lp = b->b_first; lp != 0; lp = lp->l_next)
                     84:                putaddr(lp->l_dline, rec_out);
                     85: }
                     86: 
                     87: /* dump the buffer info and then the actual line pointers. */
                     88: 
                     89: static
                     90: dmp_buf(b)
                     91: register Buffer        *b;
                     92: {
                     93:        static struct rec_entry record;
                     94:        register Line   *lp;
                     95:        register int    nlines = 0;
                     96: 
                     97:        for (lp = b->b_first; lp != 0; lp = lp->l_next, nlines++)
                     98:                ;
                     99:        strcpy(record.r_fname, b->b_fname ? b->b_fname : NullStr);
                    100:        strcpy(record.r_bname, b->b_name);
                    101:        record.r_nlines = nlines;
                    102:        putn((char *) &record, sizeof record);
                    103:        dmppntrs(b);
                    104: }
                    105: 
                    106: /* Goes through all the buffers and syncs them to the disk. */
                    107: 
                    108: int    SyncFreq = 50;
                    109: 
                    110: SyncRec()
                    111: {
                    112:        register Buffer *b;
                    113: 
                    114:        if (rec_fd == 0)
                    115:                recinit();      /* Init recover file. */
                    116:        if (rec_fd == -1)
                    117:                return;
                    118:        lseek(rec_fd, 0L, L_SET);
                    119:        (void) time(&Header.UpdTime);
                    120:        Header.Nbuffers = 0;
                    121:        for (b = world; b != 0; b = b->b_next)
                    122:                if (b->b_type == B_SCRATCH || !IsModified(b))
                    123:                        continue;
                    124:                else
                    125:                        Header.Nbuffers++;
                    126:        putn((char *) &Header, sizeof Header);
                    127:        if (Header.Nbuffers != 0) {
                    128:                SyncTmp();
                    129:                for (b = world; b != 0; b = b->b_next)
                    130:                        if (b->b_type == B_SCRATCH || !IsModified(b))
                    131:                                continue;
                    132:                        else
                    133:                                dmp_buf(b);
                    134:        }
                    135:        flush(rec_out);
                    136: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.