| 290 | | main(argc, argv) |
| 291 | | int argc; |
| 292 | | char **argv; |
| 293 | | { |
| 294 | | static struct timeval more_msgs = { 0, 0 }; |
| 295 | | char cmd[1024]; |
| 296 | | int cc; |
| 297 | | int i; |
| 298 | | int src, cod, len; |
| 299 | | char *p; |
| 300 | | FILE *ff; |
| 301 | | #ifdef FDSETNOTSTRUCT |
| 302 | | fd_set rfds, fds; |
| 303 | | #else |
| 304 | | struct fd_set rfds, fds; |
| 305 | | #endif |
| 306 | | int nfds; |
| 307 | | int n; |
| 308 | | int *np = 0; |
| 309 | | struct pvmminfo minfo; |
| 310 | | struct timeval *timeout; |
| 311 | | int more; |
| 312 | | int ac; |
| 313 | | char *av[128]; |
| 314 | | |
| 315 | | #ifdef WIN32 |
| 316 | | |
| 317 | | |
| 318 | | |
| | | ... |
| 355 | | fprintf(stderr, |
| 356 | | "SET CYGWIN=tty (Cygwin B20)\n"); |
| 357 | | fprintf(stderr, |
| 358 | | "SET CYGWIN32=tty (Cygwin B19)\n"); |
| 359 | | exit(1); |
| 360 | | } |
| 361 | | } |
| 362 | | |
| 363 | | #endif |
| 364 | | |
| 365 | | pvm_setopt(PvmResvTids, 1);
|
| 366 | | |
| 367 | | aliases = TALLOC(1, struct alias, "alias");
|
| 368 | | BZERO((char*)aliases, sizeof(struct alias));
|
| 369 | | aliases->a_link = aliases->a_rlink = aliases; |
| 370 | | |
| 371 | | if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'd') |
| 372 | | pvm_setopt(PvmDebugMask, pvmstrtoi(argv[1] + 2));
|
| 373 | | |
| 374 | | pvm_setopt(PvmRoute, PvmDontRoute);
|
| 375 | | |
| 376 | | pvm_setopt(PvmSelfTraceTid, -1);
|
| 377 | | pvm_setopt(PvmSelfOutputTid, -1);
|
| 378 | | |
| 379 | | i = pvm_setopt(PvmAutoErr, 0);
|
| 380 | | cc = pvm_start_pvmd(argc - 1, argv + 1, 1); |
| 381 | | if (cc < 0) { |
| 382 | | if (cc != PvmDupHost) {
|
| 383 | | pvm_perror("Console"); |
| 384 | | exit(1); |
| 385 | | } |
| 386 | | printf("pvmd already running.\n"); |
| 387 | | } |
| 388 | | pvm_setopt(PvmAutoErr, i);
|
| 389 | | |
| 390 | | if ((mytid = pvm_mytid()) < 0) |
| 391 | | exit(1); |
| 392 | | |
| 393 | | (void)signal(SIGINT, SIG_IGN);
|
| 394 | | |
| 395 | | |
| 396 | | #ifndef WIN32 |
| 397 | | pvm_setopt( PvmNoReset, 1 );
|
| 398 | | pvm_setopt( PvmTraceOptions, PvmTraceFull );
|
| 399 | | pvm_setopt( PvmTraceBuffer, 0 );
|
| 400 | | #endif |
| 401 | | job_init(); |
| 402 | | |
| 403 | | |
| 404 | | sprintf(cmd, "trace xpvm"); |
| 405 | | ac = sizeof(av)/sizeof(av[0]) - 1; |
| 406 | | if (!acav(cmd, &ac, av) && ac) |
| 407 | | trace_cmd(ac, av); |
| 408 | | |
| 409 | | pvm_notify(PvmHostAdd, HostsAddedTag, -1, (int*)0);
|
| 410 | | |
| 411 | | BZERO(&minfo, sizeof(minfo));
|
| 412 | | minfo.src = -1; |
| 413 | | minfo.ctx = -1; |
| 414 | | minfo.tag = MyExitTag;
|
| 415 | | |
| 416 | | #ifndef WIN32 |
| 417 | | pvm_addmhf(minfo.src, minfo.tag, minfo.ctx, exit_handler); |
| 418 | | pvm_notify(PvmTaskExit, MyExitTag, 1, &mytid);
|
| 419 | | #endif |
| 420 | | |
| 421 | | if (!(p = getenv("HOME"))) |
| 422 | | p = "."; |
| 423 | | sprintf(cmd, "%s/.pvmrc", p); |
| 424 | | if (ff = fopen(cmd, "r")) { |
| 425 | | while (fgets(cmd, sizeof(cmd)-1, ff)) |
| 426 | | docmd(cmd); |
| 427 | | (void)fclose(ff); |
| 428 | | } |
| 429 | | |
| 430 | | FD_ZERO(&rfds);
|
| 431 | | |
| 432 | | #ifndef WIN32 |
| 433 | | FD_SET(0, &rfds);
|
| 434 | | #endif |
| 435 | | |
| 436 | | nfds = 1; |
| 437 | | i = pvm_setopt(PvmAutoErr, 0);
|
| 438 | | if (pvm_getfds(&np) > 0) { |
| 439 | | FD_SET(np[0], &rfds);
|
| 440 | | nfds = np[0] + 1; |
| 441 | | } |
| 442 | | pvm_setopt(PvmAutoErr, i);
|
| 443 | | |
| 444 | | trc_init(); |
| 445 | | |
| 446 | | #ifdef HASREADLINE |
| 447 | | rl_attempted_completion_function = |
| 448 | | (CPPFunction *) command_completion; |
| 449 | | rl_callback_handler_install( prompt, rl_got_line ); |
| 450 | | #else |
| 451 | | printf(prompt); |
| 452 | | fflush(stdout); |
| 453 | | #endif |
| 454 | | |
| 455 | | #ifdef WIN32 |
| 456 | | hStdin = GetStdHandle(STD_INPUT_HANDLE); |
| 457 | | #endif |
| 458 | | |
| 459 | | while (1) { |
| 460 | | |
| 461 | | |
| 462 | | |
| 463 | | |
| 464 | | |
| 465 | | if (mytid > 0) |
| 466 | | more = checkmsgs(); |
| 467 | | else |
| 468 | | more = 0; |
| 469 | | |
| 470 | | if ( more ) |
| 471 | | timeout = &more_msgs; |
| 472 | | |
| 473 | | else |
| 474 | | #ifndef WIN32 |
| 475 | | timeout = (struct timeval *) NULL;
|
| 476 | | #else |
| 477 | | timeout = &zerotimeout; |
| 478 | | #endif |
| 479 | | |
| 480 | | |
| 481 | | |
| 482 | | |
| 483 | | fds = rfds; |
| 484 | | if ((n = select(nfds, |
| 485 | | #ifdef FDSETISINT |
| 486 | | (int *)&fds, (int *)0, (int *)0, |
| 487 | | #else |
| 488 | | (fd_set *)&fds, (fd_set *)0, (fd_set *)0, |
| 489 | | #endif |
| 490 | | timeout)) |
| 491 | | == -1) { |
| 492 | | perror("select"); |
| 493 | | #ifndef WIN32 |
| 494 | | continue; |
| 495 | | #endif |
| 496 | | } |
| 497 | | |
| 498 | | #ifdef WIN32 |
| 499 | | else |
| 500 | | if (n != 0) printf("select: returned untouched data \n"); |
| 501 | | #endif |
| 502 | | |
| 503 | | #ifdef WIN32 |
| 504 | | if (WAIT_TIMEOUT == WaitForSingleObject(hStdin,2000)) |
| 505 | | continue; |
| 506 | | #else |
| 507 | | if (n > 0 && FD_ISSET(0, &fds)) {
|
| 508 | | #endif |
| 509 | | |
| 510 | | #ifdef HASREADLINE |
| 511 | | rl_callback_read_char(); |
| 512 | | #else |
| 513 | | if ((n = read(0, cmd, sizeof(cmd)-1)) < 1) { |
| 514 | | printf("quit\n"); |
| 515 | | quit_cmd(); |
| 516 | | } |
| 517 | | cmd[n] = 0; |
| 518 | | docmd(cmd); |
| 519 | | printf(prompt); |
| 520 | | fflush(stdout); |
| 521 | | #endif |
| 522 | | |
| 523 | | #ifndef WIN32 |
| 524 | | } |
| 525 | | #endif |
| 526 | | |
| 527 | | } |
| 528 | | } |