1#include <netdb.h> 2#include <string.h> 3 4/* do we really need all these?? */ 5 6static int idx; 7static const unsigned char protos[] = { 8 "\000ip\0" 9 "\001icmp\0" 10 "\002igmp\0" 11 "\003ggp\0" 12 "\004ipencap\0" 13 "\005st\0" 14 "\006tcp\0" 15 "\010egp\0" 16 "\014pup\0" 17 "\021udp\0" 18 "\024hmp\0" 19 "\026xns-idp\0" 20 "\033rdp\0" 21 "\035iso-tp4\0" 22 "\044xtp\0" 23 "\045ddp\0" 24 "\046idpr-cmtp\0" 25 "\051ipv6\0" 26 "\053ipv6-route\0" 27 "\054ipv6-frag\0" 28 "\055idrp\0" 29 "\056rsvp\0" 30 "\057gre\0" 31 "\062esp\0" 32 "\063ah\0" 33 "\071skip\0" 34 "\072ipv6-icmp\0" 35 "\073ipv6-nonxt\0" 36 "\074ipv6-opts\0" 37 "\111rspf\0" 38 "\121vmtp\0" 39 "\131ospf\0" 40 "\136ipip\0" 41 "\142encap\0" 42 "\147pim\0" 43 "\377raw" 44}; 45 46void endprotoent(void) 47{ 48 idx = 0; 49} 50 51void setprotoent(int stayopen) 52{ 53 idx = 0; 54} 55 56struct protoent *getprotoent(void) 57{ 58 static struct protoent p; 59 static const char *aliases; 60 if (idx >= sizeof protos) return NULL; 61 p.p_proto = protos[idx]; 62 p.p_name = (char *)&protos[idx+1]; 63 p.p_aliases = (char **)&aliases; 64 idx += strlen(p.p_name) + 2; 65 return &p; 66} 67 68struct protoent *getprotobyname(const char *name) 69{ 70 struct protoent *p; 71 endprotoent(); 72 do p = getprotoent(); 73 while (p && strcmp(name, p->p_name)); 74 return p; 75} 76 77struct protoent *getprotobynumber(int num) 78{ 79 struct protoent *p; 80 endprotoent(); 81 do p = getprotoent(); 82 while (p && p->p_proto != num); 83 return p; 84} 85