Changeset 4113


Ignore:
Timestamp:
Jan 13, 2014 10:24:10 AM (9 years ago)
Author:
gah
Message:

add switches to nanoscale

Location:
trunk/packages/vizservers
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/nanoscale/renderservers.tcl.in

    r4111 r4113  
    2424#       variable.
    2525#
     26# Defaults:
     27#   o Server reads from file descriptor 0.
     28#   o Server writes to descriptor 1.
     29#   o Server stdout and stderr are redirected to a log file. 
     30#
     31
    2632set exec_prefix "@exec_prefix@"
    2733set bindir "@bindir@"
     
    6066#     Need PYMOL_SITE_PATH only for parallelpiped box.py location.
    6167#   
    62 register_server pymol 2019 {
     68register_server pymolproxy 2019 {
    6369    ${bindir}/pymolproxy ${bindir}/pymol -p -q -i -x -X 0 -Y 0
    6470} {
     
    7177#     Need PYMOL_SITE_PATH only for parallelpiped box.py location.
    7278#   
    73 register_server pymol-threaded 2020 {
     79register_server pymolproxy-threaded 2020 \
     80    -logstdout no -logstderr no \
     81{
    7482    ${bindir}/pymolproxy2 ${bindir}/pymol -p -q -i -x -X 0 -Y 0
    7583} {
     
    8088# vmd server (used for mdshowcase)
    8189#
    82 register_server vmdshow 2018 {
    83     ${libdir}/vmd/vmd_LINUXAMD64 -startup ${libdir}/vmd/vmdserver.tcl -args -stdio
     90register_server vmdshow 2018 \
     91    -input 3 -output 4 -combinelogs no \
     92{
     93    ${libdir}/vmd/vmd_LINUXAMD64 -startup ${libdir}/vmd/vmdserver.tcl \
     94        -args -stdio
    8495} {
    8596    VMDDIR ${libdir}/vmd
    8697    SURF_BIN ${libdir}/vmd/surf
    8798    LD_LIBRARY_PATH ${libdir}
    88 }
     99}
     100   
    89101
  • trunk/packages/vizservers/nanoscale/server.c

    r4108 r4113  
    5757    int numCmdArgs;                     /* # of args in command.  */
    5858    int numEnvArgs;                     /* # of args in environment.  */
    59     char *const *cmdArgs;               /* Command to execute for server. */
     59    char *const *cmdArgs;               /* Command to execute for
     60                                           server. */
    6061    char *const *envArgs;               /* Environment strings to set. */
    61     int listenerFd;                     /* Descriptor of the listener socket. */
     62    int listenerFd;                     /* Descriptor of the listener
     63                                           socket. */
     64    int inputFd;                        /* Descriptor to dup input side of
     65                                         * server socket. */
     66    int outputFd;                       /* Descriptor to dup output side of
     67                                         * server socket. */
     68    int logStdout;                      /* Redirect server stdout to a
     69                                           file. */
     70    int logStderr;                      /* Redirect server stderr to a
     71                                           file. */
     72    int combineLogs;                    /* Combine server stdout/stderr in
     73                                         * same file. */
    6274} RenderServer;
    6375
     
    105117}
    106118
     119static RenderServer *
     120NewServer(Tcl_Interp *interp, const char *name)
     121{
     122    RenderServer *serverPtr;
     123
     124    serverPtr = malloc(sizeof(RenderServer));
     125    memset(serverPtr, 0, sizeof(RenderServer));
     126    if (serverPtr == NULL) {
     127        Tcl_AppendResult(interp, "can't allocate structure for \"",
     128                name, "\": ", Tcl_PosixError(interp), (char *)NULL);
     129        return NULL;
     130    }
     131    serverPtr->name = strdup(name);
     132    serverPtr->outputFd = STDOUT_FILENO;
     133    serverPtr->inputFd = STDIN_FILENO;
     134    serverPtr->combineLogs = TRUE;
     135    serverPtr->logStdout = TRUE;
     136    serverPtr->logStderr = TRUE;
     137    return serverPtr;
     138}
     139
     140static int
     141ParseSwitches(Tcl_Interp *interp, RenderServer *serverPtr, int *objcPtr,
     142              Tcl_Obj ***objvPtr)
     143{
     144    int i, objc;
     145    Tcl_Obj **objv;
     146
     147    objc = *objcPtr;
     148    objv = *objvPtr;
     149    for (i = 3; i < objc; i += 2) {
     150        const char *string;
     151        char c;
     152
     153        string = Tcl_GetString(objv[i]);
     154        if (string[0] != '-') {
     155            break;
     156        }
     157        c = string[1];
     158        if ((c == 'i') && (strcmp(string, "-input") == 0)) {
     159            int f;
     160
     161            if (Tcl_GetIntFromObj(interp, objv[i+1], &f) != TCL_OK) {
     162                return TCL_ERROR;
     163            }
     164            serverPtr->inputFd = 1;
     165        } else if ((c == 'o') && (strcmp(string, "-output") == 0)) {
     166            int f;
     167
     168            if (Tcl_GetIntFromObj(interp, objv[i+1], &f) != TCL_OK) {
     169                return TCL_ERROR;
     170            }
     171            serverPtr->outputFd = 1;
     172        } else if ((c == 'l') && (strcmp(string, "-logstdout") == 0)) {
     173            int state;
     174
     175            if (Tcl_GetBooleanFromObj(interp, objv[i+1], &state) != TCL_OK) {
     176                return TCL_ERROR;
     177            }
     178            serverPtr->logStdout = state;
     179        } else if ((c == 'l') && (strcmp(string, "-logstderr") == 0)) {
     180            int state;
     181
     182            if (Tcl_GetBooleanFromObj(interp, objv[i+1], &state) != TCL_OK) {
     183                return TCL_ERROR;
     184            }
     185            serverPtr->logStderr = state;
     186        } else if ((c == 'c') && (strcmp(string, "-combinelogs") == 0)) {
     187            int state;
     188
     189            if (Tcl_GetBooleanFromObj(interp, objv[i+1], &state) != TCL_OK) {
     190                return TCL_ERROR;
     191            }
     192            serverPtr->combineLogs = state;
     193        } else {
     194            Tcl_AppendResult(interp, "unknown switch \"", string, "\"",
     195                             (char *)NULL);
     196            return TCL_ERROR;
     197        }
     198    }
     199    *objcPtr = objc - (i - 3);
     200    *objvPtr = objv + (i - 3);
     201    return TCL_OK;
     202}
     203
    107204/*
    108205 * RegisterServerCmd --
     
    127224 *      Example:
    128225 *
    129  *          register_server myServer 12345 {
     226 *          register_server myServer 12345 ?switches? {
    130227 *               /path/to/myserver arg arg
    131228 *          } {
     
    150247    Tcl_HashEntry *hPtr;
    151248
    152     if ((objc < 4) || (objc > 5)) {
     249    if (objc < 4) {
    153250        Tcl_AppendResult(interp, "wrong # args: should be \"",
    154                 Tcl_GetString(objv[0]), " serverName port cmd ?environ?",
     251                Tcl_GetString(objv[0]), " serverName port ?flags? cmd ?environ?",
    155252                (char *)NULL);
    156253        return TCL_ERROR;
     
    166263        return TCL_ERROR;
    167264    }
     265    serverPtr = NewServer(interp, serverName);
     266    if (serverPtr == NULL) {
     267        return TCL_ERROR;
     268    }
     269    Tcl_SetHashValue(hPtr, serverPtr);
     270    if (ParseSwitches(interp, serverPtr, &objc, (Tcl_Obj ***)&objv) != TCL_OK) {
     271        goto error;
     272    }
    168273    objPtr = Tcl_SubstObj(interp, objv[3],
    169274                          TCL_SUBST_VARIABLES | TCL_SUBST_BACKSLASHES);
    170275    if (Tcl_SplitList(interp, Tcl_GetString(objPtr), &numCmdArgs,
    171276        (const char ***)&cmdArgs) != TCL_OK) {
    172         return TCL_ERROR;
    173     }
    174 
    175     /* Create a socket for listening. */
    176     f = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    177     if (f < 0) {
    178         Tcl_AppendResult(interp, "can't create listerner socket for \"",
    179                 serverName, "\": ", Tcl_PosixError(interp), (char *)NULL);
    180         return TCL_ERROR;
    181     }
    182  
    183     /* If the render server instance should be killed, drop the socket address
    184      * reservation immediately, don't linger. */
    185     bool = TRUE;
    186     if (setsockopt(f, SOL_SOCKET, SO_REUSEADDR, &bool, sizeof(bool)) < 0) {
    187         Tcl_AppendResult(interp, "can't create set socket option for \"",
    188                 serverName, "\": ", Tcl_PosixError(interp), (char *)NULL);
    189         return TCL_ERROR;
    190     }
    191 
    192     /* Bind this address to the socket. */
    193     addr.sin_family = AF_INET;
    194     addr.sin_port = htons(port);
    195     addr.sin_addr.s_addr = htonl(INADDR_ANY);
    196     if (bind(f, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
    197         Tcl_AppendResult(interp, "can't bind to socket for \"",
    198                 serverName, "\": ", Tcl_PosixError(interp), (char *)NULL);
    199         return TCL_ERROR;
    200     }
    201     /* Listen on the specified port. */
    202     if (listen(f, 5) < 0) {
    203         Tcl_AppendResult(interp, "can't listen to socket for \"",
    204                 serverName, "\": ", Tcl_PosixError(interp), (char *)NULL);
    205         return TCL_ERROR;
    206     }
     277        goto error;
     278    }
     279    serverPtr->cmdArgs = cmdArgs;
     280    serverPtr->numCmdArgs = numCmdArgs;
     281   
    207282    numEnvArgs = 0;
    208283    envArgs = NULL;
     
    212287        if (Tcl_SplitList(interp, Tcl_GetString(objPtr), &numEnvArgs,
    213288                (const char ***)&envArgs) != TCL_OK) {
    214             return TCL_ERROR;
     289            goto error;
    215290        }
    216291        if (numEnvArgs & 0x1) {
    217292            Tcl_AppendResult(interp, "odd # elements in enviroment list",
    218293                             (char *)NULL);
    219             return TCL_ERROR;
    220         }
    221     }
    222     serverPtr = malloc(sizeof(RenderServer));
    223     memset(serverPtr, 0, sizeof(RenderServer));
    224     if (serverPtr == NULL) {
    225         Tcl_AppendResult(interp, "can't allocate structure for \"",
    226                 serverName, "\": ", Tcl_PosixError(interp), (char *)NULL);
    227         return TCL_ERROR;
    228     }
    229     serverPtr->name = strdup(serverName);
    230     serverPtr->cmdArgs = cmdArgs;
    231     serverPtr->numCmdArgs = numCmdArgs;
    232     serverPtr->listenerFd = f;
     294            goto error;
     295        }
     296    }
    233297    serverPtr->envArgs = envArgs;
    234298    serverPtr->numEnvArgs = numEnvArgs;
    235     Tcl_SetHashValue(hPtr, serverPtr);
     299
     300    /* Create a socket for listening. */
     301    f = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     302    if (f < 0) {
     303        Tcl_AppendResult(interp, "can't create listerner socket for \"",
     304                serverPtr->name, "\": ", Tcl_PosixError(interp), (char *)NULL);
     305        goto error;
     306    }
     307 
     308    /* If the render server instance should be killed, drop the socket address
     309     * reservation immediately, don't linger. */
     310    bool = TRUE;
     311    if (setsockopt(f, SOL_SOCKET, SO_REUSEADDR, &bool, sizeof(bool)) < 0) {
     312        Tcl_AppendResult(interp, "can't create set socket option for \"",
     313                serverPtr->name, "\": ", Tcl_PosixError(interp), (char *)NULL);
     314        goto error;
     315    }
     316
     317    /* Bind this address to the socket. */
     318    addr.sin_family = AF_INET;
     319    addr.sin_port = htons(port);
     320    addr.sin_addr.s_addr = htonl(INADDR_ANY);
     321    if (bind(f, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
     322        Tcl_AppendResult(interp, "can't bind to socket for \"",
     323                serverPtr->name, "\": ", Tcl_PosixError(interp), (char *)NULL);
     324        goto error;
     325    }
     326    /* Listen on the specified port. */
     327    if (listen(f, 5) < 0) {
     328        Tcl_AppendResult(interp, "can't listen to socket for \"",
     329                serverPtr->name, "\": ", Tcl_PosixError(interp), (char *)NULL);
     330        return TCL_ERROR;
     331    }
     332    serverPtr->listenerFd = f;
     333
    236334    return TCL_OK;
     335 error:
     336    free(serverPtr);
     337    return TCL_ERROR;
    237338}
    238339
     
    373474            RenderServer *serverPtr;
    374475            pid_t child;
    375             int f;
     476            int sock;
    376477            socklen_t length;
    377478            struct sockaddr_in newaddr;
     
    390491            length = sizeof(newaddr);
    391492#ifdef HAVE_ACCEPT4
    392             f = accept4(serverPtr->listenerFd, (struct sockaddr *)&newaddr,
     493            sock = accept4(serverPtr->listenerFd, (struct sockaddr *)&newaddr,
    393494                        &length, SOCK_CLOEXEC);
    394495#else
    395             f = accept(serverPtr->listenerFd, (struct sockaddr *)&newaddr,
     496            sock = accept(serverPtr->listenerFd, (struct sockaddr *)&newaddr,
    396497                       &length);
    397498#endif
    398             if (f < 0) {
     499            if (sock < 0) {
    399500                ERROR("Can't accept server \"%s\": %s", serverPtr->name,
    400501                      strerror(errno));
     
    402503            }
    403504#ifndef HAVE_ACCEPT4
    404             int flags = fcntl(f, F_GETFD);
     505            int flags = fcntl(sock, F_GETFD);
    405506            flags |= FD_CLOEXEC;
    406             if (fcntl(f, F_SETFD, flags) < 0) {
     507            if (fcntl(sock, F_SETFD, flags) < 0) {
    407508                ERROR("Can't set FD_CLOEXEC on socket \"%s\": %s",
    408509                        serverPtr->name, strerror(errno));
     
    422523            if (child == 0) {           /* Child process. */
    423524                int i;
    424                 int newFd;
    425                 char tmpname[200];
    426525
    427526                umask(0);
     
    436535                    exit(1);
    437536                }
    438                 /* We could use the same log file for stdout and stderr.
    439                  * Right now they are separate files. */
    440 
    441                 /* Redirect child's stdout to a log file. */
    442                 sprintf(tmpname, "%s/%s-%d-stdout.XXXXXX", LOGDIR,
     537                if (serverPtr->combineLogs) {
     538                    char path[BUFSIZ];
     539                    int newFd;
     540
     541                    sprintf(path, "%s/%s-%d.log", LOGDIR,
    443542                        serverPtr->name, getpid());
    444                 newFd = mkstemp(tmpname);
    445                 if (newFd < 0) {
    446                     ERROR("%s: can't open \"%s\": %s", serverPtr->name,
    447                           tmpname, strerror(errno));
    448                     exit(1);
     543                    if (serverPtr->logStdout) {
     544                        newFd = open(path, O_WRONLY | O_CREAT| O_TRUNC, 0600);
     545                    } else {
     546                        newFd = open("/dev/null", O_WRONLY, 0600);
     547                    }
     548                    if (newFd < 0) {
     549                        ERROR("%s: can't open \"%s\": %s", serverPtr->name,
     550                              path, strerror(errno));
     551                        exit(1);
     552                    }
     553                    if (dup2(newFd, 1) < 0) {
     554                        ERROR("%s: can't dup stdout to \"%s\": %s",
     555                              serverPtr->name, path, strerror(errno));
     556                        exit(1);
     557                    }
     558                    if (dup2(newFd, 2) < 0) {
     559                        ERROR("%s: can't dup stderr to \"%s\": %s",
     560                              serverPtr->name, path, strerror(errno));
     561                        exit(1);
     562                    }
     563                } else {
     564                    char path[BUFSIZ];
     565                    int newFd;
     566
     567                    sprintf(path, "%s/%s-%d.stdout", LOGDIR,
     568                        serverPtr->name, getpid());
     569                    if (serverPtr->logStdout) {
     570                        newFd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
     571                    } else {
     572                        newFd = open("/dev/null", O_WRONLY, 0600);
     573                    }
     574                    if (newFd < 0) {
     575                        ERROR("%s: can't open \"%s\": %s", serverPtr->name,
     576                              path, strerror(errno));
     577                        exit(1);
     578                    }
     579                    if (dup2(newFd, 1) < 0) {
     580                        ERROR("%s: can't dup stdout to \"%s\": %s",
     581                              serverPtr->name, path, strerror(errno));
     582                        exit(1);
     583                    }
     584                    sprintf(path, "%s/%s-%d.stderr", LOGDIR,
     585                        serverPtr->name, getpid());
     586                    if (serverPtr->logStderr) {
     587                        newFd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
     588                    } else {
     589                        newFd = open("/dev/null", O_WRONLY, 0600);
     590                    }
     591                    if (newFd < 0) {
     592                        ERROR("%s: can't open \"%s\": %s", serverPtr->name,
     593                              path, strerror(errno));
     594                        exit(1);
     595                    }
     596                    if (dup2(newFd, 1) < 0) {
     597                        ERROR("%s: can't dup stderr to \"%s\": %s",
     598                              serverPtr->name, path, strerror(errno));
     599                        exit(1);
     600                    }
    449601                }
    450                 if (dup2(newFd, 1) < 0) {
    451                     ERROR("%s: can't dup stdout to \"%s\": %s",
    452                           serverPtr->name, tmpname, strerror(errno));
    453                     exit(1);
    454                 }
    455                 /* Redirect child's stderr to a log file. */
    456                 sprintf(tmpname, "%s/%s-%d-stderr.XXXXXX", LOGDIR,
    457                         serverPtr->name, getpid());
    458                 newFd = mkstemp(tmpname);
    459                 if (newFd < 0) {
    460                     ERROR("%s: can't open \"%s\": %s", serverPtr->name,
    461                           tmpname, strerror(errno));
    462                     exit(1);
    463                 }
    464                 if (dup2(newFd, 2) < 0) {
    465                     ERROR("%s: can't dup stderr to \"%s\": %s",
    466                           serverPtr->name, tmpname, strerror(errno));
    467                     exit(1);
    468                 }
    469                 /* Dup the socket to descriptors 3 and 4 */
    470                 if (dup2(f, 3) < 0)  {  /* Stdin */
     602                /* Dup the socket to descriptors, normally 3 and 4 */
     603                if (dup2(sock, serverPtr->inputFd) < 0)  { /* Stdin */
    471604                    ERROR("%s: can't dup stdin: %s", serverPtr->name,
    472605                        strerror(errno));
    473606                    exit(1);
    474607                }
    475                 if (dup2(f, 4) < 0) {   /* Stdout */
     608                if (dup2(sock, serverPtr->outputFd) < 0) { /* Stdout */
    476609                    ERROR("%s: can't dup stdout: %s", serverPtr->name,
    477610                          strerror(errno));
    478611                    exit(1);
    479612                }
    480                 for(i = 5; i <= FD_SETSIZE; i++) {
     613                for(i = serverPtr->outputFd + 1; i <= FD_SETSIZE; i++) {
    481614                    close(i);           /* Close all the other descriptors. */
    482615                }
     
    498631                exit(1);
    499632            } else {
    500                 close(f);
     633                close(sock);
    501634            }
    502635        }
  • trunk/packages/vizservers/pymolproxy/pymolproxy2.c

    r4108 r4113  
    113113
    114114#define IO_TIMEOUT (30000)
    115 #define CLIENT_READ             (3)
    116 #define CLIENT_WRITE            (4)
     115#define CLIENT_READ             STDIN_FILENO
     116#define CLIENT_WRITE            STDOUT_FILENO
    117117
    118118#ifndef LOGDIR
     
    24432443        frecord = fopen(fileName, "w");
    24442444    }   
    2445     sprintf(version, "PyMol 1.0 (build %s)\n", SVN_VERSION);
     2445    sprintf(version, "PymolProxy 1.0 (build %s)\n", SVN_VERSION);
    24462446    numBytes = strlen(version);
    24472447    numWritten = write(CLIENT_WRITE, version, numBytes);
Note: See TracChangeset for help on using the changeset viewer.