Changeset 4108


Ignore:
Timestamp:
Jan 11, 2014 2:54:59 PM (7 years ago)
Author:
gah
Message:

fix nanoscale to dup descriptors 3 and 4 respectively for socket in/out instead of 0 and 1. fix servers to use descriptors 3 and 4

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/gui/scripts/visviewer.tcl

    r4100 r4108  
    283283        if { [gets $_sid data] <= 0 } {
    284284            set _sid ""
    285             puts stderr "reading from server"
     285            puts stderr "reading from server data=($data)"
    286286            RemoveServerFromList $_serverType $server
    287287            continue
    288         }
    289         # The response should be in the form "serverName major.minor ...".
    290         set pattern {^[A-Za-z][A-Za-z0-9_]* [0-9]+\.[0-9].*}
    291 
    292         while { ![regexp $pattern $data match] } {
    293             puts stderr "$data"
    294             if { [gets $_sid data] <= 0 } {
    295                 exit -1
    296             }
    297288        }
    298289        puts stderr "Render server is $data"
  • trunk/packages/vizservers/configure

    r4060 r4108  
    629629SUBDIRS
    630630STATSDIR
     631LOGDIR
    631632LD_RPATH
    632633CXXCPP
     
    718719with_tcllib
    719720with_statsdir
     721with_logsdir
    720722with_python
    721723enable_64bit
     
    13631365                          [default=/usr/lib]
    13641366  --with-statsdir=DIR     Write statistics in DIR
     1367  --with-logsdir=DIR      Write log files in DIR
    13651368  --with-python=DIR       location of python [default=yes]
    13661369  --with-x                use the X Window System
     
    24642467else
    24652468  STATSDIR="/var/tmp/visservers"
     2469fi
     2470
     2471
     2472
     2473# Check whether --with-logsdir was given.
     2474if test "${with_logsdir+set}" = set; then :
     2475  withval=$with_logsdir; LOGDIR=$withval
     2476else
     2477  LOGDIR="/tmp"
    24662478fi
    24672479
     
    78297841done
    78307842
     7843for ac_func in mkstemps
     7844do :
     7845  ac_fn_cxx_check_func "$LINENO" "mkstemps" "ac_cv_func_mkstemps"
     7846if test "x$ac_cv_func_mkstemps" = xyes; then :
     7847  cat >>confdefs.h <<_ACEOF
     7848#define HAVE_MKSTEMPS 1
     7849_ACEOF
     7850
     7851fi
     7852done
     7853
    78317854
    78327855SUBDIRS="nanoscale pymolproxy"
     7856
    78337857
    78347858
  • trunk/packages/vizservers/configure.in

    r4060 r4108  
    1717    [STATSDIR=$withval],
    1818    [STATSDIR="/var/tmp/visservers"])
     19
     20AC_ARG_WITH(
     21    [logsdir],
     22    [AS_HELP_STRING([--with-logsdir=DIR],
     23        [Write log files in DIR])],
     24    [LOGDIR=$withval],
     25    [LOGDIR="/tmp"])
    1926
    2027RP_LANG_PYTHON
     
    106113
    107114AC_CHECK_FUNCS([accept4])
     115AC_CHECK_FUNCS([mkstemps])
    108116
    109117SUBDIRS="nanoscale pymolproxy"
    110118
    111119AC_SUBST(LD_RPATH)
     120AC_SUBST(LOGDIR)
    112121AC_SUBST(STATSDIR)
    113122AC_SUBST(SUBDIRS)
  • trunk/packages/vizservers/nanoscale/Makefile.in

    r4050 r4108  
    3030TCL_INC_SPEC    = @TCL_INC_SPEC@
    3131LD_RUN_PATH     = $(libdir)
     32LOGDIR          = @LOGDIR@
     33SVN_VERSION     = $(shell svnversion $(srcdir))
    3234
    33 DEFINES         = -DSERVERSFILE=\"$(libdir)/renderservers.tcl\"
     35DEFINES =       -DSERVERSFILE=\"$(libdir)/renderservers.tcl\" \
     36                -DSVN_VERSION=\"$(SVN_VERSION)\" \
     37                -DLOGDIR=\"$(LOGDIR)\"
    3438INCLUDES        = -I. $(TCL_INC_SPEC)
    3539LIBS            = $(TCL_LIB_SPEC) \
  • trunk/packages/vizservers/nanoscale/config.h.in

    r4060 r4108  
    1616#undef HAVE_MEMORY_H
    1717
     18/* Define to 1 if you have the `mkstemps' function. */
     19#undef HAVE_MKSTEMPS
     20
    1821/* Define to 1 if you have the <netdb.h> header file. */
    1922#undef HAVE_NETDB_H
     
    2124/* Define to 1 if you have the <netinet/in.h> header file. */
    2225#undef HAVE_NETINET_IN_H
     26
     27/* Define to 1 if you have the <Python.h> header file. */
     28#undef HAVE_PYTHON_H
    2329
    2430/* Define to 1 if you have the <stdint.h> header file. */
  • trunk/packages/vizservers/nanoscale/server.c

    r4050 r4108  
    2626#ifndef SERVERSFILE
    2727#define SERVERSFILE  "/opt/hubzero/rappture/render/lib/renderservers.tcl"
     28#endif
     29
     30#ifndef LOGDIR
     31#define LOGDIR          "/tmp"
    2832#endif
    2933
     
    418422            if (child == 0) {           /* Child process. */
    419423                int i;
    420                 int errFd;
    421                
     424                int newFd;
     425                char tmpname[200];
     426
    422427                umask(0);
    423428                if ((!debug) && (setsid() < 0)) {
     
    431436                    exit(1);
    432437                }
    433 
    434                 /* Dup the descriptors and start the server.  */
    435 
    436                 if (dup2(f, 0) < 0)  {  /* Stdin */
     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,
     443                        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);
     449                }
     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 */
    437471                    ERROR("%s: can't dup stdin: %s", serverPtr->name,
    438472                        strerror(errno));
    439473                    exit(1);
    440474                }
    441                 if (dup2(f, 1) < 0) {   /* Stdout */
     475                if (dup2(f, 4) < 0) {   /* Stdout */
    442476                    ERROR("%s: can't dup stdout: %s", serverPtr->name,
    443477                          strerror(errno));
    444478                    exit(1);
    445479                }
    446                 errFd = open("/dev/null", O_WRONLY, 0600);
    447                 if (errFd < 0) {
    448                     ERROR("%s: can't open /dev/null for read/write: %s",
    449                           serverPtr->name, strerror(errno));
    450                     exit(1);
    451                 }
    452                 if (dup2(errFd, 2) < 0) { /* Stderr */
    453                     ERROR("%s: can't dup stderr for \"%s\": %s",
    454                           serverPtr->name, strerror(errno));
    455                     exit(1);
    456                 }
    457                 for(i = 3; i <= FD_SETSIZE; i++) {
     480                for(i = 5; i <= FD_SETSIZE; i++) {
    458481                    close(i);           /* Close all the other descriptors. */
    459482                }
  • trunk/packages/vizservers/nanovis/Command.cpp

    r4068 r4108  
    22372237                                         * available. */
    22382238    while (inBufPtr->isLineAvailable() ||
    2239            (select(1, &readFds, NULL, NULL, tvPtr) > 0)) {
     2239           (select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr) > 0)) {
    22402240        size_t numBytes;
    22412241        unsigned char *buffer;
  • trunk/packages/vizservers/nanovis/nanovisServer.cpp

    r4107 r4108  
    4646int nv::g_statsFile = -1; ///< Stats output file descriptor.
    4747
    48 int nv::g_fdIn = STDIN_FILENO;     ///< Input file descriptor
    49 int nv::g_fdOut = STDOUT_FILENO;   ///< Output file descriptor
     48#define CLIENT_READ     (3)
     49#define CLIENT_WRITE    (4)
     50int nv::g_fdIn = CLIENT_READ;     ///< Input file descriptor
     51int nv::g_fdOut = CLIENT_WRITE;   ///< Output file descriptor
    5052FILE *nv::g_fOut = NULL;           ///< Output file handle
    5153FILE *nv::g_fLog = NULL;           ///< Trace logging file handle
     
    8486    std::ostringstream oss;
    8587    oss << "nv>ok -token " << g_stats.nCommands <<  "\n";
    86     int nBytes = oss.str().length();
     88    size_t numBytes = oss.str().length();
    8789
    8890    TRACE("Sending OK for commands through %lu", g_stats.nCommands);
    8991#ifdef USE_THREADS
    90     queueResponse(oss.str().c_str(), nBytes, Response::VOLATILE, Response::OK);
     92    queueResponse(oss.str().c_str(), numBytes, Response::VOLATILE, Response::OK);
    9193#else
    92     if (write(g_fdOut, oss.str().c_str(), nBytes) < 0) {
     94    if (write(g_fdOut, oss.str().c_str(), numBytes) < 0) {
    9395        ERROR("write failed: %s", strerror(errno));
    9496        return -1;
     
    318320initService()
    319321{
     322    // Create a stream associated with the client read file descriptor.  If
     323    // we're not using a socket (fdopen of descriptor 4 will return NULL),
     324    // then use descriptor 1 and stdout respectively.
    320325    g_fOut = fdopen(g_fdOut, "w");
    321326    // If running without socket, use stdout for debugging
    322     if (g_fOut == NULL && g_fdOut != STDOUT_FILENO) {
     327    if (g_fOut == NULL) {
    323328        g_fdOut = STDOUT_FILENO;
    324         g_fOut = fdopen(g_fdOut, "w");
    325     }
    326 
     329        g_fOut = stdout;
     330    }
    327331    const char* user = getenv("USER");
    328332    char* logName = NULL;
     
    339343        strncat(logName, user, strlen(user));
    340344    }
    341 
    342     // open log and map stderr to log file
     345    // Nanoscale automatically redirects stdout and stderr to log files.
    343346    g_fLog = fopen(logName, "w");
    344347    dup2(fileno(g_fLog), STDERR_FILENO);
    345     // If we are writing to socket, map stdout to log
    346     if (g_fdOut != STDOUT_FILENO) {
    347         dup2(fileno(g_fLog), STDOUT_FILENO);
    348     }
    349 
    350     fflush(stdout);
    351348
    352349    // clean up malloc'd memory
     
    531528     * also be used to supply information about the server (version, memory
    532529     * size, etc). */
    533     fprintf(g_fOut, "NanoVis %s (build %s)\n", NANOVIS_VERSION_STRING, SVN_VERSION);
    534     fflush(g_fOut);
     530    char mesg[200];
     531
     532    sprintf(mesg, "NanoVis %s (build %s)\n", NANOVIS_VERSION_STRING, SVN_VERSION);
     533    size_t numBytes;
     534    ssize_t numWritten;
     535
     536    numBytes = strlen(mesg);
     537    numWritten = write(g_fdOut, mesg, numBytes);
     538    if ((ssize_t)numBytes != numWritten) {
     539        ERROR("Short write in version string: %s", strerror(errno));
     540    }
    535541
    536542    g_inBufPtr = new ReadBuffer(g_fdIn, 1<<12);
  • trunk/packages/vizservers/pymolproxy/Makefile.in

    r4060 r4108  
    77DEFINES =       -DSTANDALONE \
    88                -DSVN_VERSION=\"$(SVN_VERSION)\" \
    9                 -DSTATSDIR=\"$(STATSDIR)\"
     9                -DSTATSDIR=\"$(STATSDIR)\" \
     10                -DLOGDIR=\"$(LOGDIR)\"
    1011EXTRA_CFLAGS =  -Wall
    1112INCLUDES =      $(TCL_INC_SPEC) -I$(srcdir)
     
    2930SVN_VERSION     = $(shell svnversion $(srcdir))
    3031STATSDIR        = @STATSDIR@
     32LOGDIR          = @LOGDIR@
    3133
    3234.PHONY: all install clean distclean
  • trunk/packages/vizservers/pymolproxy/pymolproxy2.c

    r3411 r4108  
    9191
    9292static int debug = FALSE;
    93 static char stderrFile[200];
    94 static FILE *fdebug;
    9593static FILE *frecord;
    9694static int recording = FALSE;
     
    115113
    116114#define IO_TIMEOUT (30000)
     115#define CLIENT_READ             (3)
     116#define CLIENT_WRITE            (4)
     117
     118#ifndef LOGDIR
     119#define LOGDIR          "/tmp"
     120#endif  /* LOGDIR */
    117121
    118122#define CVT2SECS(x)  ((double)(x).tv_sec) + ((double)(x).tv_usec * 1.0e-6)
     
    226230   
    227231    format = TCL_VARARGS_START(const char *, arg1, args);
    228     fprintf(fdebug, "pymolproxy: ");
    229     vfprintf(fdebug, format, args);
    230     fprintf(fdebug, "\n");
    231     fflush(fdebug);
     232    fprintf(stderr, "pymolproxy: ");
     233    vfprintf(stderr, format, args);
     234    fprintf(stderr, "\n");
     235    fflush(stderr);
    232236}
    233237#endif
     
    20972101
    20982102static int
    2099 InitProxy(PymolProxy *p, const char *fileName, char *const *argv)
     2103InitProxy(PymolProxy *p, char *const *argv)
    21002104{
    21012105    int sin[2], sout[2];                /* Pipes to connect to server. */
     
    21272131    if (child == 0) {                   /* Child process */
    21282132        int f;
     2133        char tmpname[200];
    21292134
    21302135        /*
     
    21392144        dup2(sin[0],  0);               /* Server standard input */
    21402145        dup2(sout[1], 1);               /* Server standard output */
    2141         f = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0600);
     2146
     2147        /* Redirect child's stdout to a log file. */
     2148        sprintf(tmpname, "%s/PYMOL-%d-stderr.XXXXXX", LOGDIR, getpid());
     2149        f = mkstemp(tmpname);
    21422150        if (f < 0) {
    2143             ERROR("can't open server error file `%s': %s", fileName,
     2151            ERROR("can't open file `%s' to capture pymol stderr: %s", tmpname,
    21442152                  strerror(errno));
    21452153            exit(1);
    21462154        }
    2147         dup2(f, 2);                     /* Redirect stderr to a file */
     2155        dup2(f, 2);                     /* Redirect stderr to a log file */
    21482156       
    21492157        /* Close all other descriptors  */       
     
    21762184    p->frame      = 1;
    21772185    p->pid      = child;
    2178     InitReadBuffer(&p->client, "client", p->cout, 1<<16);
     2186    InitReadBuffer(&p->client, "client", CLIENT_READ, 1<<16);
    21792187    InitReadBuffer(&p->server, "server", p->sout, 1<<18);
    21802188
     
    22562264        result = WEXITSTATUS(result);
    22572265    }
    2258     unlink(stderrFile);
    22592266    return result;
    22602267}
     
    22992306#endif
    23002307                    break;              /* This was caused by a "imgflush"
    2301                                          * command. Break out of the read loop
    2302                                          * and allow a new image to be
     2308                                         * command. Break out of the read
     2309                                         * loop and allow a new image to be
    23032310                                         * rendered. */
    23042311                }
     
    23112318            }
    23122319            tv.tv_sec = 0L;
    2313             tv.tv_usec = 0L;    /* On successive reads, we break
    2314                                          *  out * if no data is
    2315                                          *  available. */
     2320            tv.tv_usec = 0L;            /* On successive reads, we break
     2321                                         * out if no data is available. */
    23162322            tvPtr = &tv;                       
    23172323        }
     
    24052411                struct timeval tv;
    24062412                fd_set writeFds;
    2407                 int fd;
    24082413
    24092414                tv.tv_sec = tv.tv_usec = 0L;
    24102415                FD_ZERO(&writeFds);
    2411                 fd = fileno(stdout);
    2412                 FD_SET(fd, &writeFds);
    2413                 if (select(fd+1, NULL, &writeFds, NULL, &tv) > 0) {
    2414                     WriteImages(&list, fd);
     2416                FD_SET(CLIENT_WRITE, &writeFds);
     2417                if (select(CLIENT_WRITE+1, NULL, &writeFds, NULL, &tv) > 0) {
     2418                    WriteImages(&list, CLIENT_WRITE);
    24152419                }
    24162420            }
     
    24282432    PymolProxy proxy;
    24292433    pthread_t thread1, thread2;
    2430 
    2431     sprintf(stderrFile, "/tmp/pymol%d.stderr", getpid());
    2432     fdebug = stderr;
    2433     if (debug) {
    2434         fdebug = fopen("/tmp/pymolproxy.log", "w");
    2435     }   
     2434    char version[200];
     2435    ssize_t numWritten;
     2436    size_t numBytes;
     2437
    24362438    frecord = NULL;
    24372439    if (recording) {
     
    24412443        frecord = fopen(fileName, "w");
    24422444    }   
    2443     fprintf(stdout, "PyMol 1.0 (build %s)\n", SVN_VERSION);
    2444     fflush(stdout);
    2445 
     2445    sprintf(version, "PyMol 1.0 (build %s)\n", SVN_VERSION);
     2446    numBytes = strlen(version);
     2447    numWritten = write(CLIENT_WRITE, version, numBytes);
     2448    if (numWritten < numBytes) {
     2449        ERROR("Short write on version string", strerror(errno));
     2450    }
    24462451    INFO("Starting pymolproxy (threaded version)");
    24472452
    2448     InitProxy(&proxy, stderrFile, argv + 1);
     2453    InitProxy(&proxy, argv + 1);
    24492454    if (pthread_create(&thread1, NULL, &ClientToServer, &proxy) < 0) {
    24502455        ERROR("Can't create reader thread: %s", strerror(errno));
  • trunk/packages/vizservers/vtkvis/RenderServer.cpp

    r4107 r4108  
    4343
    4444int VtkVis::g_statsFile = -1; ///< Stats output file descriptor.
    45 int VtkVis::g_fdIn = STDIN_FILENO; ///< Input file descriptor
    46 int VtkVis::g_fdOut = STDOUT_FILENO; ///< Output file descriptor
     45#define CLIENT_READ     (3)
     46#define CLIENT_WRITE    (4)
     47int VtkVis::g_fdIn = CLIENT_READ; ///< Input file descriptor
     48int VtkVis::g_fdOut = CLIENT_WRITE; ///< Output file descriptor
    4749FILE *VtkVis::g_fOut = NULL; ///< Output file handle
    4850FILE *VtkVis::g_fLog = NULL; ///< Trace logging file handle
     
    407409initService()
    408410{
     411    // Create a stream associated with the client read file descriptor.  If
     412    // we're not using a socket (fdopen of descriptor 4 will return NULL),
     413    // then use descriptor 1 and stdout respectively.
    409414    g_fOut = fdopen(g_fdOut, "w");
    410415    // If running without socket, use stdout for debugging
    411416    if (g_fOut == NULL && g_fdOut != STDOUT_FILENO) {
    412417        g_fdOut = STDOUT_FILENO;
    413         g_fOut = fdopen(g_fdOut, "w");
     418        g_fOut = stdout;
    414419    }
    415420
     
    431436    }
    432437
     438    // Nanoscale automatically redirects stdout and stderr to log files.
    433439    // open log and map stderr to log file
    434440    g_fLog = fopen(logName, "w");
    435441    dup2(fileno(g_fLog), STDERR_FILENO);
    436     // If we are writing to socket, map stdout to log
    437     if (g_fdOut != STDOUT_FILENO) {
    438         dup2(fileno(g_fLog), STDOUT_FILENO);
    439     }
    440 
    441     fflush(stdout);
    442442
    443443    // clean up malloc'd memory
  • trunk/packages/vizservers/vtkvis/RendererCmd.cpp

    r4092 r4108  
    1292012920                                         * available. */
    1292112921    while (inBufPtr->isLineAvailable() ||
    12922            (select(1, &readFds, NULL, NULL, tvPtr) > 0)) {
     12922           (select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr) > 0)) {
    1292312923        size_t numBytes;
    1292412924        unsigned char *buffer;
Note: See TracChangeset for help on using the changeset viewer.