/* Miscellaneous format conversion subroutines */ /* #define DEBUG=1 */ #include #include #ifdef UNIX #include #include #include "unix.h" #endif /* UNIX */ #ifdef BSD char *sprintf(); #endif #include "global.h" #include "netuser.h" extern char *strchr(), *strrchr(); int net_error; int xatoi(); #define LINELEN 256 /* Convert Internet address in ascii dotted-decimal format (44.0.0.1) to * binary IP address */ int32 aton(t) char *t; { int32 n; /* int atoi(); */ register int i; char x[40]; char *cp,*s ; strncpy(x,t,39); x[39]='\0'; /* string length paranoia */ cp = s =x; /* atoi in some libs barfs if supplied with non numeric chars */ while(*cp){ if( *cp == '.' || ( *cp >='0' && *cp <='9') ) cp++; else *cp ='\0'; } #ifdef DEBUG printf("dave debug: input %s\n",s); #endif n = 0; for(i=24;i>=0;i -= 8){ #ifdef DEBUG printf("dje debug atoi %s\n ",s); #endif n |= (int32)atoi(s) << i; #ifdef DEBUG printf("dje int res = %lx \n",n); #endif if((s = index(s,'.')) == NULLCHAR) break; s++; } return n; } /* Resolve a host name into an IP address. IP addresses in dotted-decimal * notation are distinguished from domain names by enclosing them in * brackets, e.g., [44.64.0.1] */ int32 xresolve(host) /* not used - see domain.c */ char *host; { register char *cp,*cp1; int i; char hostent[LINELEN]; FILE *sfile; static struct { char *name; int32 address; } cache; if(*host == '['){ /* Brackets indicate IP address in dotted-decimal form */ return aton(host + 1); } if(cache.name != NULLCHAR && strcmp(cache.name,host) == 0) return cache.address; /* Not a numerical IP address, search the host table */ if((sfile = fopen(hosts,"r")) == NULL){ printf(" no hosts.net !\n"); return 0; } while (!feof(sfile)){ fgets(hostent,LINELEN,sfile); rip(hostent); cp = hostent; if(*cp == '#' || !isdigit(*cp)) continue; /* Comment or invalid line */ /* in next line "while(*cp" was "while(cp" dje */ while(*cp != '\0' ){ /* Skip white space */ while(*cp == ' ' || *cp == '\t') cp++; if(*cp == '\0') break; /* Look for next token, find length of this one */ if((cp1 = index(cp,'\t')) != NULLCHAR){ i = cp1 - cp; } else if((cp1 = index(cp,' ')) != NULLCHAR) { i = cp1 - cp; } else { i = strlen(cp); } printf("hostent: [%s], name [%s]\n",hostent,cp); if(strlen(host) == i && strncasecmp(host,cp,i) == 0){ /* Found it, put in cache */ fclose(sfile); if(cache.name != NULLCHAR) free(cache.name); cache.name = malloc((unsigned)strlen(host)+1); strcpy(cache.name,host); cache.address = aton(hostent); return cache.address; } /* That one didn't match, try the next one */ cp = cp1; } } /* No address found */ fclose(sfile); return 0; } /* Convert an internet address (in host byte order) to a dotted decimal ascii * string, e.g., 255.255.255.255\0 */ char * inet_ntoa(a) int32 a; { static char buf[16]; sprintf(buf,"%u.%u.%u.%u", hibyte(hiword(a)), lobyte(hiword(a)), hibyte(loword(a)), lobyte(loword(a)) ); return buf; } /* Convert a socket (address + port) to an ascii string of the form * aaa.aaa.aaa.aaa:ppppp */ char * psocket(s) struct socket *s; { static char buf[30]; sprintf(buf,"%s:%u",inet_ntoa(s->address),s->port); return buf; } /* Convert hex-ascii string to long integer */ long htol(s) char *s; { long ret; char c; ret = 0; while((c = *s++) != '\0'){ #if (!ATARI_ST && !LATTICE) /* DG2KK "ik versta er heelemal niets van!" */ c &= 0x7f; #endif if(c >= '0' && c <= '9') ret = ret*16 + (c - '0'); else if(c >= 'a' && c <= 'f') ret = ret*16 + (10 + c - 'a'); else if(c >= 'A' && c <= 'F') ret = ret*16 + (10 + c - 'A'); else break; } return ret; } int xatoi(s) #if __STDC__ > 0 const char *s; #else char *s; #endif { /* replacement atoi */ int n=0; while(1) /* Note: compiling with GCC-ST,1.4 seems to require while(1) , * putting while(*s) does not work. * last character befor null does not get counted ! * You tell me what's going on ? */ { if( !( *s >='0' && *s <='9')) return(n); n = (n *10) + *s - '0'; s++; } }