home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
telecomm
/
nhclb120
/
netuser.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-26
|
4KB
|
205 lines
/* Miscellaneous format conversion subroutines */
/* #define DEBUG=1 */
#include <ctype.h>
#include <stdio.h>
#ifdef UNIX
#include <stdlib.h>
#include <string.h>
#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++;
}
}