From f15aa3a552022743398a652165d76bf912c715e5 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Mon, 14 May 2001 13:47:49 +0000 Subject: Initial revision --- mdk-stage1/dietlibc/libugly/getprotoent.c | 130 ++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 mdk-stage1/dietlibc/libugly/getprotoent.c (limited to 'mdk-stage1/dietlibc/libugly/getprotoent.c') diff --git a/mdk-stage1/dietlibc/libugly/getprotoent.c b/mdk-stage1/dietlibc/libugly/getprotoent.c new file mode 100644 index 000000000..a648e2307 --- /dev/null +++ b/mdk-stage1/dietlibc/libugly/getprotoent.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static int protofd=-1; +static char* protomap; +static unsigned int protolen; + +static char* aliases[10]; + +static char *cur; + +/* ip 0 IP # internet protocol, pseudo protocol number */ +struct protoent *getprotoent(void) { + static struct protoent pe; + char *last; + int aliasidx; + if (protofd<0) { + protofd=open(_PATH_SERVICES,O_RDONLY); + if (protofd<0) return 0; + protolen=lseek(protofd,0,SEEK_END); + protomap=mmap(0,protolen,PROT_READ|PROT_WRITE,MAP_PRIVATE,protofd,0); + if ((long)protomap==(-1)) goto error; + cur=protomap; + } + last=protomap+protolen; +again: + pe.p_name=0; + pe.p_aliases=aliases; aliases[0]=0; + pe.p_proto=0; + if (cur>=last) return 0; + if (*cur=='#' || *cur=='\n') goto parseerror; + /* first, the primary name */ + if (!isalpha(*cur)) goto parseerror; + pe.p_name=cur; + pe.p_aliases=aliases; + while (cur=last) return 0; + if (*cur=='\n') goto parseerror; + *cur=0; cur++; + /* second, the protocol number */ + while (cur=last) return 0; + if (*cur=='\n') { *cur++=0; return &pe; } + *cur=0; cur++; + /* now the aliases */ + for (aliasidx=0;aliasidx<10;++aliasidx) { + while (cur=last || !isblank(*cur)) break; + *cur++=0; + } + aliases[aliasidx]=0; + return &pe; +parseerror: + while (curp_name,strlen(s->p_name)); + write(1,"/",1); + write(1,s->p_proto,strlen(s->p_proto)); + write(1,"\n",1); + if (!strcmp(name,"auth")) { + tmp=s->p_aliases; + write(1," aka ",5); + while (*tmp) { + write(1,*tmp,strlen(*tmp)); + write(1,", ",2); + ++tmp; + } + write(1,"\n",1); + } +#endif + if (!strcmp(name,s->p_name)) + return s; + tmp=s->p_aliases; + while (*tmp) + if (!strcmp(name,*tmp++)) return s; + } + return 0; +} + +struct protoent *getprotobynumber(int proto) { + struct protoent *s; + for (s=getprotoent(); s; s=getprotoent()) { + if (proto==s->p_proto) + return s; + } + return 0; +} + +void endprotoent(void) { + if (protomap!=(char*)-1) munmap(protomap,protolen); + if (protofd!=-1) close(protofd); + protomap=(char*)-1; + protofd=-1; +} + -- cgit v1.2.1