Annotation of 43BSDReno/contrib/jove/rec.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: #include "jove.h"
        !             9: #include "fp.h"
        !            10: #include "rec.h"
        !            11: 
        !            12: #ifndef MAC
        !            13: #      include <sys/file.h>
        !            14: #endif
        !            15: 
        !            16: private int    rec_fd = -1;
        !            17: private char   *recfname;
        !            18: private File   *rec_out;
        !            19: 
        !            20: #ifndef L_SET
        !            21: #      define L_SET 0
        !            22: #endif
        !            23: 
        !            24: private struct rec_head        Header;
        !            25: 
        !            26: private void
        !            27: recinit()
        !            28: {
        !            29:        char    buf[128];
        !            30: 
        !            31: #ifdef MAC
        !            32:        swritef(buf, "%s/%s", HomeDir, p_tempfile);
        !            33: #else
        !            34:        swritef(buf, "%s/%s", TmpFilePath, p_tempfile);
        !            35: #endif
        !            36:        recfname = copystr(buf);
        !            37:        recfname = mktemp(recfname);
        !            38:        rec_fd = creat(recfname, 0644);
        !            39:        if (rec_fd == -1) {
        !            40:                complain("Cannot create \"%s\"; recovery disabled.", recfname);
        !            41:                return;
        !            42:        }
        !            43:        /* initialize the record IO */
        !            44:        rec_out = fd_open(recfname, F_WRITE|F_LOCKED, rec_fd, iobuff, LBSIZE);
        !            45: 
        !            46:        /* Initialize the record header. */
        !            47:        Header.Uid = getuid();
        !            48:        Header.Pid = getpid();
        !            49:        Header.UpdTime = 0L;
        !            50:        Header.Nbuffers = 0;
        !            51:        (void) write(rec_fd, (char *) &Header, sizeof Header);
        !            52: }
        !            53: 
        !            54: void
        !            55: recclose()
        !            56: {
        !            57:        if (rec_fd == -1)
        !            58:                return;
        !            59:        (void) close(rec_fd);
        !            60:        rec_fd = -1;
        !            61:        (void) unlink(recfname);
        !            62: }
        !            63: 
        !            64: private void
        !            65: putaddr(addr, p)
        !            66: daddr  addr;
        !            67: register File  *p;
        !            68: {
        !            69:        register char   *cp = (char *) &addr;
        !            70:        register int    nchars = sizeof (daddr);
        !            71: 
        !            72:        while (--nchars >= 0)
        !            73:                jputc(*cp++ & 0377, p);
        !            74: }
        !            75: 
        !            76: private void
        !            77: putn(cp, nbytes)
        !            78: register char  *cp;
        !            79: register size_t        nbytes;
        !            80: {
        !            81:        while (nbytes-- > 0)
        !            82:                jputc(*cp++ & 0377, rec_out);
        !            83: }
        !            84: 
        !            85: /* Write out the line pointers for buffer B. */
        !            86: 
        !            87: private void
        !            88: dmppntrs(b)
        !            89: register Buffer        *b;
        !            90: {
        !            91:        register Line   *lp;
        !            92: 
        !            93:        for (lp = b->b_first; lp != 0; lp = lp->l_next)
        !            94:                putaddr(lp->l_dline, rec_out);
        !            95: }
        !            96: 
        !            97: /* dump the buffer info and then the actual line pointers. */
        !            98: 
        !            99: private void
        !           100: dmp_buf_header(b)
        !           101: register Buffer        *b;
        !           102: {
        !           103:        struct rec_entry        record;
        !           104:        register Line   *lp;
        !           105:        register int    nlines = 0;
        !           106: 
        !           107:        for (lp = b->b_first; lp != 0; lp = lp->l_next, nlines++)
        !           108:                if (lp == b->b_dot)
        !           109:                        record.r_dotline = nlines;
        !           110:        strcpy(record.r_fname, b->b_fname ? b->b_fname : NullStr);
        !           111:        strcpy(record.r_bname, b->b_name);
        !           112:        record.r_nlines = nlines;
        !           113:        record.r_dotchar = b->b_char;
        !           114:        putn((char *) &record, sizeof record);
        !           115: }
        !           116: 
        !           117: /* Goes through all the buffers and syncs them to the disk. */
        !           118: 
        !           119: int    SyncFreq = 50;
        !           120: 
        !           121: void
        !           122: SyncRec()
        !           123: {
        !           124:        register Buffer *b;
        !           125:        static int      beenhere = NO;
        !           126: 
        !           127:        if (beenhere == NO) {
        !           128:                beenhere = YES;
        !           129:                recinit();      /* Init recover file. */
        !           130:        }
        !           131:        if (rec_fd == -1)
        !           132:                return;
        !           133:        lseek(rec_fd, 0L, L_SET);
        !           134:        (void) time(&Header.UpdTime);
        !           135:        Header.Nbuffers = 0;
        !           136:        for (b = world; b != 0; b = b->b_next)
        !           137:                if (b->b_type == B_SCRATCH || !IsModified(b))
        !           138:                        continue;
        !           139:                else
        !           140:                        Header.Nbuffers += 1;
        !           141:        Header.FreePtr = DFree;
        !           142:        putn((char *) &Header, sizeof Header);
        !           143:        if (Header.Nbuffers != 0) {
        !           144:                lsave();        /* this makes things really right */
        !           145:                SyncTmp();
        !           146:                for (b = world; b != 0; b = b->b_next)
        !           147:                        if (b->b_type == B_SCRATCH || !IsModified(b))
        !           148:                                continue;
        !           149:                        else
        !           150:                                dmp_buf_header(b);
        !           151:                for (b = world; b != 0; b = b->b_next)
        !           152:                        if (b->b_type == B_SCRATCH || !IsModified(b))
        !           153:                                continue;
        !           154:                        else
        !           155:                                dmppntrs(b);
        !           156:        }
        !           157:        flush(rec_out);
        !           158: }
        !           159: 
        !           160: /* Full Recover.  What we have to do is go find the name of the tmp
        !           161:    file data/rec pair and use those instead of the ones we would have
        !           162:    created eventually.  The rec file has a list of buffers, and then
        !           163:    the actual pointers.  Stored for each buffer is the buffer name,
        !           164:    the file name, the number of lines, the current line, the current
        !           165:    character.  The current modes do not need saving as they will be
        !           166:    saved when the file name is set.  If a process was running in a
        !           167:    buffer, it will be lost. */
        !           168: 
        !           169: void
        !           170: FullRecover()
        !           171: {
        !           172: }

unix.superglobalmegacorp.com

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