Annotation of researchv10dc/cmd/oasd++/hack/udaemon.c, revision 1.1

1.1     ! root        1: #include "decl.h"
        !             2: 
        !             3: /* udaemon: do the processing for a single user */
        !             4: 
        !             5: /* Does this string represent the name of a status file? */
        !             6: static int
        !             7: isstat (String s)
        !             8: {
        !             9:        if (s.length() <= 2)
        !            10:                        return 0;
        !            11:        return String (s (s.length()-2, 2)) == ".s";
        !            12: }
        !            13: 
        !            14: /* Return the data file name corresponding to this string */
        !            15: static String
        !            16: datafile (String s)
        !            17: {
        !            18:        return String (s(0,s.length()-2)) + ".d";
        !            19: }
        !            20: 
        !            21: /* Read a status file and return its contents */
        !            22: static map
        !            23: readstatus (String s)
        !            24: {
        !            25:        map m;
        !            26:        char *buf = new char[s.length() + 1];
        !            27:        s.dump (buf);
        !            28:        filebuf fb;
        !            29:        if (fb.open (buf, input)) {
        !            30:                istream i (&fb);
        !            31:                i >> m;
        !            32:        }
        !            33:        delete buf;
        !            34:        return m;
        !            35: }
        !            36: 
        !            37: /* Rewrite a map into a status file */
        !            38: static void
        !            39: writestatus (Path file, map m)
        !            40: {
        !            41:        String tempfile = file.rmlast() & "stemp";
        !            42:        char *buf = new char[tempfile.length() + 1];
        !            43:        tempfile.dump (buf);
        !            44:        filebuf fb;
        !            45:        if (fb.open (buf, output)) {
        !            46:                ostream o (&fb);
        !            47:                o << m;
        !            48:                o.flush();
        !            49:                if (o) {
        !            50:                        unlink (String(file));
        !            51:                        link (String(tempfile), String(file));
        !            52:                        unlink (tempfile);
        !            53:                }
        !            54:        }
        !            55:        delete buf;
        !            56: }
        !            57: 
        !            58: static int
        !            59: listsearch (String_list sl, String s)
        !            60: {
        !            61:        String_list_iterator i (sl);
        !            62:        String t;
        !            63:        while (i.nextX (t)) {
        !            64:                if (s == t)
        !            65:                        return 1;
        !            66:        }
        !            67:        return 0;
        !            68: }
        !            69: 
        !            70: String_list deadmach;
        !            71: 
        !            72: /* Do all the work for a status file */
        !            73: static void
        !            74: dofile (Path sfile, Path dfile)
        !            75: {
        !            76:        map statmap = readstatus (sfile);
        !            77:        mel_list_iterator mli (statmap.l);
        !            78:        mel m;
        !            79:        int keepfile = 0, sendfile = 0;
        !            80:        while (mli.nextX (m)) {
        !            81:                if (m.p.strchr('#') < 0 &&
        !            82:                    (m.q.length() == 0 || m.s.length() != 0)) {
        !            83:                        m.q = String_list();
        !            84:                        if (listsearch (deadmach, m.p)) {
        !            85:                                keepfile = 1;
        !            86:                                m.s = "deferred for sequence";
        !            87:                                mli.replace (m);
        !            88:                        } else {
        !            89:                                m.s = domach (m.p, dfile, m.q);
        !            90:                                if (m.s.length() == 0) {
        !            91:                                        sendfile = 1;
        !            92:                                        if (m.q.length() == 0)
        !            93:                                                mli.remove();
        !            94:                                        else
        !            95:                                                mli.replace (m);
        !            96:                                } else {
        !            97:                                        keepfile = 1;
        !            98:                                        deadmach += m.p;
        !            99:                                        mli.replace (m);
        !           100:                                }
        !           101:                        }
        !           102:                }
        !           103:                writestatus (sfile, statmap);
        !           104:        }
        !           105: 
        !           106:        int rc = 0;
        !           107: 
        !           108:        if (sendfile || !keepfile) {
        !           109:                rc = system ("mail " + logname() + " <" + String(sfile));
        !           110:        }
        !           111: 
        !           112:        if (!keepfile && rc == 0) {
        !           113:                unlink (String(sfile));
        !           114:                unlink (String(dfile));
        !           115:        }
        !           116: }
        !           117: 
        !           118: main()
        !           119: {
        !           120:        String ln = logname();
        !           121:        Path myspool = spooldir & ln;
        !           122: 
        !           123:        umask (022);
        !           124:        lock (myspool);
        !           125: 
        !           126:        Path_list files = dircontents (myspool);
        !           127:        Path_list_iterator pli (files);
        !           128:        Path f;
        !           129: 
        !           130:        while (pli.nextX (f)) {
        !           131:                if (isstat (f))
        !           132:                        dofile (myspool & f, myspool & datafile(f));
        !           133:        }
        !           134:        unlock (myspool);
        !           135:        return 0;
        !           136: }

unix.superglobalmegacorp.com

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