Thread: [Dhcp-agent-commits] CVS: dhcp-agent COST,1.1.1.1,1.2 dhcp-agent.h,1.16,1.17 dhcp-convert.c,1.3,1.4
Status: Alpha
Brought to you by:
actmodern
From: Thamer Al-H. <act...@us...> - 2002-02-05 02:01:02
|
Update of /cvsroot/dhcp-agent/dhcp-agent In directory usw-pr-cvs1:/tmp/cvs-serv25780 Modified Files: COST dhcp-agent.h dhcp-convert.c dhcp-util.c Log Message: major update to dhcp-convert; now with all options we care about converted; Index: COST =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/COST,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** COST 2002/01/29 18:04:59 1.1.1.1 --- COST 2002/02/05 02:00:59 1.2 *************** *** 1,5 **** In writing dhcp-agent I suffered the following: ! [ these stats are updated every major release. ] 162 pots of coffee; 421 camel filter cigarettes; 112 diet cokes; --- 1,9 ---- In writing dhcp-agent I suffered the following: ! Feb - March 2001 ! ! [ todo ] ! ! Jan - Feb 2001 162 pots of coffee; 421 camel filter cigarettes; 112 diet cokes; Index: dhcp-agent.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-agent.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** dhcp-agent.h 2002/02/03 16:55:59 1.16 --- dhcp-agent.h 2002/02/05 02:00:59 1.17 *************** *** 123,127 **** /* type string limits. */ ! # define UINT32_T_STRING_SIZE 12 /* timeout as per rfc2131 */ --- 123,131 ---- /* type string limits. */ ! # define UINT32_T_STRING_SIZE 11 ! # define INT32_T_STRING_SIZE UINT32_T_STRING_SIZE /* the same. */ ! # define UINT16_T_STRING_SIZE 6 ! # define INT16_T_STRING_SIZE UINT16_T_STRING_SIZE ! # define BYTE_STRING_SIZE 5 /* timeout as per rfc2131 */ *************** *** 508,511 **** --- 512,516 ---- extern void trim_string(char *s); extern int string_matches(char *s1, char *s2); + extern int hex_string_to_value(char *string, unsigned char *dst); extern int is_string(const char *string, int len); extern int get_random(void); *************** *** 785,804 **** extern int get_pid_file(char *name, pid_t *pid); - /* serialization functions. */ - - extern char *addr_to_string(const unsigned char *data, int len); - extern char *addr_list_to_string(const unsigned char *data, int len); - extern void *string_to_addr_list(char *string); - extern void *string_to_addr(char *string); - extern void *string_addr_list_to_network(char *string, unsigned char *len_ret); - extern void *string_addr_to_network(char *string, unsigned char *len_ret); - extern char *uint32_to_string(const unsigned char *data, int len); - extern void *string_to_uint32(char *s); - extern void *string_uint32_to_network(char *s, unsigned char *len_ret); - extern char *validate_to_string(const unsigned char *data, int len); - extern void *string_uint32_to_network(char *s, unsigned char *len_ret); - extern void *strdup_wrap(char *s); - extern void *strdup_wrap_net(char *s, unsigned char *ret_len); - extern int hex_string_to_value(char *string, unsigned char *dst); /* System configuration routines. */ --- 790,793 ---- Index: dhcp-convert.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-convert.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-convert.c 2002/01/30 16:06:46 1.3 --- dhcp-convert.c 2002/02/05 02:00:59 1.4 *************** *** 34,139 **** /* We have four handlers: * ! * Serialize data handler: serializes from network form to serialized state. ! * Unserialize data handler: unserializes into internal form. ! * Convert serialized: converts to a type specific form -- ! * useful for internal usage. * */ option_convert_handler option_convert_handlers[] = { ! { NULL, NULL, NULL, NULL }, /* 0 */ ! { addr_to_string, string_to_addr, string_addr_to_network, ! xfree }, /* 1 */ ! { NULL, NULL, NULL, NULL }, /* 2 */ ! { addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 3 */ ! { NULL, NULL, NULL, NULL }, /* 4 */ ! { NULL, NULL, NULL, NULL }, /* 5 */ ! { addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 6 */ ! { NULL, NULL, NULL, NULL }, /* 7 */ ! { NULL, NULL, NULL, NULL }, /* 8 */ ! { NULL, NULL, NULL, NULL }, /* 9 */ ! { NULL, NULL, NULL, NULL }, /* 10 */ ! { NULL, NULL, NULL, NULL }, /* 11 */ ! { NULL, NULL, NULL, NULL }, /* 12 */ ! { NULL, NULL, NULL, NULL }, /* 13 */ ! { NULL, NULL, NULL, NULL }, /* 14 */ ! { validate_to_string, strdup_wrap, strdup_wrap_net, ! xfree }, /* 15 */ ! { NULL, NULL, NULL, NULL }, /* 16 */ ! { NULL, NULL, NULL, NULL }, /* 17 */ ! { NULL, NULL, NULL, NULL }, /* 18 */ ! { NULL, NULL, NULL, NULL }, /* 19 */ ! { NULL, NULL, NULL, NULL }, /* 20 */ ! { NULL, NULL, NULL, NULL }, /* 21 */ ! { NULL, NULL, NULL, NULL }, /* 22 */ ! { NULL, NULL, NULL, NULL }, /* 23 */ ! { NULL, NULL, NULL, NULL }, /* 24 */ ! { NULL, NULL, NULL, NULL }, /* 25 */ ! { NULL, NULL, NULL, NULL }, /* 26 */ ! { NULL, NULL, NULL, NULL }, /* 27 */ ! { NULL, NULL, NULL, NULL }, /* 28 */ ! { NULL, NULL, NULL, NULL }, /* 29 */ ! { NULL, NULL, NULL, NULL }, /* 30 */ ! { NULL, NULL, NULL, NULL }, /* 31 */ ! { NULL, NULL, NULL, NULL }, /* 32 */ ! { NULL, NULL, NULL, NULL }, /* 33 */ ! { NULL, NULL, NULL, NULL }, /* 34 */ ! { NULL, NULL, NULL, NULL }, /* 35 */ ! { NULL, NULL, NULL, NULL }, /* 36 */ ! { NULL, NULL, NULL, NULL }, /* 37 */ ! { NULL, NULL, NULL, NULL }, /* 38 */ ! { NULL, NULL, NULL, NULL }, /* 39 */ ! { NULL, NULL, NULL, NULL }, /* 40 */ ! { NULL, NULL, NULL, NULL }, /* 41 */ ! { NULL, NULL, NULL, NULL }, /* 42 */ ! { NULL, NULL, NULL, NULL }, /* 43 */ ! { NULL, NULL, NULL, NULL }, /* 44 */ ! { NULL, NULL, NULL, NULL }, /* 45 */ ! { NULL, NULL, NULL, NULL }, /* 46 */ ! { NULL, NULL, NULL, NULL }, /* 47 */ ! { NULL, NULL, NULL, NULL }, /* 48 */ ! { NULL, NULL, NULL, NULL }, /* 49 */ ! { addr_to_string, string_to_addr, ! string_addr_to_network, xfree }, /* 50 */ ! { uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 51 */ ! { NULL, NULL, NULL, NULL }, /* 52 */ ! { NULL, NULL, NULL, NULL }, /* 53 */ ! { addr_to_string, string_to_addr, ! string_addr_to_network, xfree }, /* 54 */ ! { NULL, NULL, NULL, NULL }, /* 55 */ ! { NULL, NULL, NULL, NULL }, /* 56 */ ! { NULL, NULL, NULL, NULL }, /* 57 */ ! { uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 58 */ ! { NULL, NULL, NULL, NULL }, /* 59 */ ! { NULL, NULL, NULL, NULL }, /* 60 */ ! { NULL, NULL, NULL, NULL }, /* 61 */ }; ! char *addr_to_string(const unsigned char *data, int len) { ! struct in_addr address; ! memcpy(&address.s_addr, data, 4); ! if(len < 4) return NULL; return(strdup(inet_ntoa(address))); } ! char *addr_list_to_string(const unsigned char *data, int len) { char *string; char *tmp, *new_string; ! if(len < 4) return NULL; ! string = addr_to_string(data, len); if(string == NULL) return NULL; --- 34,285 ---- /* We have four handlers: + * + * Network to serialized: take a datum in raw network format and + * serialize into serial datum. + * + * Serial to internal: take a serial and convert it to internal + * format. + * + * Serial to network: take a serial datum and turn it into a raw + * network datum. + * + * Free internal: special freeing routine used for internal datum. + * This is used so we can pass around internal datums elsewhere without + * having to understand them. * ! * All network to serialized handlers do validity checks for length ! * matching exact sizes or multiples of sizes. This is where we expect ! * malformed options to be stomped on. * */ + /* serialization functions. */ + + /* byte routines. */ + + char *network_byte_to_string_byte(const unsigned char *data, int len); + void *string_byte_to_byte(char *s); + void *string_byte_to_network(char *s, unsigned char *ret_len); + + /* address routines. */ + + char *network_addr_to_string(const unsigned char *data, int len); + char *network_addr_list_to_string(const unsigned char *data, int len); + char *addr_list_to_string(const unsigned char *data, int len); + void *string_to_addr_list(char *string); + void *string_to_addr(char *string); + void *string_addr_list_to_network(char *string, unsigned char *len_ret); + void *string_addr_to_network(char *string, unsigned char *len_ret); + char *network_addr_pair_list_to_string(const unsigned char *data, int len); + void *string_to_addr_pair_list(char *s); + void *string_addr_pair_list_to_network(char *s, unsigned char *retlen); + + /* integer routines. */ + + char *network_uint32_to_string(const unsigned char *data, int len); + char *network_int32_to_string(const unsigned char *data, int len); + char *network_uint16_to_string(const unsigned char *data, int len); + char *network_int16_to_string(const unsigned char *data, int len); + + void *string_to_uint32(char *s); + void *string_to_int32(char *s); + void *string_to_uint16(char *s); + void *string_to_int16(char *s); + + void *string_int32_to_network(char *s, unsigned char *ret_len); + void *string_uint32_to_network(char *s, unsigned char *ret_len); + void *string_int16_to_network(char *s, unsigned char *ret_len); + void *string_uint16_to_network(char *s, unsigned char *ret_len); + + char *network_uint16_list_to_string(const unsigned char *data, int len); + void *string_to_uint16_list(char *s); + void *string_uint16_list_to_network(char *s, unsigned char *retlen); + + /* network to string */ + + char *validate_network_string_to_string(const unsigned char *data, int len); + void *strdup_wrap(char *s); + void *strdup_wrap_net(char *s, unsigned char *ret_len); + option_convert_handler option_convert_handlers[] = { ! { NULL, NULL, NULL, NULL }, /* 0 */ /* pad */ ! { network_addr_to_string, string_to_addr, string_addr_to_network, ! xfree }, /* 1 */ /* subnet mask */ ! { network_int32_to_string, string_to_int32, ! string_int32_to_network, xfree }, /* 2 */ /* time offset */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 3 */ /* router. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 4 */ /* time server. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 5 */ /* name server. (old) */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 6 */ /* domain name servers. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 7 */ /* mit-lcs log server */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 8 */ /* cookie server. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 9 */ /* LPR server. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 10 */ /* Impress server. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 11 */ /* Resource Location Server. */ ! { validate_network_string_to_string, ! strdup_wrap, strdup_wrap_net, xfree }, /* 12 */ /* Host name option. */ ! { network_uint16_to_string, string_to_uint16, ! string_uint16_to_network, xfree }, /* 13 */ /* boot file size option */ ! { validate_network_string_to_string, ! strdup_wrap, strdup_wrap_net, xfree }, /* 14 */ /* merit dump file */ ! { validate_network_string_to_string, strdup_wrap, strdup_wrap_net, ! xfree }, /* 15 */ /* domain name */ ! { network_addr_to_string, string_to_addr, string_addr_to_network, ! xfree }, /* 16 */ /* swap server */ ! { validate_network_string_to_string, strdup_wrap, strdup_wrap_net, ! xfree }, /* 17 */ /* root path */ ! { validate_network_string_to_string, strdup_wrap, strdup_wrap_net, ! xfree }, /* 18 */ /* extension path */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 19 */ /* IP forwarding. */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 20 */ /* Non Local Source Routing. */ ! { network_addr_pair_list_to_string, string_to_addr_pair_list, ! string_addr_pair_list_to_network, purge_list_internal }, /* 21 */ /* Policy filter option. */ ! { network_uint16_to_string, string_to_uint16, ! string_uint16_to_network, xfree }, /* 22 */ /* maximum dgram reassembly */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 23 */ /* IP TTL */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 24 */ /* MTU Aging Timeout. */ ! { network_uint16_list_to_string, string_to_uint16_list, ! string_uint16_list_to_network, purge_list_internal }, /* 25 */ /* MTU Plateau Table. */ ! { network_uint16_to_string, string_to_uint16, ! string_uint16_to_network, xfree }, /* 26 */ /* Interface MTU. */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 27 */ /* Subnets are Local */ ! { network_addr_to_string, string_to_addr, string_addr_to_network, ! xfree }, /* 28 */ /* Broadcast Address */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 29 */ /* Perform Mask Discovery */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 30 */ /* Mask Supplier */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 31 */ /* Perform Router Discovery */ ! { network_addr_to_string, string_to_addr, ! string_addr_to_network, xfree }, /* 32 */ /* Router Solicitation Address */ ! { network_addr_pair_list_to_string, string_to_addr_pair_list, ! string_addr_pair_list_to_network, purge_list_internal }, /* 33 */ /* Static Route */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 34 */ /* Trailer Encapsulation */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 35 */ /* ARP Cache Timeout. */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 36 */ /* Ethernet Encapsulation */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 37 */ /* TCP Default TLL */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 38 */ /* TCP Keepalive Interval */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 39 */ /* TCP Keepalive Garbage Option. */ ! { validate_network_string_to_string, strdup_wrap, ! strdup_wrap_net, xfree }, /* 40 */ /* Network Information Service Domain */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 41 */ /* Network Information Servers */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 42 */ /* Network Time Protocol Servers. */ ! { NULL, NULL, NULL, NULL }, /* 43 */ /* Vendor Specific (don't handle yet.) */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 44 */ /* NetBIOS over TCP/IP Name Server */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 45 */ /* NetBIOS over TCP/IP Name Server */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 46 */ /* NetBIOS over TCP/IP Node Type. */ ! { validate_network_string_to_string, ! strdup_wrap, strdup_wrap_net, xfree }, /* 47 */ /* NetBIOS over TCP/IP Scope */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 48 */ /* X Windows System Font Server. */ ! { network_addr_list_to_string, string_to_addr_list, ! string_addr_list_to_network, purge_list_internal }, /* 49 */ /* X Window System Display Manager. */ ! { network_addr_to_string, string_to_addr, ! string_addr_to_network, xfree }, /* 50 */ /* Request IP Address. */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 51 */ /* IP Address Lease Time */ ! { network_byte_to_string_byte, string_byte_to_byte, ! string_byte_to_network, xfree }, /* 52 */ /* Option Overload. */ ! { NULL, NULL, NULL, NULL }, /* 53 */ /* Dhcp Message Type. */ ! { network_addr_to_string, string_to_addr, ! string_addr_to_network, xfree }, /* 54 */ /* Server Identifier. */ ! { NULL, NULL, NULL, NULL }, /* 55 */ /* parameter request list. */ ! { NULL, NULL, NULL, NULL }, /* 56 */ /* message. we handle this higher. */ ! { network_uint16_list_to_string, string_to_uint16_list, ! string_uint16_list_to_network, purge_list_internal }, /* 57 */ /* Maximum DHCP message size. */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 58 */ /* Renewal time. */ ! { network_uint32_to_string, string_to_uint32, ! string_uint32_to_network, xfree }, /* 59 */ /* Rebinding time. */ ! { NULL, NULL, NULL, NULL }, /* 60 */ /* Server identifier */ ! { NULL, NULL, NULL, NULL }, /* 61 */ /* Client identifier */ }; ! /* Byte conversions useful for flags, and 1/0 values. */ ! ! /* network byte value to string byte value. */ ! char *network_byte_to_string_byte(const unsigned char *data, int len) { ! char *s; ! if(len < 1) ! return NULL; ! s = xmalloc(BYTE_STRING_SIZE); ! snprintf(s, BYTE_STRING_SIZE, "0x%hhx", *(unsigned char *)data); ! ! return s; ! } ! ! /* string to internal byte value. */ ! void *string_byte_to_byte(char *s) ! { ! unsigned char *b; ! ! b = xmalloc(sizeof(unsigned char)); ! ! sscanf(s,"0x%hhx",b); ! ! return b; ! } ! ! /* string to network byte value. */ ! void *string_byte_to_network(char *s, unsigned char *ret_len) ! { ! *ret_len = 1; ! return(string_byte_to_byte); ! } ! ! /* IPv4 address conversion routines. */ ! ! /* convert one network address datum to serialized form. */ ! char *network_addr_to_string(const unsigned char *data, int len) ! { ! struct in_addr address; ! ! if(len < IP_ADDR_LEN) return NULL; + + memcpy(&address.s_addr, data, IP_ADDR_LEN); return(strdup(inet_ntoa(address))); } ! /* convert list of network address datums to serialized form. */ ! char *network_addr_list_to_string(const unsigned char *data, int len) { char *string; char *tmp, *new_string; ! if(len < IP_ADDR_LEN) return NULL; ! string = network_addr_to_string(data, len); if(string == NULL) return NULL; *************** *** 150,154 **** tmp = string; ! new_string = addr_to_string(data, len); if(new_string == NULL) { --- 296,300 ---- tmp = string; ! new_string = network_addr_to_string(data, len); if(new_string == NULL) { *************** *** 163,167 **** string = splice_string(string, new_string); xfree(tmp); ! tmp = string; string = splice_string(string, ";"); --- 309,314 ---- string = splice_string(string, new_string); xfree(tmp); ! xfree(new_string); ! tmp = string; string = splice_string(string, ";"); *************** *** 175,182 **** } void *string_to_addr(char *string) { uint32_t addr, *new_addr; ! addr = inet_addr(string); --- 322,330 ---- } + /* convert string address to internal address datum. */ void *string_to_addr(char *string) { uint32_t addr, *new_addr; ! addr = inet_addr(string); *************** *** 187,190 **** --- 335,339 ---- } + /* convert list of string addresses to internal address datum. */ void *string_to_addr_list(char *string) { *************** *** 213,220 **** return addr_list; } - - /* Addresses are stored internally in network order - * so no conversion necessary. */ void *string_addr_to_network(char *string, unsigned char *len_ret) { --- 362,367 ---- return addr_list; } + /* convert serialized address to network datum. */ void *string_addr_to_network(char *string, unsigned char *len_ret) { *************** *** 224,237 **** return addr; } - - /* - * Just call the regular string_addr_list and copy - * make new copy while destroying the old. - * - * FIXME: even though these lists are small, we - * shouldn't need to walk through them three times. - * - */ void *string_addr_list_to_network(char *string, unsigned char *len_ret) { --- 371,376 ---- return addr; } + /* convert serialized address list to network datum. */ void *string_addr_list_to_network(char *string, unsigned char *len_ret) { *************** *** 244,252 **** count++; ! data = xmalloc(count * 4); cp = data; for(ptr = addr_list;ptr;ptr = ptr->next) { ! memcpy(cp, ptr->data, 4); cp++; } --- 383,391 ---- count++; ! data = xmalloc(count * IP_ADDR_LEN); cp = data; for(ptr = addr_list;ptr;ptr = ptr->next) { ! memcpy(cp, ptr->data, IP_ADDR_LEN); cp++; } *************** *** 257,275 **** return data; } ! /* We already have a string coming in, we need to validate ! * it though; we need to make sure its null terminated. ! * Then just return a new copy. ! * ! * FIXME: all strings should conform to the RFC. ! * Add check. ! * */ ! char *validate_to_string(const unsigned char *data, int len) { char *new_string; ! if(!is_string(data, len)) { new_string = xmalloc(len + 1); memcpy(new_string, data, len); --- 396,435 ---- return data; } + + /* address pair conversion. this just adds a check to make sure len is divisible + * by 2 addresses. */ + char *network_addr_pair_list_to_string(const unsigned char *data, int len) + { + if(len == 0 || + len%(IP_ADDR_LEN * 2)) + return NULL; ! return(network_addr_list_to_string(data, len)); ! } ! ! /* string to internal address pair list (wrapper). */ ! void *string_to_addr_pair_list(char *s) ! { ! return(string_to_addr_list(s)); ! } ! ! /* string to network address pair list (wrapper). */ ! void *string_addr_pair_list_to_network(char *s, unsigned char *retlen) ! { ! return(string_addr_list_to_network(s, retlen)); ! } ! ! /* String conversions: ! * We use strdup mostly to just make copies in our conversion hook ! * array. However, for network strings we want to run them through ! * validate_network_to_string */ ! /* validate string only: fixme: add rfc character set check. */ ! char *validate_network_string_to_string(const unsigned char *data, int len) { char *new_string; ! if(!is_string(data, len)) { /* fix if needed. */ new_string = xmalloc(len + 1); memcpy(new_string, data, len); *************** *** 278,351 **** } ! /* we don't want to force terminate. ! * instead we should just consider that ! * it is malformed and return an error. */ ! return strdup(data); } ! char *uint32_to_string(const unsigned char *data, int len) { ! char *uint32_string; ! uint32_t val; ! if(len < 4) ! return NULL; ! val = ntohl(*(uint32_t *)data); ! uint32_string = xmalloc(UINT32_T_STRING_SIZE); ! snprintf(uint32_string, UINT32_T_STRING_SIZE, "%lu", (unsigned long) val); /* this may not be safe. ! * FIXME */ ! return uint32_string; } ! void *string_to_uint32(char *s) { ! uint32_t *val; ! char *val_string; ! val = xmalloc(sizeof(uint32_t)); ! ! /* must begin with an arbritrary amount ! * of white space. h'ok. */ ! val_string = splice_string(" ", s); ! *val = strtoul(val_string, NULL, 10); ! xfree(val_string); ! return val; } ! void *string_uint32_to_network(char *s, unsigned char *ret_len) { ! uint32_t *val; ! unsigned char *net_val; ! val = string_to_uint32(s); ! if(val == NULL) return NULL; ! net_val = xmalloc(sizeof(uint32_t)); ! (*(uint32_t *)net_val) = htonl(*val); ! xfree(val); ! *ret_len = sizeof(uint32_t); ! return net_val; } ! void *strdup_wrap(char *s) { ! return(strdup(s)); } ! void *strdup_wrap_net(char *s, unsigned char *ret_len) { ! unsigned char *val; ! val = strdup_wrap(s); ! *ret_len = strlen(s); ! return val; } --- 438,771 ---- } ! /* otherwise strdup a copy. */ return strdup(data); } ! /* just copy. wrapper needed to be nice to the compiler. */ ! void *strdup_wrap(char *s) { ! return(strdup(s)); ! } ! ! /* call strdup_wrap but set the ret_len appropriately. */ ! void *strdup_wrap_net(char *s, unsigned char *ret_len) ! { ! unsigned char *val; ! val = strdup_wrap(s); ! ! *ret_len = (strlen(s) + 1); ! return val; ! } ! ! /* Integer conversions: ! * More work is done here to convert to network or internal format. */ ! ! /* workhorse network int to string routine. */ ! char *network_int_to_string(const unsigned char *data, int data_len, ! size_t size, int si) ! { ! char *string; ! if(size > data_len) ! return NULL; ! if(si) { /* signed. */ ! ! switch(size) { ! ! case sizeof(int32_t): ! string = xmalloc(INT32_T_STRING_SIZE); ! snprintf(string, INT32_T_STRING_SIZE, "%ld", ntohl(*(int32_t *)data)); ! break; ! ! case sizeof(int16_t): ! string = xmalloc(INT16_T_STRING_SIZE); ! snprintf(string, INT16_T_STRING_SIZE, "%hd", ntohs(*(int16_t *)data)); ! break; ! ! default: ! /* we should never get here but we should force ourselves ! * to b0rk if we do. */ ! fatal_error("illegal size passed to int_to_string()!"); ! } ! ! } else { /* unsigned. */ ! ! switch(size) { ! ! case sizeof(uint32_t): ! string = xmalloc(UINT32_T_STRING_SIZE); ! snprintf(string, UINT32_T_STRING_SIZE, "%lu", ntohl(*(uint32_t *)data)); ! break; ! ! case sizeof(uint16_t): ! string = xmalloc(UINT16_T_STRING_SIZE); ! snprintf(string, UINT16_T_STRING_SIZE, "%hu", ntohs(*(uint16_t *)data)); ! break; ! ! default: ! /* ditto on forced b0rking. */ ! fatal_error("illegal size passed to int_to_string()!"); ! break; ! } ! } ! return string; ! } ! /* interface to *int*_to_string */ ! char *network_uint32_to_string(const unsigned char *data, int len) { ! return(network_int_to_string(data, len, sizeof(uint32_t), 0)); ! } ! char *network_int32_to_string(const unsigned char *data, int len) ! { ! return(network_int_to_string(data, len, sizeof(int32_t), 1)); ! } ! char *network_uint16_to_string(const unsigned char *data, int len) ! { ! return(network_int_to_string(data, len, sizeof(int32_t), 0)); ! } ! char *network_int16_to_string(const unsigned char *data, int len) ! { ! return(network_int_to_string(data, len, sizeof(int32_t), 1)); ! } ! char *network_uint16_list_to_string(const unsigned char *data, int len) ! { ! char *tmp; ! char *s = NULL; ! char *string = NULL; ! if(len == 0 || ! len%sizeof(uint16_t)) ! return NULL; ! for(;len > 0;len -= sizeof(uint16_t)) { ! ! s = network_uint16_to_string(data, sizeof(uint16_t)); ! if(s == NULL) ! return string; ! ! tmp = string; ! string = splice_string(s, string); ! ! if(tmp != NULL) ! xfree(tmp); ! xfree(s); ! ! tmp = string; ! string = splice_string(string, ";"); ! free(tmp); ! ! data += sizeof(uint16_t); ! } ! ! return string; } ! void *string_to_uint16_list(char *s) { ! list_t *list_ptr = NULL; ! void *val; ! char *cp, *ptr; ! ! cp = s; ! while((ptr = strchr(cp, ';')) != NULL) { ! *ptr = '\0'; ! val = string_to_uint16(cp); ! if(val == NULL) ! break; ! ! list_ptr = add_to_list(list_ptr,val); ! ! ptr++; ! if(*ptr == '\0') ! break; ! cp = ptr; ! } ! return list_ptr; ! } ! ! void *string_uint16_list_to_network(char *s, unsigned char *retlen) ! { ! unsigned char *data, *data_ptr; ! uint16_t *val; ! int len = 0; ! char *ptr; ! char *cp; ! ! for(cp = s;ptr != NULL;ptr = strchr(cp, ';')) { ! cp = ptr + 1; ! len++; ! } ! ! if(len == 0) return NULL; + + data = xmalloc(sizeof(uint16_t) * len); + cp = s; + data_ptr = data; ! while(len--) { ! ptr = strchr(cp, ';'); ! *ptr = '\0'; ! ! val = string_to_uint16(cp); ! memcpy(data_ptr, val, sizeof(uint16_t)); ! xfree(val); ! data_ptr += sizeof(uint16_t); ! } ! return data; } ! /* workhorse string to integer routine. */ ! /* i'm worried about some of the type issues here. */ ! ! static void *string_to_int(char *s, int si, size_t size) { ! void *val; ! ! /* allocate string for str* integer conversion. */ ! val = xmalloc(size); ! ! if(si) { /* signed. */ ! ! switch(size) { ! ! case sizeof(int32_t): ! *(int32_t *)val = strtol(s, NULL, 10); ! break; ! ! case sizeof(int16_t): ! *(int16_t *)val = (uint16_t)atoi(s); /* this is safe ! * because we're always getting our ! * own serialized values. they should decay fine. ! * don't use this on strings gotten from the network. */ ! break; ! default: ! /* we should never get here but we should force ourselves ! * to b0rk if we do. */ ! fatal_error("illegal size passed to string_to_int()!"); ! } ! ! } else { /* unsigned. */ ! ! switch(size) { ! ! case sizeof(uint32_t): ! *(uint32_t *)val = strtoul(s, NULL, 10); ! break; ! ! case sizeof(uint16_t): ! *(uint16_t *)val = (uint16_t)atoi(s); /* ditto on safeness. */ ! break; ! ! default: ! /* ditto on forced b0rking. */ ! fatal_error("illegal size passed to string_to_int()!"); ! ! } ! } ! ! return val; } ! /* Interface for string_to_*int* */ ! void *string_to_uint32(char *s) { ! return(string_to_int(s, 0, sizeof(uint32_t))); ! } ! void *string_to_int32(char *s) ! { ! return(string_to_int(s, 1, sizeof(uint32_t))); ! } ! void *string_to_uint16(char *s) ! { ! return(string_to_int(s, 0, sizeof(int16_t))); ! } ! void *string_to_int16(char *s) ! { ! return(string_to_int(s, 1, sizeof(uint16_t))); ! } ! ! /* string int to network. */ ! static void *string_int_to_network(char *s, unsigned char *ret_len, ! int si, size_t size) ! { ! void *val; ! unsigned char *net_val; ! ! net_val = xmalloc(size); ! *ret_len = size; ! if(si) { ! ! switch(size) { ! ! case sizeof(int32_t): ! val = string_to_int32(s); ! *(int32_t *)net_val = htonl(*(int32_t *)val); ! xfree(val); ! break; ! ! case sizeof(int16_t): ! val = string_to_int16(s); ! *(int16_t *)net_val = htons(*(int16_t *)val); ! xfree(val); ! break; ! ! default: ! /* we should never get here but we should force ourselves ! * to b0rk if we do. */ ! fatal_error("illegal size passed to string_int_to_network()!"); ! } ! ! switch(size) { ! ! case sizeof(uint32_t): ! ! val = string_to_uint32(s); ! *(uint32_t *)net_val = htonl(*(uint32_t *)val); ! xfree(val); ! break; ! ! case sizeof(uint16_t): ! val = string_to_uint16(s); ! *(uint16_t *)net_val = htons(*(uint16_t *)val); ! xfree(val); ! break; ! ! default: ! /* ditto on the b0rkination. */ ! fatal_error("illegal size passed to string_int_to_network()!"); ! } ! } ! ! return net_val; ! } ! ! /* interface to string_*int*_to_network */ ! void *string_int32_to_network(char *s, unsigned char *ret_len) ! { ! return(string_int_to_network(s, ret_len, 1, sizeof(int32_t))); ! } ! void *string_uint32_to_network(char *s, unsigned char *ret_len) ! { ! return(string_int_to_network(s, ret_len, 0, sizeof(uint32_t))); ! } ! void *string_int16_to_network(char *s, unsigned char *ret_len) ! { ! return(string_int_to_network(s, ret_len, 1, sizeof(int16_t))); } + void *string_uint16_to_network(char *s, unsigned char *ret_len) + { + return(string_int_to_network(s, ret_len, 0, sizeof(uint16_t))); + } + + /* Gee, lots of workhorses in this source file. */ Index: dhcp-util.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-util.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-util.c 2002/02/03 16:56:00 1.3 --- dhcp-util.c 2002/02/05 02:00:59 1.4 *************** *** 213,217 **** { char *new_string; ! if(s2 == NULL) return(strdup(s1)); --- 213,220 ---- { char *new_string; ! ! if(s1 == NULL) ! return(strdup(s2)); ! if(s2 == NULL) return(strdup(s1)); |