|
|
1.1 ! root 1: /* node.c */ ! 2: ! 3: /* Synchronet BBS Node control program */ ! 4: ! 5: /* $Id: node.c,v 1.20 2004/10/13 04:51:27 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: /* Platform-specific headers */ ! 39: #ifdef _WIN32 ! 40: #include <io.h> /* open/close */ ! 41: #include <windows.h> ! 42: #endif ! 43: ! 44: #include <stdio.h> ! 45: #include <stdlib.h> ! 46: #include <fcntl.h> ! 47: #include <string.h> ! 48: #include <errno.h> ! 49: #include <ctype.h> /* isdigit */ ! 50: ! 51: /* Synchronet-specific */ ! 52: #include "sbbsdefs.h" ! 53: #include "genwrap.h" /* stricmp */ ! 54: #include "filewrap.h" /* lock/unlock/sopen */ ! 55: ! 56: enum { ! 57: MODE_LIST ! 58: ,MODE_ANON ! 59: ,MODE_LOCK ! 60: ,MODE_INTR ! 61: ,MODE_RRUN ! 62: ,MODE_DOWN ! 63: ,MODE_EVENT ! 64: ,MODE_NOPAGE ! 65: ,MODE_NOALERTS ! 66: ,MODE_STATUS ! 67: ,MODE_USERON ! 68: ,MODE_ACTION ! 69: ,MODE_ERRORS ! 70: ,MODE_MISC ! 71: ,MODE_CONN ! 72: ,MODE_AUX ! 73: ,MODE_EXTAUX ! 74: }; ! 75: ! 76: char tmp[256]; ! 77: int nodefile; ! 78: ! 79: #if defined(_WIN32) /* Microsoft-supplied cls() routine - ugh! */ ! 80: ! 81: /* Standard error macro for reporting API errors */ ! 82: #define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s \ ! 83: on line %d\n", __FILE__, GetLastError(), api, __LINE__);} ! 84: ! 85: void cls(void) ! 86: { ! 87: COORD coordScreen = { 0, 0 }; /* here's where we'll home the ! 88: cursor */ ! 89: BOOL bSuccess; ! 90: DWORD cCharsWritten; ! 91: CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ ! 92: DWORD dwConSize; /* number of character cells in ! 93: the current buffer */ ! 94: HANDLE hConsole; ! 95: ! 96: hConsole = GetStdHandle(STD_OUTPUT_HANDLE); ! 97: ! 98: /* get the number of character cells in the current buffer */ ! 99: ! 100: bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); ! 101: PERR( bSuccess, "GetConsoleScreenBufferInfo" ); ! 102: dwConSize = csbi.dwSize.X * csbi.dwSize.Y; ! 103: ! 104: /* fill the entire screen with blanks */ ! 105: ! 106: bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', ! 107: dwConSize, coordScreen, &cCharsWritten ); ! 108: PERR( bSuccess, "FillConsoleOutputCharacter" ); ! 109: ! 110: /* get the current text attribute */ ! 111: ! 112: bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); ! 113: PERR( bSuccess, "ConsoleScreenBufferInfo" ); ! 114: ! 115: /* now set the buffer's attributes accordingly */ ! 116: ! 117: bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes, ! 118: dwConSize, coordScreen, &cCharsWritten ); ! 119: PERR( bSuccess, "FillConsoleOutputAttribute" ); ! 120: ! 121: /* put the cursor at (0, 0) */ ! 122: ! 123: bSuccess = SetConsoleCursorPosition( hConsole, coordScreen ); ! 124: PERR( bSuccess, "SetConsoleCursorPosition" ); ! 125: return; ! 126: } ! 127: #else /* !_WIN32 */ ! 128: ! 129: #define cls() ! 130: ! 131: #endif ! 132: ! 133: #if !defined _MSC_VER && !defined __BORLANDC__ ! 134: char* itoa(int val, char* str, int radix) ! 135: { ! 136: switch(radix) { ! 137: case 8: ! 138: sprintf(str,"%o",val); ! 139: break; ! 140: case 10: ! 141: sprintf(str,"%u",val); ! 142: break; ! 143: case 16: ! 144: sprintf(str,"%x",val); ! 145: break; ! 146: default: ! 147: sprintf(str,"bad radix: %d",radix); ! 148: break; ! 149: } ! 150: return(str); ! 151: } ! 152: #endif ! 153: ! 154: /****************************************************************************/ ! 155: /* Reads the data for node number 'number' into the structure 'node' */ ! 156: /* from NODE.DAB */ ! 157: /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ ! 158: /****************************************************************************/ ! 159: void getnodedat(int number, node_t *node, int lockit) ! 160: { ! 161: int count; ! 162: ! 163: number--; /* make zero based */ ! 164: for(count=0;count<LOOP_NODEDAB;count++) { ! 165: if(count) ! 166: SLEEP(100); ! 167: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); ! 168: if(lockit ! 169: && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) ! 170: continue; ! 171: if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) ! 172: break; ! 173: } ! 174: if(count>=(LOOP_NODEDAB/2)) ! 175: printf("NODE.DAB (node %d) COLLISION (READ) - Count: %d\n" ! 176: ,number+1, count); ! 177: else if(count==LOOP_NODEDAB) { ! 178: printf("!Error reading nodefile for node %d\n",number+1); ! 179: } ! 180: } ! 181: ! 182: /****************************************************************************/ ! 183: /* Write the data from the structure 'node' into NODE.DAB */ ! 184: /* getnodedat(num,&node,1); must have been called before calling this func */ ! 185: /* NOTE: ------^ the indicates the node record has been locked */ ! 186: /****************************************************************************/ ! 187: void putnodedat(int number, node_t node) ! 188: { ! 189: number--; /* make zero based */ ! 190: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); ! 191: if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { ! 192: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); ! 193: printf("Error writing to nodefile for node %d\n",number+1); ! 194: return; } ! 195: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); ! 196: } ! 197: ! 198: /****************************************************************************/ ! 199: /* Unpacks the password 'pass' from the 5bit ASCII inside node_t. 32bits in */ ! 200: /* node.extaux, and the other 8bits in the upper byte of node.aux */ ! 201: /****************************************************************************/ ! 202: char *unpackchatpass(char *pass, node_t node) ! 203: { ! 204: char bits; ! 205: int i; ! 206: ! 207: pass[0]=(node.aux&0x1f00)>>8; ! 208: pass[1]=(char)(((node.aux&0xe000)>>13)|((node.extaux&0x3)<<3)); ! 209: bits=2; ! 210: for(i=2;i<8;i++) { ! 211: pass[i]=(char)((node.extaux>>bits)&0x1f); ! 212: bits+=5; } ! 213: pass[8]=0; ! 214: for(i=0;i<8;i++) ! 215: if(pass[i]) ! 216: pass[i]+=64; ! 217: return(pass); ! 218: } ! 219: ! 220: /****************************************************************************/ ! 221: /* Displays the information for node number 'number' contained in 'node' */ ! 222: /****************************************************************************/ ! 223: void printnodedat(int number, node_t node) ! 224: { ! 225: char hour,mer[3]; ! 226: ! 227: printf("Node %2d: ",number); ! 228: switch(node.status) { ! 229: case NODE_WFC: ! 230: printf("Waiting for call"); ! 231: break; ! 232: case NODE_OFFLINE: ! 233: printf("Offline"); ! 234: break; ! 235: case NODE_NETTING: ! 236: printf("Networking"); ! 237: break; ! 238: case NODE_LOGON: ! 239: printf("At logon prompt"); ! 240: break; ! 241: case NODE_EVENT_WAITING: ! 242: printf("Waiting for all nodes to become inactive"); ! 243: break; ! 244: case NODE_EVENT_LIMBO: ! 245: printf("Waiting for node %d to finish external event",node.aux); ! 246: break; ! 247: case NODE_EVENT_RUNNING: ! 248: printf("Running external event"); ! 249: break; ! 250: case NODE_NEWUSER: ! 251: printf("New user"); ! 252: printf(" applying for access "); ! 253: if(!node.connection) ! 254: printf("locally"); ! 255: else if(node.connection==0xffff) ! 256: printf("via telnet"); ! 257: else ! 258: printf("at %ubps",node.connection); ! 259: break; ! 260: case NODE_QUIET: ! 261: case NODE_INUSE: ! 262: printf("User #%d",node.useron); ! 263: printf(" "); ! 264: switch(node.action) { ! 265: case NODE_MAIN: ! 266: printf("at main menu"); ! 267: break; ! 268: case NODE_RMSG: ! 269: printf("reading messages"); ! 270: break; ! 271: case NODE_RMAL: ! 272: printf("reading mail"); ! 273: break; ! 274: case NODE_RSML: ! 275: printf("reading sent mail"); ! 276: break; ! 277: case NODE_RTXT: ! 278: printf("reading text files"); ! 279: break; ! 280: case NODE_PMSG: ! 281: printf("posting message"); ! 282: break; ! 283: case NODE_SMAL: ! 284: printf("sending mail"); ! 285: break; ! 286: case NODE_AMSG: ! 287: printf("posting auto-message"); ! 288: break; ! 289: case NODE_XTRN: ! 290: if(!node.aux) ! 291: printf("at external program menu"); ! 292: else ! 293: printf("running external program #%d",node.aux); ! 294: break; ! 295: case NODE_DFLT: ! 296: printf("changing defaults"); ! 297: break; ! 298: case NODE_XFER: ! 299: printf("at transfer menu"); ! 300: break; ! 301: case NODE_RFSD: ! 302: printf("retrieving from device #%d",node.aux); ! 303: break; ! 304: case NODE_DLNG: ! 305: printf("downloading"); ! 306: break; ! 307: case NODE_ULNG: ! 308: printf("uploading"); ! 309: break; ! 310: case NODE_BXFR: ! 311: printf("transferring bidirectional"); ! 312: break; ! 313: case NODE_LFIL: ! 314: printf("listing files"); ! 315: break; ! 316: case NODE_LOGN: ! 317: printf("logging on"); ! 318: break; ! 319: case NODE_LCHT: ! 320: printf("in local chat with sysop"); ! 321: break; ! 322: case NODE_MCHT: ! 323: if(node.aux) { ! 324: printf("in multinode chat channel %d",node.aux&0xff); ! 325: if(node.aux&0x1f00) { /* password */ ! 326: putchar('*'); ! 327: printf(" %s",unpackchatpass(tmp,node)); } } ! 328: else ! 329: printf("in multinode global chat channel"); ! 330: break; ! 331: case NODE_PAGE: ! 332: printf("paging node %u for private chat",node.aux); ! 333: break; ! 334: case NODE_PCHT: ! 335: printf("in private chat with node %u",node.aux); ! 336: break; ! 337: case NODE_GCHT: ! 338: printf("chatting with The Guru"); ! 339: break; ! 340: case NODE_CHAT: ! 341: printf("in chat section"); ! 342: break; ! 343: case NODE_TQWK: ! 344: printf("transferring QWK packet"); ! 345: break; ! 346: case NODE_SYSP: ! 347: printf("performing sysop activities"); ! 348: break; ! 349: default: ! 350: printf(itoa(node.action,tmp,10)); ! 351: break; } ! 352: if(!node.connection) ! 353: printf(" locally"); ! 354: else if(node.connection==0xffff) ! 355: printf(" via telnet"); ! 356: else ! 357: printf(" at %ubps",node.connection); ! 358: if(node.action==NODE_DLNG) { ! 359: if((node.aux/60)>=12) { ! 360: if(node.aux/60==12) ! 361: hour=12; ! 362: else ! 363: hour=(node.aux/60)-12; ! 364: strcpy(mer,"pm"); } ! 365: else { ! 366: if((node.aux/60)==0) /* 12 midnite */ ! 367: hour=12; ! 368: else hour=node.aux/60; ! 369: strcpy(mer,"am"); } ! 370: printf(" ETA %02d:%02d %s" ! 371: ,hour,node.aux-((node.aux/60)*60),mer); } ! 372: break; } ! 373: if(node.misc&(NODE_LOCK|NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG)) { ! 374: printf(" ("); ! 375: if(node.misc&NODE_AOFF) ! 376: putchar('A'); ! 377: if(node.misc&NODE_LOCK) ! 378: putchar('L'); ! 379: if(node.misc&(NODE_MSGW|NODE_NMSG)) ! 380: putchar('M'); ! 381: if(node.misc&NODE_POFF) ! 382: putchar('P'); ! 383: putchar(')'); } ! 384: if(((node.misc ! 385: &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN)) ! 386: || node.status==NODE_QUIET)) { ! 387: printf(" ["); ! 388: if(node.misc&NODE_ANON) ! 389: putchar('A'); ! 390: if(node.misc&NODE_INTR) ! 391: putchar('I'); ! 392: if(node.misc&NODE_RRUN) ! 393: putchar('R'); ! 394: if(node.misc&NODE_UDAT) ! 395: putchar('U'); ! 396: if(node.status==NODE_QUIET) ! 397: putchar('Q'); ! 398: if(node.misc&NODE_EVENT) ! 399: putchar('E'); ! 400: if(node.misc&NODE_DOWN) ! 401: putchar('D'); ! 402: if(node.misc&NODE_LCHAT) ! 403: putchar('C'); ! 404: putchar(']'); } ! 405: if(node.errors) ! 406: printf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); ! 407: printf("\n"); ! 408: } ! 409: ! 410: ! 411: /****************************/ ! 412: /* Main program entry point */ ! 413: /****************************/ ! 414: int main(int argc, char **argv) ! 415: { ! 416: char str[256],ctrl_dir[41],*p,debug=0; ! 417: int sys_nodes,node_num=0,onoff=0; ! 418: int i,j,mode=0,misc; ! 419: int modify=0; ! 420: int loop=0; ! 421: int pause=0; ! 422: long value=0; ! 423: node_t node; ! 424: ! 425: char revision[16]; ! 426: ! 427: sscanf("$Revision: 1.20 $", "%*s %s", revision); ! 428: ! 429: printf("\nSynchronet Node Display/Control Utility v%s\n\n", revision); ! 430: ! 431: if(sizeof(node_t)!=SIZEOF_NODE_T) { ! 432: printf("COMPILER ERROR: sizeof(node_t)=%d instead of %d\n" ! 433: ,sizeof(node_t),SIZEOF_NODE_T); ! 434: return(-1); ! 435: } ! 436: ! 437: if(argc<2) { ! 438: printf("usage: node [/debug] [action [on|off]] [node numbers] [...]" ! 439: "\n\n"); ! 440: printf("actions (default is list):\n\n"); ! 441: printf("list = list status\n"); ! 442: printf("anon = anonymous user\n"); ! 443: printf("lock = locked\n"); ! 444: printf("intr = interrupt\n"); ! 445: printf("down = shut-down\n"); ! 446: printf("rerun = rerun\n"); ! 447: printf("event = run event\n"); ! 448: printf("nopage = page disable\n"); ! 449: printf("noalerts = activity alerts disable\n"); ! 450: printf("status=# = set status value\n"); ! 451: printf("useron=# = set useron number\n"); ! 452: printf("action=# = set action value\n"); ! 453: printf("errors=# = set error counter\n"); ! 454: printf("conn=# = set connection value\n"); ! 455: printf("misc=# = set misc value\n"); ! 456: printf("aux=# = set aux value\n"); ! 457: printf("extaux=# = set extended aux value\n"); ! 458: exit(0); } ! 459: ! 460: p=getenv("SBBSCTRL"); ! 461: if(p==NULL) { ! 462: printf("\7\nSBBSCTRL environment variable is not set.\n"); ! 463: printf("This environment variable must be set to your CTRL directory."); ! 464: printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n"); ! 465: exit(1); } ! 466: sprintf(ctrl_dir,"%.40s",p); ! 467: if(ctrl_dir[strlen(ctrl_dir)-1]!='\\' ! 468: && ctrl_dir[strlen(ctrl_dir)-1]!='/') ! 469: strcat(ctrl_dir,"/"); ! 470: ! 471: sprintf(str,"%snode.dab",ctrl_dir); ! 472: if((nodefile=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { ! 473: printf("\7\nError %d opening %s.\n",errno,str); ! 474: exit(1); } ! 475: ! 476: sys_nodes=filelength(nodefile)/sizeof(node_t); ! 477: if(!sys_nodes) { ! 478: printf("%s reflects 0 nodes!\n",str); ! 479: exit(1); } ! 480: ! 481: for(i=1;i<argc;i++) { ! 482: if(isdigit(argv[i][0])) ! 483: node_num=atoi(argv[i]); ! 484: else { ! 485: node_num=onoff=value=0; ! 486: if(!stricmp(argv[i],"-DEBUG")) ! 487: debug=1; ! 488: if(!stricmp(argv[i],"-LOOP")) ! 489: loop=1; ! 490: if(!stricmp(argv[i],"-PAUSE")) ! 491: pause=1; ! 492: ! 493: else if(!stricmp(argv[i],"LOCK")) ! 494: mode=MODE_LOCK; ! 495: else if(!stricmp(argv[i],"ANON")) ! 496: mode=MODE_ANON; ! 497: else if(!stricmp(argv[i],"INTR")) ! 498: mode=MODE_INTR; ! 499: else if(!stricmp(argv[i],"DOWN")) ! 500: mode=MODE_DOWN; ! 501: else if(!stricmp(argv[i],"RERUN")) ! 502: mode=MODE_RRUN; ! 503: else if(!stricmp(argv[i],"EVENT")) ! 504: mode=MODE_EVENT; ! 505: else if(!stricmp(argv[i],"NOPAGE")) ! 506: mode=MODE_NOPAGE; ! 507: else if(!stricmp(argv[i],"NOALERTS")) ! 508: mode=MODE_NOALERTS; ! 509: else if(!stricmp(argv[i],"ON")) ! 510: onoff=1; ! 511: else if(!stricmp(argv[i],"OFF")) ! 512: onoff=2; ! 513: else if(!strnicmp(argv[i],"STATUS=",7)) { ! 514: mode=MODE_STATUS; ! 515: value=atoi(argv[i]+7); } ! 516: else if(!strnicmp(argv[i],"ERRORS=",7)) { ! 517: mode=MODE_ERRORS; ! 518: value=atoi(argv[i]+7); } ! 519: else if(!strnicmp(argv[i],"USERON=",7)) { ! 520: mode=MODE_USERON; ! 521: value=atoi(argv[i]+7); } ! 522: else if(!strnicmp(argv[i],"ACTION=",7)) { ! 523: mode=MODE_ACTION; ! 524: value=atoi(argv[i]+7); } ! 525: else if(!strnicmp(argv[i],"CONN=",5)) { ! 526: mode=MODE_CONN; ! 527: value=atoi(argv[i]+5); } ! 528: else if(!strnicmp(argv[i],"MISC=",5)) { ! 529: mode=MODE_MISC; ! 530: value=atoi(argv[i]+5); } ! 531: else if(!strnicmp(argv[i],"AUX=",4)) { ! 532: mode=MODE_AUX; ! 533: value=atoi(argv[i]+4); } ! 534: else if(!strnicmp(argv[i],"EXTAUX=",7)) { ! 535: mode=MODE_EXTAUX; ! 536: value=atoi(argv[i]+7); } ! 537: } ! 538: if(mode!=MODE_LIST) ! 539: modify=1; ! 540: ! 541: if((mode && node_num) || i+1==argc) ! 542: while(1) { ! 543: for(j=1;j<=sys_nodes;j++) ! 544: if(!node_num || j==node_num) { ! 545: getnodedat(j,&node,modify); ! 546: misc=0; ! 547: switch(mode) { ! 548: case MODE_ANON: ! 549: misc=NODE_ANON; ! 550: break; ! 551: case MODE_LOCK: ! 552: misc=NODE_LOCK; ! 553: break; ! 554: case MODE_INTR: ! 555: misc=NODE_INTR; ! 556: break; ! 557: case MODE_DOWN: ! 558: if(node.status==NODE_WFC) ! 559: node.status=NODE_OFFLINE; ! 560: else ! 561: misc=NODE_DOWN; ! 562: break; ! 563: case MODE_RRUN: ! 564: misc=NODE_RRUN; ! 565: break; ! 566: case MODE_EVENT: ! 567: misc=NODE_EVENT; ! 568: break; ! 569: case MODE_NOPAGE: ! 570: misc=NODE_POFF; ! 571: break; ! 572: case MODE_NOALERTS: ! 573: misc=NODE_AOFF; ! 574: break; ! 575: case MODE_STATUS: ! 576: node.status=(uchar)value; ! 577: break; ! 578: case MODE_ERRORS: ! 579: node.errors=(uchar)value; ! 580: break; ! 581: case MODE_ACTION: ! 582: node.action=(uchar)value; ! 583: break; ! 584: case MODE_USERON: ! 585: node.useron=(uchar)value; ! 586: break; ! 587: case MODE_MISC: ! 588: node.misc=(uchar)value; ! 589: break; ! 590: case MODE_CONN: ! 591: node.connection=(uchar)value; ! 592: break; ! 593: case MODE_AUX: ! 594: node.aux=(uchar)value; ! 595: break; ! 596: case MODE_EXTAUX: ! 597: node.extaux=value; ! 598: break; } ! 599: if(misc) { ! 600: if(onoff==0) ! 601: node.misc^=misc; ! 602: else if(onoff==1) ! 603: node.misc|=misc; ! 604: else if(onoff==2) ! 605: node.misc&=~misc; } ! 606: if(modify) ! 607: putnodedat(j,node); ! 608: printnodedat(j,node); ! 609: if(debug) { ! 610: printf("status=%u\n",node.status); ! 611: printf("errors=%u\n",node.errors); ! 612: printf("action=%d\n",node.action); ! 613: printf("useron=%u\n",node.useron); ! 614: printf("conn=%u\n",node.connection); ! 615: printf("misc=%u\n",node.misc); ! 616: printf("aux=%u\n",node.aux); ! 617: printf("extaux=%lu\n",node.extaux); ! 618: } /* debug */ ! 619: ! 620: if(pause) { ! 621: printf("Hit enter..."); ! 622: getchar(); ! 623: printf("\n"); ! 624: } ! 625: ! 626: } /* if(!node_num) */ ! 627: ! 628: if(!loop) ! 629: break; ! 630: SLEEP(1000); ! 631: cls(); ! 632: } /* while(1) */ ! 633: ! 634: } /* for i<argc */ ! 635: ! 636: close(nodefile); ! 637: return(0); ! 638: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.