Annotation of researchv10no/cmd/face/faces.c, revision 1.1

1.1     ! root        1: #include <sys/types.h>
        !             2: #include <signal.h>
        !             3: #include <ipc.h>
        !             4: #include <stdio.h>
        !             5: #include "faces.h"
        !             6: 
        !             7: static fd_set cfds;
        !             8: static int maxfd;
        !             9: static char *pfile = "/usr/net/face/people.tab";
        !            10: static char *mfile = "/usr/net/face/machine.tab";
        !            11: 
        !            12: main(argc, argv)
        !            13: int argc;
        !            14: char **argv;
        !            15: {
        !            16: 
        !            17:        if (argc < 2) {
        !            18:                fprintf(stderr, "usage: faces server-name ...\n");
        !            19:                exit(1);
        !            20:        }
        !            21:        maketree(pfile, mfile);
        !            22:        for (;;) {
        !            23:                listen(argc-1, argv+1);
        !            24:                log("network restart\n");
        !            25:        }
        !            26: }
        !            27: 
        !            28: catchalarm()
        !            29: {
        !            30:        signal(SIGALRM, catchalarm);
        !            31: }
        !            32: 
        !            33: /*
        !            34:  * the main loop, listening for calls and requests
        !            35:  */
        !            36: 
        !            37: listen(nname, namelist)
        !            38: int nname;
        !            39: char **namelist;
        !            40: {
        !            41:        static int *namefd;
        !            42:        fd_set rfds;
        !            43:        register int i;
        !            44:        ipcinfo *ip;
        !            45: 
        !            46:        if (namefd == NULL)
        !            47:                namefd = (int *)emalloc(sizeof(int)*nname);
        !            48:        for (i = 0; i < nname; i++)
        !            49:                namefd[i] = -1;
        !            50:        FD_ZERO(cfds);
        !            51:        for (;;) {
        !            52:                for (i = 0; i < nname; i++) {
        !            53:                        if (namefd[i] < 0) {
        !            54:                                namefd[i] = ipccreat(ipcpath("", "", namelist[i]), "");
        !            55:                                if (namefd[i] < 0)
        !            56:                                        log("can't announce %s: %s\n", namelist[i], errstr);
        !            57:                                else {
        !            58:                                        log("fd %d: announced %s\n", namefd[i], namelist[i]);
        !            59:                                        FD_SET(namefd[i], cfds);
        !            60:                                }
        !            61:                        }
        !            62:                        if (namefd[i] >= 0 && namefd[i] > maxfd)
        !            63:                                maxfd = namefd[i];
        !            64:                }
        !            65:                rfds = cfds;
        !            66:                if (select(maxfd+1, &rfds, (fd_set *)0, 60*1000) < 0) {
        !            67:                        log("select failed\n");
        !            68:                        for (i = 0; i < maxfd; i++)
        !            69:                                if (FD_ISSET(i, cfds))
        !            70:                                        close(i);
        !            71:                        return;
        !            72:                }
        !            73:                for (i = 0; i < nname; i++) {
        !            74:                        if (namefd[i] < 0)
        !            75:                                continue;
        !            76:                        if (FD_ISSET(namefd[i], rfds)) {
        !            77:                                FD_CLR(namefd[i], rfds);
        !            78:                                if ((ip = ipclisten(namefd[i])) == NULL) {
        !            79:                                        log("fd %d: %s: listen failed\n", namefd[i], errstr);
        !            80:                                        FD_CLR(namefd[i], cfds);
        !            81:                                        close(namefd[i]);
        !            82:                                        namefd[i] = -1;
        !            83:                                        continue;
        !            84:                                }
        !            85:                                newclient(ip);
        !            86:                        }
        !            87:                }
        !            88:                for (i = 0; i <= maxfd; i++)
        !            89:                        if (FD_ISSET(i, rfds) && FD_ISSET(i, cfds)) {
        !            90:                                signal(SIGALRM, catchalarm);
        !            91:                                alarm(60);
        !            92:                                if (dorequest(i) == 0)
        !            93:                                        dropclient(i);
        !            94:                                alarm(0);
        !            95:                        }
        !            96:                checknew();
        !            97:        }
        !            98: }
        !            99: 
        !           100: /* add client to the list */
        !           101: newclient(ip)
        !           102: register ipcinfo *ip;
        !           103: {
        !           104:        int fd;
        !           105: 
        !           106:        if ((fd = ipcaccept(ip)) < 0) {
        !           107:                log("ipcaccept failed\n");
        !           108:                return;
        !           109:        }
        !           110:        FD_SET(fd, cfds);
        !           111:        if (fd > maxfd)
        !           112:                maxfd = fd;
        !           113:        log("fd %d: client %s\n", fd, ip->machine);
        !           114: }
        !           115: 
        !           116: dropclient (fd)
        !           117: int fd;
        !           118: {
        !           119:        FD_CLR(fd, cfds);
        !           120:        close (fd);
        !           121:        log("fd %d: off\n", fd);
        !           122: }
        !           123: 
        !           124: /*
        !           125:  * check for new data, rebuild tree if necessary
        !           126:  */
        !           127: 
        !           128: #define        MINCHK  120     /* at most once in this many seconds */
        !           129: 
        !           130: checknew()
        !           131: {
        !           132:        static time_t lastcheck;
        !           133:        time_t now;
        !           134: 
        !           135:        now = time((time_t *)0);
        !           136:        if (now + MINCHK < lastcheck)
        !           137:                return;
        !           138:        if (newdata(pfile, mfile)) {
        !           139:                log("new data, reinitializing\n");
        !           140:                maketree(pfile, mfile);
        !           141:                now = time((time_t *)0);
        !           142:        }
        !           143:        lastcheck = now;
        !           144: }

unix.superglobalmegacorp.com

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