PCCONFIG.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. #include <copyright.h>
  2. #include <wattcp.h>
  3. #include <io.h>
  4. #include <dos.h> /* for _argv */
  5. #include <fcntl.h> /* open modes */
  6. #include <ctype.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #define MY_IP "MY_IP"
  10. #define IP              "IP"
  11. #define NETMASK  "NETMASK"
  12. #define COOKIE "COOKIE"
  13. #define NAMESERVER "NAMESERVER"
  14. #define GATEWAY  "GATEWAY"
  15. #define DOMAINS "DOMAINSLIST"
  16. #define HOSTNAME "HOSTNAME"
  17. #define SOCKDELAY       "SOCKDELAY"
  18. #define ETHIP "ETHIP"
  19. #define MSS             "MSS"
  20. #define BOOTP "BOOTP"
  21. #define BOOTPTO "BOOTPTO"
  22. #define DOMTO           "DOMAINTO"
  23. #define PRINT "PRINT"
  24. #define INACTIVE        "INACTIVE"
  25. #define INCLUDE         "INCLUDE"
  26. #define MULTIHOMES      "MULTIHOMES"
  27. #define DATATIMEOUT     "DATATIMEOUT"       /* 99.08.23 EE */
  28. #define is_it( x ) if (!strcmp(name,x))
  29. #ifndef SKIPINI // S. Lawson
  30. /*
  31.  * _inet_atoeth - read src, dump to ethernet buffer
  32.  *   and return pointer to end of text string
  33.  */
  34. char *_inet_atoeth( char *src, byte *eth )
  35. {
  36.     word count, val;
  37.     byte ch, icount;
  38.     val = count = icount = 0;
  39.     while ((ch = toupper(*src++)) != 0 ) {
  40. if (ch == ':' ) continue;
  41. if (ch == ',' ) break;
  42. if ((ch -= '0') > 9) ch -= 7;
  43. val = (val << 4) + ch;
  44. if ( icount ) {
  45.     eth[ count++ ] = val;
  46.     if (count > 5) break;
  47.     val = icount = 0;
  48. } else
  49.     icount = 1;
  50.     }
  51.     if ( *src == ',' ) ++src;
  52.     return( src );
  53. }
  54. static void ethip( char *s )
  55. {
  56.     eth_address temp_eth;
  57.     char *temp;
  58.     if (( temp = _inet_atoeth( s, (byte*)&temp_eth )) != NULL ) {
  59. if (!memcmp( &temp_eth, &_eth_addr, sizeof( eth_address ))) {
  60.     my_ip_addr = inet_addr( temp );
  61. }
  62.     }
  63. }
  64. #endif // SKIPINI   S. Lawson
  65. void _add_server( int *counter, int max, longword *array, longword value )
  66. {
  67.     int i,duplicate=0;
  68.     if ( value && ( *counter < max )) {
  69. for (i=0;i<*counter; i++) {
  70.     if ( array[i] == value)
  71. duplicate=1;
  72. }
  73. if (!duplicate)
  74.      array[ (*counter)++ ] = value;
  75.     }
  76. }
  77. word sock_delay = 30;
  78. word sock_inactive = 0;  /* defaults to forever */
  79. word multihomes = 0;
  80. char defaultdomain[ 80 ];
  81. longword _cookie[ MAX_COOKIES ];
  82. int _last_cookie;
  83. extern _domaintimeout;
  84. void (*usr_init)(char *name, char *value) = NULL;
  85. #ifndef SKIPINI // S. Lawson
  86. static void set_values(char *name, char *value )
  87. {
  88.     char *p;
  89. /*    longword temp; */
  90.     word i;
  91.     strupr(name);
  92.     is_it( MY_IP ) {
  93. if ( toupper( *value ) == 'B' ||
  94.      toupper( *value ) == 'D') _bootpon = 1; // S. Lawson
  95. else my_ip_addr = resolve( value );
  96.     } else is_it( IP ) {
  97. if ( toupper( *value ) == 'B' ||
  98.      toupper( *value ) == 'D') _bootpon = 1; // S. Lawson
  99. else my_ip_addr = resolve( value );
  100.     }
  101.     else is_it( NETMASK) sin_mask = resolve( value );
  102.     else is_it( GATEWAY)
  103. /* accept gateip[,subnet[,mask]]  */
  104. _arp_add_gateway( value , 0L );
  105.     else is_it( NAMESERVER )  _add_server( &_last_nameserver,
  106. MAX_NAMESERVERS, def_nameservers, resolve(value));
  107.     else is_it( COOKIE ) _add_server( &_last_cookie, MAX_COOKIES,
  108. _cookie, resolve( value ));
  109.     else is_it( DOMAINS ) def_domain = strcpy( defaultdomain, value );
  110.     else is_it( HOSTNAME ) strncpy(_hostname, value, MAX_STRING );
  111.     else is_it( SOCKDELAY ) sock_delay = atoi( value );
  112.     else is_it( ETHIP )  ethip( value );
  113.     else is_it( MSS ) _mss = atoi( value );
  114.     else is_it( BOOTP ) _bootphost = resolve( value );
  115.     else is_it( BOOTPTO) _bootptimeout = atoi( value );
  116.     else is_it( DOMTO ) _domaintimeout = atoi( value );
  117.     else is_it( INACTIVE ) sock_inactive = atoi( value );
  118.     else is_it( MULTIHOMES ) multihomes = atoi( value );
  119.     else is_it( DATATIMEOUT) sock_data_timeout = atoi( value ); /* EE 99.08.23 */
  120.     else is_it( PRINT ) {
  121. outs( value );
  122. outs( "nr" );
  123.     }
  124.     else is_it( INCLUDE ) {
  125.         if ( *(p = value) == '?') p++;
  126.         if ((i = _open( p, O_RDONLY | O_TEXT )) != 0xffff ) {
  127.     _close( i );
  128.             tcp_config( p );
  129.         } else if ( *value != '?' ) {
  130.             outs("nrUnable to open '");
  131.             outs( p );
  132.             outs("'nr");
  133.         }
  134.     }
  135.     else {
  136. if ( usr_init )
  137.     (*usr_init)(name, value);
  138.     }
  139. }
  140. static char *watfname = "WATTCP.CFG";
  141. static char *genfname = "TCP.CFG";
  142. // S. Lawson - set the config filename, or clear to skip
  143. void tcp_config_file(const char *fname)
  144. {
  145.     watfname=(char *) fname;
  146. }
  147. int tcp_config( char *path )
  148. {
  149.     char name[80], *temp, *namepart;
  150.     char value[80], ch[2];
  151.     int  quotemode;
  152.     int f, mode;
  153.     namepart = NULL;
  154.     if (!path) {
  155. if (watfname==NULL) return (-1); // S. Lawson
  156. if ((path = getenv( watfname )) != NULL ) {
  157.     path = strcpy( name, path );
  158.     strcat( name, "\");
  159. } else {
  160.     strcpy( name, _argv[0] );
  161.     path = ( *name && (name[1] == ':')) ? &name[2] : name;
  162.     if ((temp = strrchr( path, '\' )) == NULL) temp = path;
  163.     *(++temp) = 0;
  164. }
  165.         namepart = temp;
  166.         strcat( name, watfname );
  167.     } else
  168.         strcpy( name, path );
  169.     if ( ( f = _open( name, O_RDONLY | O_TEXT )) == -1 ) {
  170. /* try local subdirectory */
  171.         if (( f = _open( watfname, O_RDONLY | O_TEXT )) == -1 ){
  172.             if (( f = _open( genfname, O_RDONLY | O_TEXT )) == -1 ){
  173.                 strcpy( namepart, genfname );
  174.                 if (( f = _open( name, O_RDONLY | O_TEXT )) == -1 ){
  175.                     outs("Config file not foundnr");
  176.                     return( -1 );
  177.                 }
  178.             }
  179. }
  180.     }
  181.     *name = *value = mode = ch[1] = quotemode = 0;
  182.     while ( _read( f, &ch, 1 ) == 1) {
  183. switch( *ch ) {
  184.     case  '"': quotemode ^= 1;
  185. break;
  186.     case  ' ' :
  187.     case  't': if (quotemode) goto addit;
  188. break;
  189.     case  '=' : if (quotemode) goto addit;
  190. if (!mode) mode = 1;
  191. break;
  192.     case  '#' :
  193.     case  ';' : if (quotemode) goto addit;
  194. mode = 2;
  195. break;
  196.     case  'n':
  197.     case  'r': if (*name && *value)
  198.     set_values(name, value);
  199. *name = *value = quotemode = mode = 0;
  200. break;
  201.     default   :
  202. addit:
  203.        switch (mode ) {
  204. case 0 : strcat(name, ch);
  205.  break;
  206. case 1 : strcat(value, ch);
  207.  break;
  208. }
  209. break;
  210. }
  211.     }
  212.     _close(f );
  213.     return( 0 );
  214. }
  215. #endif // SKIPINI  S. Lawson