Annotation of researchv9/X11/src/X.V11R1/clients/xinit/xinit.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid_xinit_c = "$Header: xinit.c,v 11.2 87/08/07 14:37:54 toddb Exp $";
        !             3: #endif lint
        !             4: #include <X11/copyright.h>
        !             5: 
        !             6: /* Copyright    Massachusetts Institute of Technology    1986  */
        !             7: 
        !             8: #include <X11/Xlib.h>
        !             9: #include <stdio.h>
        !            10: #include <ctype.h>
        !            11: #include <signal.h>
        !            12: #include <sys/time.h>          /* unused but resource.h needs it */
        !            13: #include <sys/resource.h>
        !            14: #include <sys/wait.h>
        !            15: #include <errno.h>
        !            16: 
        !            17: #define        TRUE            1
        !            18: #define        FALSE           0
        !            19: #define        OK_EXIT         0
        !            20: #define        ERR_EXIT        1
        !            21: #define DEFAULT_SERVER "X"
        !            22: #define DEFAULT_DISPLAY ":0"
        !            23: char *default_client[] = {
        !            24:        "xterm", "=+1+1", "-n", "login",
        !            25: #ifdef sun
        !            26:        "-C",
        !            27: #endif
        !            28:        "unix:0", NULL};
        !            29: char *server[100];
        !            30: char *client[100];
        !            31: char *displayNum;
        !            32: char *program;
        !            33: Display *xd;                   /* server connection */
        !            34: union wait     status;
        !            35: int serverpid = -1;
        !            36: int clientpid = -1;
        !            37: extern int     errno;
        !            38: 
        !            39: sigCatch(sig)
        !            40:        int     sig;
        !            41: {
        !            42:        signal(SIGQUIT, SIG_IGN);
        !            43:        signal(SIGINT, SIG_IGN);
        !            44:        Error("signal %d\n", sig);
        !            45:        shutdown(serverpid, clientpid);
        !            46:        exit(1);
        !            47: }
        !            48: 
        !            49: main(argc, argv)
        !            50: int argc;
        !            51: register char **argv;
        !            52: {
        !            53:        register char **sptr = server;
        !            54:        register char **cptr = client;
        !            55:        register char **ptr;
        !            56:        int pid, i;
        !            57: 
        !            58:        program = *argv++;
        !            59:        argc--;
        !            60: 
        !            61:        /*
        !            62:         * copy the client args.
        !            63:         */
        !            64:        if (argc == 0 || (**argv != '/' && !isalpha(**argv)))
        !            65:                for (ptr = default_client; *ptr; )
        !            66:                        *cptr++ = *ptr++;
        !            67:        while (argc && strcmp(*argv, "--")) {
        !            68:                *cptr++ = *argv++;
        !            69:                argc--;
        !            70:        }
        !            71:        *cptr = NULL;
        !            72:        if (argc) {
        !            73:                argv++;
        !            74:                argc--;
        !            75:        }
        !            76: 
        !            77:        /*
        !            78:         * Copy the server args.
        !            79:         */
        !            80:        if (argc == 0 || (**argv != '/' && !isalpha(**argv))) {
        !            81:                *sptr++ = DEFAULT_SERVER;
        !            82:        } else {
        !            83:                *sptr++ = *argv++;
        !            84:                argc--;
        !            85:        }
        !            86:        if (argc > 0 && (argv[0][0] == ':' && isdigit(argv[0][1])))
        !            87:                displayNum = *argv;
        !            88:        else
        !            89:                displayNum = *sptr++ = DEFAULT_DISPLAY;
        !            90:        while (--argc >= 0)
        !            91:                *sptr++ = *argv++;
        !            92:        *sptr = NULL;
        !            93: 
        !            94:        /*
        !            95:         * Start the server and client.
        !            96:         */
        !            97:        signal(SIGQUIT, sigCatch);
        !            98:        signal(SIGINT, sigCatch);
        !            99:        if ((serverpid = startServer(server)) > 0
        !           100:         && (clientpid = startClient(client)) > 0) {
        !           101:                pid = -1;
        !           102:                while (pid != clientpid && pid != serverpid)
        !           103:                        pid = wait(NULL);
        !           104:        }
        !           105:        signal(SIGQUIT, SIG_IGN);
        !           106:        signal(SIGINT, SIG_IGN);
        !           107: 
        !           108:        shutdown(serverpid, clientpid);
        !           109: 
        !           110:        if (serverpid < 0 || clientpid < 0)
        !           111:                exit(ERR_EXIT);
        !           112:        exit(OK_EXIT);
        !           113: }
        !           114: 
        !           115: 
        !           116: /*
        !           117:  *     waitforserver - wait for X server to start up
        !           118:  */
        !           119: 
        !           120: waitforserver(serverpid)
        !           121:        int     serverpid;
        !           122: {
        !           123:        int     ncycles  = 120;         /* # of cycles to wait */
        !           124:        int     cycles;                 /* Wait cycle count */
        !           125:        char    display[100];           /* Display name */
        !           126: 
        !           127:        strcpy(display, "unix");
        !           128:        strcat(display, displayNum);
        !           129:        for (cycles = 0; cycles < ncycles; cycles++) {
        !           130:                if (xd = XOpenDisplay(display)) {
        !           131:                        return(TRUE);
        !           132:                }
        !           133:                else {
        !           134:                        if (!processTimeout(serverpid, 1, "server to start"))
        !           135:                                return(FALSE);
        !           136:                }
        !           137:        }
        !           138: 
        !           139:        return(FALSE);
        !           140: }
        !           141: 
        !           142: /*
        !           143:  * return TRUE if we timeout waiting for pid to exit, FALSE otherwise.
        !           144:  */
        !           145: processTimeout(pid, timeout, string)
        !           146:        int     pid, timeout;
        !           147:        char    *string;
        !           148: {
        !           149:        int     i = 0, pidfound = -1;
        !           150:        static char     *laststring;
        !           151: 
        !           152:        for (;;) {
        !           153:                if ((pidfound = wait3(&status, WNOHANG, NULL)) == pid)
        !           154:                        break;
        !           155:                if (timeout) {
        !           156:                        if (i == 0 && string != laststring)
        !           157:                                fprintf(stderr, "\nwaiting for %s ", string);
        !           158:                        else
        !           159:                                fprintf(stderr, ".", string);
        !           160:                        fflush(stderr);
        !           161:                }
        !           162:                if (timeout)
        !           163:                        sleep (1);
        !           164:                if (++i > timeout)
        !           165:                        break;
        !           166:        }
        !           167:        laststring = string;
        !           168:        return( pid != pidfound );
        !           169: }
        !           170: 
        !           171: Error(fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)
        !           172:        char    *fmt;
        !           173: {
        !           174:        extern char     *sys_errlist[];
        !           175: 
        !           176:        fprintf(stderr, "%s: ", program);
        !           177:        if (errno)
        !           178:                fprintf(stderr, "%s: ", sys_errlist[ errno ]);
        !           179:        fprintf(stderr, fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);
        !           180: }
        !           181: 
        !           182: Fatal(fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)
        !           183:        char    *fmt;
        !           184: {
        !           185:        Error(fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);
        !           186:        exit(ERR_EXIT);
        !           187: }
        !           188: 
        !           189: startServer(server)
        !           190:        char *server[];
        !           191: {
        !           192:        int     serverpid;
        !           193: 
        !           194:        serverpid = vfork();
        !           195:        switch(serverpid) {
        !           196:        case 0:
        !           197:                close(0);
        !           198:                close(1);
        !           199: 
        !           200:                /*
        !           201:                 * prevent server from getting sighup from vhangup()
        !           202:                 * if client is xterm -L
        !           203:                 */
        !           204:                setpgrp(0,0);
        !           205: 
        !           206:                execvp(server[0], server);
        !           207:                Fatal("Server \"%s\" died on startup\n", server[0]);
        !           208:                break;
        !           209:        case -1:
        !           210:                break;
        !           211:        default:
        !           212:                /*
        !           213:                 * don't nice server
        !           214:                 */
        !           215:                setpriority( PRIO_PROCESS, serverpid, -1 );
        !           216: 
        !           217:                errno = 0;
        !           218:                if (! processTimeout(serverpid, 0, "")) {
        !           219:                        serverpid = -1;
        !           220:                        break;
        !           221:                }
        !           222:                /*
        !           223:                 * kludge to avoid race with TCP, giving server time to
        !           224:                 * set his socket options before we try to open it
        !           225:                 */
        !           226:                sleep(5);
        !           227: 
        !           228:                if (waitforserver(serverpid) == 0) {
        !           229:                        Error("Can't connect to server\n");
        !           230:                        shutdown(serverpid, -1);
        !           231:                        serverpid = -1;
        !           232:                }
        !           233:                break;
        !           234:        }
        !           235: 
        !           236:        return(serverpid);
        !           237: }
        !           238: 
        !           239: startClient(client)
        !           240:        char *client[];
        !           241: {
        !           242:        int     clientpid;
        !           243: 
        !           244:        if ((clientpid = vfork()) == 0) {
        !           245:                setreuid(-1, -1);
        !           246:                setpgrp(0, getpid());
        !           247:                execvp(client[0], client);
        !           248:                Fatal("Client \"%s\" died on startup\n", client[0]);
        !           249:        }
        !           250:        return (clientpid);
        !           251: }
        !           252: 
        !           253: shutdown(serverpid, clientpid)
        !           254:        int     serverpid, clientpid;
        !           255: {
        !           256:        /* have kept display opened, so close it now */
        !           257:        if (clientpid > 0) {
        !           258:                XCloseDisplay(xd);
        !           259: 
        !           260:                /* HUP all local clients to allow them to clean up */
        !           261:                errno = 0;
        !           262:                if (killpg(clientpid, SIGHUP) != 0)
        !           263:                        Error("can't killpg(%d, SIGHUP) for client\n",
        !           264:                                clientpid);
        !           265:        }
        !           266: 
        !           267:        if (serverpid < 0)
        !           268:                return;
        !           269:        errno = 0;
        !           270:        if (kill(serverpid, SIGTERM) < 0) {
        !           271:                if (errno == EPERM)
        !           272:                        Fatal("Can't kill server\n");
        !           273:                if (errno == ESRCH)
        !           274:                        return;
        !           275:        }
        !           276:        if (! processTimeout(serverpid, 10, "server to terminate"))
        !           277:                return;
        !           278: 
        !           279:        fprintf(stderr, "timeout... send SIGKILL");
        !           280:        fflush(stderr);
        !           281:        errno = 0;
        !           282:        if (kill(serverpid, SIGKILL) < 0) {
        !           283:                if (errno == ESRCH)
        !           284:                        return;
        !           285:        }
        !           286:        if (processTimeout(serverpid, 3, "server to die"))
        !           287:                Fatal("Can't kill server\n");
        !           288: }

unix.superglobalmegacorp.com

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