Changeset 4113 for trunk/packages
- Timestamp:
- Jan 13, 2014, 10:24:10 AM (11 years ago)
- Location:
- trunk/packages/vizservers
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/nanoscale/renderservers.tcl.in
r4111 r4113 24 24 # variable. 25 25 # 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 26 32 set exec_prefix "@exec_prefix@" 27 33 set bindir "@bindir@" … … 60 66 # Need PYMOL_SITE_PATH only for parallelpiped box.py location. 61 67 # 62 register_server pymol 2019 {68 register_server pymolproxy 2019 { 63 69 ${bindir}/pymolproxy ${bindir}/pymol -p -q -i -x -X 0 -Y 0 64 70 } { … … 71 77 # Need PYMOL_SITE_PATH only for parallelpiped box.py location. 72 78 # 73 register_server pymol-threaded 2020 { 79 register_server pymolproxy-threaded 2020 \ 80 -logstdout no -logstderr no \ 81 { 74 82 ${bindir}/pymolproxy2 ${bindir}/pymol -p -q -i -x -X 0 -Y 0 75 83 } { … … 80 88 # vmd server (used for mdshowcase) 81 89 # 82 register_server vmdshow 2018 { 83 ${libdir}/vmd/vmd_LINUXAMD64 -startup ${libdir}/vmd/vmdserver.tcl -args -stdio 90 register_server vmdshow 2018 \ 91 -input 3 -output 4 -combinelogs no \ 92 { 93 ${libdir}/vmd/vmd_LINUXAMD64 -startup ${libdir}/vmd/vmdserver.tcl \ 94 -args -stdio 84 95 } { 85 96 VMDDIR ${libdir}/vmd 86 97 SURF_BIN ${libdir}/vmd/surf 87 98 LD_LIBRARY_PATH ${libdir} 88 } 99 } 100 89 101 -
trunk/packages/vizservers/nanoscale/server.c
r4108 r4113 57 57 int numCmdArgs; /* # of args in command. */ 58 58 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. */ 60 61 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. */ 62 74 } RenderServer; 63 75 … … 105 117 } 106 118 119 static RenderServer * 120 NewServer(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 140 static int 141 ParseSwitches(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 107 204 /* 108 205 * RegisterServerCmd -- … … 127 224 * Example: 128 225 * 129 * register_server myServer 12345 {226 * register_server myServer 12345 ?switches? { 130 227 * /path/to/myserver arg arg 131 228 * } { … … 150 247 Tcl_HashEntry *hPtr; 151 248 152 if ( (objc < 4) || (objc > 5)) {249 if (objc < 4) { 153 250 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?", 155 252 (char *)NULL); 156 253 return TCL_ERROR; … … 166 263 return TCL_ERROR; 167 264 } 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 } 168 273 objPtr = Tcl_SubstObj(interp, objv[3], 169 274 TCL_SUBST_VARIABLES | TCL_SUBST_BACKSLASHES); 170 275 if (Tcl_SplitList(interp, Tcl_GetString(objPtr), &numCmdArgs, 171 276 (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 207 282 numEnvArgs = 0; 208 283 envArgs = NULL; … … 212 287 if (Tcl_SplitList(interp, Tcl_GetString(objPtr), &numEnvArgs, 213 288 (const char ***)&envArgs) != TCL_OK) { 214 return TCL_ERROR;289 goto error; 215 290 } 216 291 if (numEnvArgs & 0x1) { 217 292 Tcl_AppendResult(interp, "odd # elements in enviroment list", 218 293 (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 } 233 297 serverPtr->envArgs = envArgs; 234 298 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 236 334 return TCL_OK; 335 error: 336 free(serverPtr); 337 return TCL_ERROR; 237 338 } 238 339 … … 373 474 RenderServer *serverPtr; 374 475 pid_t child; 375 int f;476 int sock; 376 477 socklen_t length; 377 478 struct sockaddr_in newaddr; … … 390 491 length = sizeof(newaddr); 391 492 #ifdef HAVE_ACCEPT4 392 f= accept4(serverPtr->listenerFd, (struct sockaddr *)&newaddr,493 sock = accept4(serverPtr->listenerFd, (struct sockaddr *)&newaddr, 393 494 &length, SOCK_CLOEXEC); 394 495 #else 395 f= accept(serverPtr->listenerFd, (struct sockaddr *)&newaddr,496 sock = accept(serverPtr->listenerFd, (struct sockaddr *)&newaddr, 396 497 &length); 397 498 #endif 398 if ( f< 0) {499 if (sock < 0) { 399 500 ERROR("Can't accept server \"%s\": %s", serverPtr->name, 400 501 strerror(errno)); … … 402 503 } 403 504 #ifndef HAVE_ACCEPT4 404 int flags = fcntl( f, F_GETFD);505 int flags = fcntl(sock, F_GETFD); 405 506 flags |= FD_CLOEXEC; 406 if (fcntl( f, F_SETFD, flags) < 0) {507 if (fcntl(sock, F_SETFD, flags) < 0) { 407 508 ERROR("Can't set FD_CLOEXEC on socket \"%s\": %s", 408 509 serverPtr->name, strerror(errno)); … … 422 523 if (child == 0) { /* Child process. */ 423 524 int i; 424 int newFd;425 char tmpname[200];426 525 427 526 umask(0); … … 436 535 exit(1); 437 536 } 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, 443 542 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 } 449 601 } 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 */ 471 604 ERROR("%s: can't dup stdin: %s", serverPtr->name, 472 605 strerror(errno)); 473 606 exit(1); 474 607 } 475 if (dup2( f, 4) < 0) {/* Stdout */608 if (dup2(sock, serverPtr->outputFd) < 0) { /* Stdout */ 476 609 ERROR("%s: can't dup stdout: %s", serverPtr->name, 477 610 strerror(errno)); 478 611 exit(1); 479 612 } 480 for(i = 5; i <= FD_SETSIZE; i++) {613 for(i = serverPtr->outputFd + 1; i <= FD_SETSIZE; i++) { 481 614 close(i); /* Close all the other descriptors. */ 482 615 } … … 498 631 exit(1); 499 632 } else { 500 close( f);633 close(sock); 501 634 } 502 635 } -
trunk/packages/vizservers/pymolproxy/pymolproxy2.c
r4108 r4113 113 113 114 114 #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 117 117 118 118 #ifndef LOGDIR … … 2443 2443 frecord = fopen(fileName, "w"); 2444 2444 } 2445 sprintf(version, "Py Mol1.0 (build %s)\n", SVN_VERSION);2445 sprintf(version, "PymolProxy 1.0 (build %s)\n", SVN_VERSION); 2446 2446 numBytes = strlen(version); 2447 2447 numWritten = write(CLIENT_WRITE, version, numBytes);
Note: See TracChangeset
for help on using the changeset viewer.