1 #include <netdb.h> 2 #include <string.h> 3 4 /* do we really need all these?? */ 5 6 static int idx; 7 static 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 endprotoent(void)46void endprotoent(void) 47 { 48 idx = 0; 49 } 50 setprotoent(int stayopen)51void setprotoent(int stayopen) 52 { 53 idx = 0; 54 } 55 getprotoent(void)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 getprotobyname(const char * name)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 getprotobynumber(int num)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