#include #ifdef NT #include #include #define strdup _strdup #define ltoa _ltoa #define CONFIG_FILE "k95d.cfg" #else #define CONFIG_FILE "k2d.cfg" #endif #define bzero(x,y) memset(x,0,y) #define BSDSELECT #define MAXPORTS 32 struct PORT { short id ; int lsocket ; int asocket ; char * k95cmd ; int showcmd; int rdns; } ports[MAXPORTS] ; int portcount = 0 ; #define MAXCHILDREN 256 struct CHILDREN { HANDLE hProcess; int socket; } children[MAXCHILDREN]; int childcount = 0; void init_children(void) { int i; for ( i=0 ;is_port = htons((unsigned short)atoi(p)); } else { /* Otherwise lookup the service name */ service = getservbyname(p, "tcp"); } if ( service ) { ports[portcount].id = service->s_port ; } else if ( !strcmp( "kermit", p ) ) { /* use now assigned Kermit Service Port */ service = &servrec ; service->s_port = htons( 1649 ) ; } else /* !service */ { fprintf(stderr, "Cannot find port for service %s\n", p); exit(2); } arg++; for ( i = arg ; i < argc ; i++ ) { len += strlen( argv[i] ) + 1 ; } ports[portcount].k95cmd = (char *) malloc( len ) ; if ( !ports[portcount].k95cmd ) { fprintf( stderr, "memory allocation error\n" ) ; exit(1) ; } ports[portcount].k95cmd[0] = '\0' ; for ( i=arg ; is_port = htons((unsigned short)atoi(p)); } else { /* Otherwise lookup the service name */ service = getservbyname(p, "tcp"); } if ( service ) { ports[portcount].id = service->s_port ; } else if ( !strcmp( "kermit", p ) ) { /* use now assigned Kermit Service Port */ service = &servrec ; ports[portcount].id = service->s_port = htons( 1649 ) ; } else /* ( !service ) */ { if ( cmdbuf[0] != ';' ) fprintf( stderr, "WARNING: invalid service or port \"%s\"\n", cmdbuf ) ; fscanf( cfgfd, "%[^\n]\n", cmdbuf ) ; break; } for ( i=0 ; i 0) { for ( i=0; ih_name, (char *)inet_ntoa(saddr.sin_addr),ntohs(ports[i].id)); } else { printf("%s connected on port %d\n",(char *)inet_ntoa(saddr.sin_addr), ntohs(ports[i].id)); } /* Now start subprocess */ printf("Starting Kermit with socket %d and command %s\n",ports[i].asocket,ports[i].k95cmd); hProcess = StartKermit(ports[i].asocket,ports[i].k95cmd, ports[i].showcmd, &sockdup); if ( hProcess != INVALID_HANDLE_VALUE ) add_child(hProcess, sockdup); else closesocket(ports[i].asocket); /* we use CLOSE_SOURCE when duplicating */ continue; /* Go get the next one */ } else { i = errno; /* save error code */ closesocket(ports[i].lsocket) ; ports[i].lsocket = -1; ports[i].asocket = -1; errno = i; /* and report this error */ fprintf(stderr,"tcpsrv_open accept errno","",errno); exit(7); } } #ifdef NT WSACleanup() ; #else #endif /* NT */ }