Annotation of researchv10no/cmd/face/faces.c, revision 1.1.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.