1*7b5038d7SDag-Erling Smørgrav /* 2*7b5038d7SDag-Erling Smørgrav * str2host.c 3*7b5038d7SDag-Erling Smørgrav * 4*7b5038d7SDag-Erling Smørgrav * conversion routines from the presentation format 5*7b5038d7SDag-Erling Smørgrav * to the host format 6*7b5038d7SDag-Erling Smørgrav * 7*7b5038d7SDag-Erling Smørgrav * a Net::DNS like library for C 8*7b5038d7SDag-Erling Smørgrav * 9*7b5038d7SDag-Erling Smørgrav * (c) NLnet Labs, 2004-2006 10*7b5038d7SDag-Erling Smørgrav * 11*7b5038d7SDag-Erling Smørgrav * See the file LICENSE for the license 12*7b5038d7SDag-Erling Smørgrav */ 13*7b5038d7SDag-Erling Smørgrav #include <ldns/config.h> 14*7b5038d7SDag-Erling Smørgrav 15*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h> 16*7b5038d7SDag-Erling Smørgrav 17*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_SYS_SOCKET_H 18*7b5038d7SDag-Erling Smørgrav #include <sys/socket.h> 19*7b5038d7SDag-Erling Smørgrav #endif 20*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_ARPA_INET_H 21*7b5038d7SDag-Erling Smørgrav #include <arpa/inet.h> 22*7b5038d7SDag-Erling Smørgrav #endif 23*7b5038d7SDag-Erling Smørgrav #include <time.h> 24*7b5038d7SDag-Erling Smørgrav 25*7b5038d7SDag-Erling Smørgrav #include <errno.h> 26*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_NETDB_H 27*7b5038d7SDag-Erling Smørgrav #include <netdb.h> 28*7b5038d7SDag-Erling Smørgrav #endif 29*7b5038d7SDag-Erling Smørgrav 30*7b5038d7SDag-Erling Smørgrav #include <limits.h> 31*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_SYS_PARAM_H 32*7b5038d7SDag-Erling Smørgrav #include <sys/param.h> 33*7b5038d7SDag-Erling Smørgrav #endif 34*7b5038d7SDag-Erling Smørgrav 35*7b5038d7SDag-Erling Smørgrav ldns_status 36*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_int16(ldns_rdf **rd, const char *shortstr) 37*7b5038d7SDag-Erling Smørgrav { 38*7b5038d7SDag-Erling Smørgrav char *end = NULL; 39*7b5038d7SDag-Erling Smørgrav uint16_t *r; 40*7b5038d7SDag-Erling Smørgrav r = LDNS_MALLOC(uint16_t); 41*7b5038d7SDag-Erling Smørgrav if(!r) return LDNS_STATUS_MEM_ERR; 42*7b5038d7SDag-Erling Smørgrav 43*7b5038d7SDag-Erling Smørgrav *r = htons((uint16_t)strtol((char *)shortstr, &end, 10)); 44*7b5038d7SDag-Erling Smørgrav 45*7b5038d7SDag-Erling Smørgrav if(*end != 0) { 46*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 47*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_INT; 48*7b5038d7SDag-Erling Smørgrav } else { 49*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 50*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, sizeof(uint16_t), r); 51*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 52*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 53*7b5038d7SDag-Erling Smørgrav } 54*7b5038d7SDag-Erling Smørgrav } 55*7b5038d7SDag-Erling Smørgrav 56*7b5038d7SDag-Erling Smørgrav ldns_status 57*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_time(ldns_rdf **rd, const char *time) 58*7b5038d7SDag-Erling Smørgrav { 59*7b5038d7SDag-Erling Smørgrav /* convert a time YYYYDDMMHHMMSS to wireformat */ 60*7b5038d7SDag-Erling Smørgrav uint16_t *r = NULL; 61*7b5038d7SDag-Erling Smørgrav struct tm tm; 62*7b5038d7SDag-Erling Smørgrav uint32_t l; 63*7b5038d7SDag-Erling Smørgrav char *end; 64*7b5038d7SDag-Erling Smørgrav 65*7b5038d7SDag-Erling Smørgrav /* Try to scan the time... */ 66*7b5038d7SDag-Erling Smørgrav r = (uint16_t*)LDNS_MALLOC(uint32_t); 67*7b5038d7SDag-Erling Smørgrav if(!r) return LDNS_STATUS_MEM_ERR; 68*7b5038d7SDag-Erling Smørgrav 69*7b5038d7SDag-Erling Smørgrav memset(&tm, 0, sizeof(tm)); 70*7b5038d7SDag-Erling Smørgrav 71*7b5038d7SDag-Erling Smørgrav if (strlen(time) == 14 && 72*7b5038d7SDag-Erling Smørgrav sscanf(time, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6 73*7b5038d7SDag-Erling Smørgrav ) { 74*7b5038d7SDag-Erling Smørgrav tm.tm_year -= 1900; 75*7b5038d7SDag-Erling Smørgrav tm.tm_mon--; 76*7b5038d7SDag-Erling Smørgrav /* Check values */ 77*7b5038d7SDag-Erling Smørgrav if (tm.tm_year < 70) { 78*7b5038d7SDag-Erling Smørgrav goto bad_format; 79*7b5038d7SDag-Erling Smørgrav } 80*7b5038d7SDag-Erling Smørgrav if (tm.tm_mon < 0 || tm.tm_mon > 11) { 81*7b5038d7SDag-Erling Smørgrav goto bad_format; 82*7b5038d7SDag-Erling Smørgrav } 83*7b5038d7SDag-Erling Smørgrav if (tm.tm_mday < 1 || tm.tm_mday > 31) { 84*7b5038d7SDag-Erling Smørgrav goto bad_format; 85*7b5038d7SDag-Erling Smørgrav } 86*7b5038d7SDag-Erling Smørgrav 87*7b5038d7SDag-Erling Smørgrav if (tm.tm_hour < 0 || tm.tm_hour > 23) { 88*7b5038d7SDag-Erling Smørgrav goto bad_format; 89*7b5038d7SDag-Erling Smørgrav } 90*7b5038d7SDag-Erling Smørgrav 91*7b5038d7SDag-Erling Smørgrav if (tm.tm_min < 0 || tm.tm_min > 59) { 92*7b5038d7SDag-Erling Smørgrav goto bad_format; 93*7b5038d7SDag-Erling Smørgrav } 94*7b5038d7SDag-Erling Smørgrav 95*7b5038d7SDag-Erling Smørgrav if (tm.tm_sec < 0 || tm.tm_sec > 59) { 96*7b5038d7SDag-Erling Smørgrav goto bad_format; 97*7b5038d7SDag-Erling Smørgrav } 98*7b5038d7SDag-Erling Smørgrav 99*7b5038d7SDag-Erling Smørgrav l = htonl(mktime_from_utc(&tm)); 100*7b5038d7SDag-Erling Smørgrav memcpy(r, &l, sizeof(uint32_t)); 101*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 102*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TIME, sizeof(uint32_t), r); 103*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 104*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 105*7b5038d7SDag-Erling Smørgrav } else { 106*7b5038d7SDag-Erling Smørgrav /* handle it as 32 bits timestamp */ 107*7b5038d7SDag-Erling Smørgrav l = htonl((uint32_t)strtol((char*)time, &end, 10)); 108*7b5038d7SDag-Erling Smørgrav if(*end != 0) { 109*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 110*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 111*7b5038d7SDag-Erling Smørgrav } else { 112*7b5038d7SDag-Erling Smørgrav memcpy(r, &l, sizeof(uint32_t)); 113*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 114*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT32, sizeof(uint32_t), r); 115*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 116*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 117*7b5038d7SDag-Erling Smørgrav } 118*7b5038d7SDag-Erling Smørgrav } 119*7b5038d7SDag-Erling Smørgrav 120*7b5038d7SDag-Erling Smørgrav bad_format: 121*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 122*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_TIME; 123*7b5038d7SDag-Erling Smørgrav } 124*7b5038d7SDag-Erling Smørgrav 125*7b5038d7SDag-Erling Smørgrav ldns_status 126*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_nsec3_salt(ldns_rdf **rd, const char *salt_str) 127*7b5038d7SDag-Erling Smørgrav { 128*7b5038d7SDag-Erling Smørgrav uint8_t salt_length; 129*7b5038d7SDag-Erling Smørgrav int c; 130*7b5038d7SDag-Erling Smørgrav int salt_length_str; 131*7b5038d7SDag-Erling Smørgrav 132*7b5038d7SDag-Erling Smørgrav uint8_t *salt; 133*7b5038d7SDag-Erling Smørgrav uint8_t *data; 134*7b5038d7SDag-Erling Smørgrav if(rd == NULL) { 135*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_NULL; 136*7b5038d7SDag-Erling Smørgrav } 137*7b5038d7SDag-Erling Smørgrav 138*7b5038d7SDag-Erling Smørgrav salt_length_str = (int)strlen(salt_str); 139*7b5038d7SDag-Erling Smørgrav if (salt_length_str == 1 && salt_str[0] == '-') { 140*7b5038d7SDag-Erling Smørgrav salt_length_str = 0; 141*7b5038d7SDag-Erling Smørgrav } else if (salt_length_str % 2 != 0) { 142*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_HEX; 143*7b5038d7SDag-Erling Smørgrav } 144*7b5038d7SDag-Erling Smørgrav if (salt_length_str > 512) { 145*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_HEX; 146*7b5038d7SDag-Erling Smørgrav } 147*7b5038d7SDag-Erling Smørgrav 148*7b5038d7SDag-Erling Smørgrav salt = LDNS_XMALLOC(uint8_t, salt_length_str / 2); 149*7b5038d7SDag-Erling Smørgrav if(!salt) { 150*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 151*7b5038d7SDag-Erling Smørgrav } 152*7b5038d7SDag-Erling Smørgrav for (c = 0; c < salt_length_str; c += 2) { 153*7b5038d7SDag-Erling Smørgrav if (isxdigit((int) salt_str[c]) && isxdigit((int) salt_str[c+1])) { 154*7b5038d7SDag-Erling Smørgrav salt[c/2] = (uint8_t) ldns_hexdigit_to_int(salt_str[c]) * 16 + 155*7b5038d7SDag-Erling Smørgrav ldns_hexdigit_to_int(salt_str[c+1]); 156*7b5038d7SDag-Erling Smørgrav } else { 157*7b5038d7SDag-Erling Smørgrav LDNS_FREE(salt); 158*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_HEX; 159*7b5038d7SDag-Erling Smørgrav } 160*7b5038d7SDag-Erling Smørgrav } 161*7b5038d7SDag-Erling Smørgrav salt_length = (uint8_t) (salt_length_str / 2); 162*7b5038d7SDag-Erling Smørgrav 163*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, 1 + salt_length); 164*7b5038d7SDag-Erling Smørgrav if(!data) { 165*7b5038d7SDag-Erling Smørgrav LDNS_FREE(salt); 166*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 167*7b5038d7SDag-Erling Smørgrav } 168*7b5038d7SDag-Erling Smørgrav data[0] = salt_length; 169*7b5038d7SDag-Erling Smørgrav memcpy(&data[1], salt, salt_length); 170*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_NSEC3_SALT, 1 + salt_length, data); 171*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 172*7b5038d7SDag-Erling Smørgrav LDNS_FREE(salt); 173*7b5038d7SDag-Erling Smørgrav 174*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 175*7b5038d7SDag-Erling Smørgrav } 176*7b5038d7SDag-Erling Smørgrav 177*7b5038d7SDag-Erling Smørgrav ldns_status 178*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_period(ldns_rdf **rd,const char *period) 179*7b5038d7SDag-Erling Smørgrav { 180*7b5038d7SDag-Erling Smørgrav uint32_t p; 181*7b5038d7SDag-Erling Smørgrav const char *end; 182*7b5038d7SDag-Erling Smørgrav 183*7b5038d7SDag-Erling Smørgrav /* Allocate required space... */ 184*7b5038d7SDag-Erling Smørgrav p = ldns_str2period(period, &end); 185*7b5038d7SDag-Erling Smørgrav 186*7b5038d7SDag-Erling Smørgrav if (*end != 0) { 187*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 188*7b5038d7SDag-Erling Smørgrav } else { 189*7b5038d7SDag-Erling Smørgrav p = (uint32_t) htonl(p); 190*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 191*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_PERIOD, sizeof(uint32_t), &p); 192*7b5038d7SDag-Erling Smørgrav } 193*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 194*7b5038d7SDag-Erling Smørgrav } 195*7b5038d7SDag-Erling Smørgrav 196*7b5038d7SDag-Erling Smørgrav ldns_status 197*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_int32(ldns_rdf **rd, const char *longstr) 198*7b5038d7SDag-Erling Smørgrav { 199*7b5038d7SDag-Erling Smørgrav char *end; 200*7b5038d7SDag-Erling Smørgrav uint16_t *r = NULL; 201*7b5038d7SDag-Erling Smørgrav uint32_t l; 202*7b5038d7SDag-Erling Smørgrav 203*7b5038d7SDag-Erling Smørgrav r = (uint16_t*)LDNS_MALLOC(uint32_t); 204*7b5038d7SDag-Erling Smørgrav if(!r) return LDNS_STATUS_MEM_ERR; 205*7b5038d7SDag-Erling Smørgrav errno = 0; /* must set to zero before call, 206*7b5038d7SDag-Erling Smørgrav note race condition on errno */ 207*7b5038d7SDag-Erling Smørgrav if(*longstr == '-') 208*7b5038d7SDag-Erling Smørgrav l = htonl((uint32_t)strtol((char*)longstr, &end, 10)); 209*7b5038d7SDag-Erling Smørgrav else l = htonl((uint32_t)strtoul((char*)longstr, &end, 10)); 210*7b5038d7SDag-Erling Smørgrav 211*7b5038d7SDag-Erling Smørgrav if(*end != 0) { 212*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 213*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 214*7b5038d7SDag-Erling Smørgrav } else { 215*7b5038d7SDag-Erling Smørgrav if (errno == ERANGE) { 216*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 217*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_INTEGER_OVERFLOW; 218*7b5038d7SDag-Erling Smørgrav } 219*7b5038d7SDag-Erling Smørgrav memcpy(r, &l, sizeof(uint32_t)); 220*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 221*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT32, sizeof(uint32_t), r); 222*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 223*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 224*7b5038d7SDag-Erling Smørgrav } 225*7b5038d7SDag-Erling Smørgrav } 226*7b5038d7SDag-Erling Smørgrav 227*7b5038d7SDag-Erling Smørgrav ldns_status 228*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_int8(ldns_rdf **rd, const char *bytestr) 229*7b5038d7SDag-Erling Smørgrav { 230*7b5038d7SDag-Erling Smørgrav char *end; 231*7b5038d7SDag-Erling Smørgrav uint8_t *r = NULL; 232*7b5038d7SDag-Erling Smørgrav 233*7b5038d7SDag-Erling Smørgrav r = LDNS_MALLOC(uint8_t); 234*7b5038d7SDag-Erling Smørgrav if(!r) return LDNS_STATUS_MEM_ERR; 235*7b5038d7SDag-Erling Smørgrav 236*7b5038d7SDag-Erling Smørgrav *r = (uint8_t)strtol((char*)bytestr, &end, 10); 237*7b5038d7SDag-Erling Smørgrav 238*7b5038d7SDag-Erling Smørgrav if(*end != 0) { 239*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 240*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 241*7b5038d7SDag-Erling Smørgrav } else { 242*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 243*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, sizeof(uint8_t), r); 244*7b5038d7SDag-Erling Smørgrav LDNS_FREE(r); 245*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 246*7b5038d7SDag-Erling Smørgrav } 247*7b5038d7SDag-Erling Smørgrav } 248*7b5038d7SDag-Erling Smørgrav 249*7b5038d7SDag-Erling Smørgrav 250*7b5038d7SDag-Erling Smørgrav /* 251*7b5038d7SDag-Erling Smørgrav * Checks whether the escaped value at **s is an octal value or 252*7b5038d7SDag-Erling Smørgrav * a 'normally' escaped character (and not eos) 253*7b5038d7SDag-Erling Smørgrav * 254*7b5038d7SDag-Erling Smørgrav * The string pointer at *s is increased by either 0 (on error), 1 (on 255*7b5038d7SDag-Erling Smørgrav * normal escapes), or 3 (on octals) 256*7b5038d7SDag-Erling Smørgrav * 257*7b5038d7SDag-Erling Smørgrav * Returns the number of bytes read from the escaped string, or 258*7b5038d7SDag-Erling Smørgrav * 0 on error 259*7b5038d7SDag-Erling Smørgrav */ 260*7b5038d7SDag-Erling Smørgrav static int 261*7b5038d7SDag-Erling Smørgrav parse_escape(uint8_t *s, uint8_t *q) { 262*7b5038d7SDag-Erling Smørgrav uint16_t val; 263*7b5038d7SDag-Erling Smørgrav if (strlen((char *)s) > 3 && 264*7b5038d7SDag-Erling Smørgrav isdigit((int) s[1]) && 265*7b5038d7SDag-Erling Smørgrav isdigit((int) s[2]) && 266*7b5038d7SDag-Erling Smørgrav isdigit((int) s[3])) { 267*7b5038d7SDag-Erling Smørgrav /* cast this so it fits */ 268*7b5038d7SDag-Erling Smørgrav val = (uint16_t) ldns_hexdigit_to_int((char) s[1]) * 100 + 269*7b5038d7SDag-Erling Smørgrav ldns_hexdigit_to_int((char) s[2]) * 10 + 270*7b5038d7SDag-Erling Smørgrav ldns_hexdigit_to_int((char) s[3]); 271*7b5038d7SDag-Erling Smørgrav if (val > 255) { 272*7b5038d7SDag-Erling Smørgrav /* outside range */ 273*7b5038d7SDag-Erling Smørgrav return 0; 274*7b5038d7SDag-Erling Smørgrav } 275*7b5038d7SDag-Erling Smørgrav *q = (uint8_t) val; 276*7b5038d7SDag-Erling Smørgrav return 3; 277*7b5038d7SDag-Erling Smørgrav } else { 278*7b5038d7SDag-Erling Smørgrav s++; 279*7b5038d7SDag-Erling Smørgrav if (*s == '\0' || isdigit((int) *s)) { 280*7b5038d7SDag-Erling Smørgrav /* apparently the string terminator 281*7b5038d7SDag-Erling Smørgrav * or a digit has been escaped... 282*7b5038d7SDag-Erling Smørgrav */ 283*7b5038d7SDag-Erling Smørgrav return 0; 284*7b5038d7SDag-Erling Smørgrav } 285*7b5038d7SDag-Erling Smørgrav *q = *s; 286*7b5038d7SDag-Erling Smørgrav return 1; 287*7b5038d7SDag-Erling Smørgrav } 288*7b5038d7SDag-Erling Smørgrav } 289*7b5038d7SDag-Erling Smørgrav 290*7b5038d7SDag-Erling Smørgrav /* 291*7b5038d7SDag-Erling Smørgrav * No special care is taken, all dots are translated into 292*7b5038d7SDag-Erling Smørgrav * label seperators. 293*7b5038d7SDag-Erling Smørgrav * Could be made more efficient....we do 3 memcpy's in total... 294*7b5038d7SDag-Erling Smørgrav */ 295*7b5038d7SDag-Erling Smørgrav ldns_status 296*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_dname(ldns_rdf **d, const char *str) 297*7b5038d7SDag-Erling Smørgrav { 298*7b5038d7SDag-Erling Smørgrav size_t len; 299*7b5038d7SDag-Erling Smørgrav 300*7b5038d7SDag-Erling Smørgrav int esc; 301*7b5038d7SDag-Erling Smørgrav uint8_t *s, *q, *pq, label_len; 302*7b5038d7SDag-Erling Smørgrav uint8_t buf[LDNS_MAX_DOMAINLEN + 1]; 303*7b5038d7SDag-Erling Smørgrav *d = NULL; 304*7b5038d7SDag-Erling Smørgrav 305*7b5038d7SDag-Erling Smørgrav len = strlen((char*)str); 306*7b5038d7SDag-Erling Smørgrav /* octet representation can make strings a lot longer than actual length */ 307*7b5038d7SDag-Erling Smørgrav if (len > LDNS_MAX_DOMAINLEN * 4) { 308*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_DOMAINNAME_OVERFLOW; 309*7b5038d7SDag-Erling Smørgrav } 310*7b5038d7SDag-Erling Smørgrav if (0 == len) { 311*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_DOMAINNAME_UNDERFLOW; 312*7b5038d7SDag-Erling Smørgrav } 313*7b5038d7SDag-Erling Smørgrav 314*7b5038d7SDag-Erling Smørgrav /* root label */ 315*7b5038d7SDag-Erling Smørgrav if (1 == len && *str == '.') { 316*7b5038d7SDag-Erling Smørgrav *d = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, 1, "\0"); 317*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_OK; 318*7b5038d7SDag-Erling Smørgrav } 319*7b5038d7SDag-Erling Smørgrav 320*7b5038d7SDag-Erling Smørgrav /* get on with the rest */ 321*7b5038d7SDag-Erling Smørgrav 322*7b5038d7SDag-Erling Smørgrav /* s is on the current character in the string 323*7b5038d7SDag-Erling Smørgrav * pq points to where the labellength is going to go 324*7b5038d7SDag-Erling Smørgrav * label_len keeps track of the current label's length 325*7b5038d7SDag-Erling Smørgrav * q builds the dname inside the buf array 326*7b5038d7SDag-Erling Smørgrav */ 327*7b5038d7SDag-Erling Smørgrav len = 0; 328*7b5038d7SDag-Erling Smørgrav q = buf+1; 329*7b5038d7SDag-Erling Smørgrav pq = buf; 330*7b5038d7SDag-Erling Smørgrav label_len = 0; 331*7b5038d7SDag-Erling Smørgrav for (s = (uint8_t *)str; *s; s++, q++) { 332*7b5038d7SDag-Erling Smørgrav if (q > buf + LDNS_MAX_DOMAINLEN) { 333*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_DOMAINNAME_OVERFLOW; 334*7b5038d7SDag-Erling Smørgrav } 335*7b5038d7SDag-Erling Smørgrav *q = 0; 336*7b5038d7SDag-Erling Smørgrav switch (*s) { 337*7b5038d7SDag-Erling Smørgrav case '.': 338*7b5038d7SDag-Erling Smørgrav if (label_len > LDNS_MAX_LABELLEN) { 339*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_LABEL_OVERFLOW; 340*7b5038d7SDag-Erling Smørgrav } 341*7b5038d7SDag-Erling Smørgrav if (label_len == 0) { 342*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_EMPTY_LABEL; 343*7b5038d7SDag-Erling Smørgrav } 344*7b5038d7SDag-Erling Smørgrav len += label_len + 1; 345*7b5038d7SDag-Erling Smørgrav *pq = label_len; 346*7b5038d7SDag-Erling Smørgrav label_len = 0; 347*7b5038d7SDag-Erling Smørgrav pq = q; 348*7b5038d7SDag-Erling Smørgrav break; 349*7b5038d7SDag-Erling Smørgrav case '\\': 350*7b5038d7SDag-Erling Smørgrav /* octet value or literal char */ 351*7b5038d7SDag-Erling Smørgrav esc = parse_escape(s, q); 352*7b5038d7SDag-Erling Smørgrav if (esc > 0) { 353*7b5038d7SDag-Erling Smørgrav s += esc; 354*7b5038d7SDag-Erling Smørgrav label_len++; 355*7b5038d7SDag-Erling Smørgrav } else { 356*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_BAD_ESCAPE; 357*7b5038d7SDag-Erling Smørgrav } 358*7b5038d7SDag-Erling Smørgrav break; 359*7b5038d7SDag-Erling Smørgrav default: 360*7b5038d7SDag-Erling Smørgrav *q = *s; 361*7b5038d7SDag-Erling Smørgrav label_len++; 362*7b5038d7SDag-Erling Smørgrav } 363*7b5038d7SDag-Erling Smørgrav } 364*7b5038d7SDag-Erling Smørgrav 365*7b5038d7SDag-Erling Smørgrav /* add root label if last char was not '.' */ 366*7b5038d7SDag-Erling Smørgrav if (!ldns_dname_str_absolute(str)) { 367*7b5038d7SDag-Erling Smørgrav if (q > buf + LDNS_MAX_DOMAINLEN) { 368*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_DOMAINNAME_OVERFLOW; 369*7b5038d7SDag-Erling Smørgrav } 370*7b5038d7SDag-Erling Smørgrav if (label_len > LDNS_MAX_LABELLEN) { 371*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_LABEL_OVERFLOW; 372*7b5038d7SDag-Erling Smørgrav } 373*7b5038d7SDag-Erling Smørgrav if (label_len == 0) { /* label_len 0 but not . at end? */ 374*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_EMPTY_LABEL; 375*7b5038d7SDag-Erling Smørgrav } 376*7b5038d7SDag-Erling Smørgrav len += label_len + 1; 377*7b5038d7SDag-Erling Smørgrav *pq = label_len; 378*7b5038d7SDag-Erling Smørgrav *q = 0; 379*7b5038d7SDag-Erling Smørgrav } 380*7b5038d7SDag-Erling Smørgrav len++; 381*7b5038d7SDag-Erling Smørgrav 382*7b5038d7SDag-Erling Smørgrav *d = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, len, buf); 383*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_OK; 384*7b5038d7SDag-Erling Smørgrav } 385*7b5038d7SDag-Erling Smørgrav 386*7b5038d7SDag-Erling Smørgrav ldns_status 387*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_a(ldns_rdf **rd, const char *str) 388*7b5038d7SDag-Erling Smørgrav { 389*7b5038d7SDag-Erling Smørgrav in_addr_t address; 390*7b5038d7SDag-Erling Smørgrav if (inet_pton(AF_INET, (char*)str, &address) != 1) { 391*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_IP4; 392*7b5038d7SDag-Erling Smørgrav } else { 393*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 394*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_A, sizeof(address), &address); 395*7b5038d7SDag-Erling Smørgrav } 396*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 397*7b5038d7SDag-Erling Smørgrav } 398*7b5038d7SDag-Erling Smørgrav 399*7b5038d7SDag-Erling Smørgrav ldns_status 400*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_aaaa(ldns_rdf **rd, const char *str) 401*7b5038d7SDag-Erling Smørgrav { 402*7b5038d7SDag-Erling Smørgrav uint8_t address[LDNS_IP6ADDRLEN + 1]; 403*7b5038d7SDag-Erling Smørgrav 404*7b5038d7SDag-Erling Smørgrav if (inet_pton(AF_INET6, (char*)str, address) != 1) { 405*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_IP6; 406*7b5038d7SDag-Erling Smørgrav } else { 407*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 408*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_AAAA, sizeof(address) - 1, &address); 409*7b5038d7SDag-Erling Smørgrav } 410*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 411*7b5038d7SDag-Erling Smørgrav } 412*7b5038d7SDag-Erling Smørgrav 413*7b5038d7SDag-Erling Smørgrav ldns_status 414*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_str(ldns_rdf **rd, const char *str) 415*7b5038d7SDag-Erling Smørgrav { 416*7b5038d7SDag-Erling Smørgrav uint8_t *data; 417*7b5038d7SDag-Erling Smørgrav size_t i, str_i, esc_i; 418*7b5038d7SDag-Erling Smørgrav 419*7b5038d7SDag-Erling Smørgrav if (strlen(str) > 255) { 420*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 421*7b5038d7SDag-Erling Smørgrav } 422*7b5038d7SDag-Erling Smørgrav 423*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, strlen(str) + 1); 424*7b5038d7SDag-Erling Smørgrav if(!data) return LDNS_STATUS_MEM_ERR; 425*7b5038d7SDag-Erling Smørgrav i = 1; 426*7b5038d7SDag-Erling Smørgrav 427*7b5038d7SDag-Erling Smørgrav for (str_i = 0; str_i < strlen(str); str_i++) { 428*7b5038d7SDag-Erling Smørgrav if (str[str_i] == '\\') { 429*7b5038d7SDag-Erling Smørgrav /* octet value or literal char */ 430*7b5038d7SDag-Erling Smørgrav esc_i = (size_t) parse_escape((uint8_t*) &str[str_i], (uint8_t*) &data[i]); 431*7b5038d7SDag-Erling Smørgrav if (esc_i == 0) { 432*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 433*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_BAD_ESCAPE; 434*7b5038d7SDag-Erling Smørgrav } 435*7b5038d7SDag-Erling Smørgrav str_i += esc_i; 436*7b5038d7SDag-Erling Smørgrav } else { 437*7b5038d7SDag-Erling Smørgrav data[i] = (uint8_t) str[str_i]; 438*7b5038d7SDag-Erling Smørgrav } 439*7b5038d7SDag-Erling Smørgrav i++; 440*7b5038d7SDag-Erling Smørgrav } 441*7b5038d7SDag-Erling Smørgrav data[0] = i - 1; 442*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, i, data); 443*7b5038d7SDag-Erling Smørgrav 444*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 445*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 446*7b5038d7SDag-Erling Smørgrav } 447*7b5038d7SDag-Erling Smørgrav 448*7b5038d7SDag-Erling Smørgrav ldns_status 449*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_apl(ldns_rdf **rd, const char *str) 450*7b5038d7SDag-Erling Smørgrav { 451*7b5038d7SDag-Erling Smørgrav const char *my_str = str; 452*7b5038d7SDag-Erling Smørgrav 453*7b5038d7SDag-Erling Smørgrav char *my_ip_str; 454*7b5038d7SDag-Erling Smørgrav size_t ip_str_len; 455*7b5038d7SDag-Erling Smørgrav 456*7b5038d7SDag-Erling Smørgrav uint16_t family; 457*7b5038d7SDag-Erling Smørgrav bool negation; 458*7b5038d7SDag-Erling Smørgrav uint8_t afdlength = 0; 459*7b5038d7SDag-Erling Smørgrav uint8_t *afdpart; 460*7b5038d7SDag-Erling Smørgrav uint8_t prefix; 461*7b5038d7SDag-Erling Smørgrav 462*7b5038d7SDag-Erling Smørgrav uint8_t *data; 463*7b5038d7SDag-Erling Smørgrav 464*7b5038d7SDag-Erling Smørgrav size_t i = 0; 465*7b5038d7SDag-Erling Smørgrav 466*7b5038d7SDag-Erling Smørgrav /* [!]afi:address/prefix */ 467*7b5038d7SDag-Erling Smørgrav if (strlen(my_str) < 2 468*7b5038d7SDag-Erling Smørgrav || strchr(my_str, ':') == NULL 469*7b5038d7SDag-Erling Smørgrav || strchr(my_str, '/') == NULL 470*7b5038d7SDag-Erling Smørgrav || strchr(my_str, ':') > strchr(my_str, '/')) { 471*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 472*7b5038d7SDag-Erling Smørgrav } 473*7b5038d7SDag-Erling Smørgrav 474*7b5038d7SDag-Erling Smørgrav if (my_str[0] == '!') { 475*7b5038d7SDag-Erling Smørgrav negation = true; 476*7b5038d7SDag-Erling Smørgrav my_str += 1; 477*7b5038d7SDag-Erling Smørgrav } else { 478*7b5038d7SDag-Erling Smørgrav negation = false; 479*7b5038d7SDag-Erling Smørgrav } 480*7b5038d7SDag-Erling Smørgrav 481*7b5038d7SDag-Erling Smørgrav family = (uint16_t) atoi(my_str); 482*7b5038d7SDag-Erling Smørgrav 483*7b5038d7SDag-Erling Smørgrav my_str = strchr(my_str, ':') + 1; 484*7b5038d7SDag-Erling Smørgrav 485*7b5038d7SDag-Erling Smørgrav /* need ip addr and only ip addr for inet_pton */ 486*7b5038d7SDag-Erling Smørgrav ip_str_len = (size_t) (strchr(my_str, '/') - my_str); 487*7b5038d7SDag-Erling Smørgrav my_ip_str = LDNS_XMALLOC(char, ip_str_len + 1); 488*7b5038d7SDag-Erling Smørgrav if(!my_ip_str) return LDNS_STATUS_MEM_ERR; 489*7b5038d7SDag-Erling Smørgrav strncpy(my_ip_str, my_str, ip_str_len + 1); 490*7b5038d7SDag-Erling Smørgrav my_ip_str[ip_str_len] = '\0'; 491*7b5038d7SDag-Erling Smørgrav 492*7b5038d7SDag-Erling Smørgrav if (family == 1) { 493*7b5038d7SDag-Erling Smørgrav /* ipv4 */ 494*7b5038d7SDag-Erling Smørgrav afdpart = LDNS_XMALLOC(uint8_t, 4); 495*7b5038d7SDag-Erling Smørgrav if(!afdpart) { 496*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 497*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 498*7b5038d7SDag-Erling Smørgrav } 499*7b5038d7SDag-Erling Smørgrav if (inet_pton(AF_INET, my_ip_str, afdpart) == 0) { 500*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 501*7b5038d7SDag-Erling Smørgrav LDNS_FREE(afdpart); 502*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 503*7b5038d7SDag-Erling Smørgrav } 504*7b5038d7SDag-Erling Smørgrav for (i = 0; i < 4; i++) { 505*7b5038d7SDag-Erling Smørgrav if (afdpart[i] != 0) { 506*7b5038d7SDag-Erling Smørgrav afdlength = i + 1; 507*7b5038d7SDag-Erling Smørgrav } 508*7b5038d7SDag-Erling Smørgrav } 509*7b5038d7SDag-Erling Smørgrav } else if (family == 2) { 510*7b5038d7SDag-Erling Smørgrav /* ipv6 */ 511*7b5038d7SDag-Erling Smørgrav afdpart = LDNS_XMALLOC(uint8_t, 16); 512*7b5038d7SDag-Erling Smørgrav if(!afdpart) { 513*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 514*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 515*7b5038d7SDag-Erling Smørgrav } 516*7b5038d7SDag-Erling Smørgrav if (inet_pton(AF_INET6, my_ip_str, afdpart) == 0) { 517*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 518*7b5038d7SDag-Erling Smørgrav LDNS_FREE(afdpart); 519*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 520*7b5038d7SDag-Erling Smørgrav } 521*7b5038d7SDag-Erling Smørgrav for (i = 0; i < 16; i++) { 522*7b5038d7SDag-Erling Smørgrav if (afdpart[i] != 0) { 523*7b5038d7SDag-Erling Smørgrav afdlength = i + 1; 524*7b5038d7SDag-Erling Smørgrav } 525*7b5038d7SDag-Erling Smørgrav } 526*7b5038d7SDag-Erling Smørgrav } else { 527*7b5038d7SDag-Erling Smørgrav /* unknown family */ 528*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 529*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 530*7b5038d7SDag-Erling Smørgrav } 531*7b5038d7SDag-Erling Smørgrav 532*7b5038d7SDag-Erling Smørgrav my_str = strchr(my_str, '/') + 1; 533*7b5038d7SDag-Erling Smørgrav prefix = (uint8_t) atoi(my_str); 534*7b5038d7SDag-Erling Smørgrav 535*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, 4 + afdlength); 536*7b5038d7SDag-Erling Smørgrav if(!data) { 537*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 538*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 539*7b5038d7SDag-Erling Smørgrav } 540*7b5038d7SDag-Erling Smørgrav ldns_write_uint16(data, family); 541*7b5038d7SDag-Erling Smørgrav data[2] = prefix; 542*7b5038d7SDag-Erling Smørgrav data[3] = afdlength; 543*7b5038d7SDag-Erling Smørgrav if (negation) { 544*7b5038d7SDag-Erling Smørgrav /* set bit 1 of byte 3 */ 545*7b5038d7SDag-Erling Smørgrav data[3] = data[3] | 0x80; 546*7b5038d7SDag-Erling Smørgrav } 547*7b5038d7SDag-Erling Smørgrav 548*7b5038d7SDag-Erling Smørgrav memcpy(data + 4, afdpart, afdlength); 549*7b5038d7SDag-Erling Smørgrav 550*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_APL, afdlength + 4, data); 551*7b5038d7SDag-Erling Smørgrav LDNS_FREE(afdpart); 552*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 553*7b5038d7SDag-Erling Smørgrav LDNS_FREE(my_ip_str); 554*7b5038d7SDag-Erling Smørgrav 555*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 556*7b5038d7SDag-Erling Smørgrav } 557*7b5038d7SDag-Erling Smørgrav 558*7b5038d7SDag-Erling Smørgrav ldns_status 559*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_b64(ldns_rdf **rd, const char *str) 560*7b5038d7SDag-Erling Smørgrav { 561*7b5038d7SDag-Erling Smørgrav uint8_t *buffer; 562*7b5038d7SDag-Erling Smørgrav int16_t i; 563*7b5038d7SDag-Erling Smørgrav 564*7b5038d7SDag-Erling Smørgrav buffer = LDNS_XMALLOC(uint8_t, ldns_b64_ntop_calculate_size(strlen(str))); 565*7b5038d7SDag-Erling Smørgrav if(!buffer) { 566*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 567*7b5038d7SDag-Erling Smørgrav } 568*7b5038d7SDag-Erling Smørgrav 569*7b5038d7SDag-Erling Smørgrav i = (uint16_t)ldns_b64_pton((const char*)str, buffer, 570*7b5038d7SDag-Erling Smørgrav ldns_b64_ntop_calculate_size(strlen(str))); 571*7b5038d7SDag-Erling Smørgrav if (-1 == i) { 572*7b5038d7SDag-Erling Smørgrav LDNS_FREE(buffer); 573*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_B64; 574*7b5038d7SDag-Erling Smørgrav } else { 575*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 576*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_B64, (uint16_t) i, buffer); 577*7b5038d7SDag-Erling Smørgrav } 578*7b5038d7SDag-Erling Smørgrav LDNS_FREE(buffer); 579*7b5038d7SDag-Erling Smørgrav 580*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 581*7b5038d7SDag-Erling Smørgrav } 582*7b5038d7SDag-Erling Smørgrav 583*7b5038d7SDag-Erling Smørgrav ldns_status 584*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_b32_ext(ldns_rdf **rd, const char *str) 585*7b5038d7SDag-Erling Smørgrav { 586*7b5038d7SDag-Erling Smørgrav uint8_t *buffer; 587*7b5038d7SDag-Erling Smørgrav int i; 588*7b5038d7SDag-Erling Smørgrav /* first byte contains length of actual b32 data */ 589*7b5038d7SDag-Erling Smørgrav uint8_t len = ldns_b32_pton_calculate_size(strlen(str)); 590*7b5038d7SDag-Erling Smørgrav buffer = LDNS_XMALLOC(uint8_t, len + 1); 591*7b5038d7SDag-Erling Smørgrav if(!buffer) { 592*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 593*7b5038d7SDag-Erling Smørgrav } 594*7b5038d7SDag-Erling Smørgrav buffer[0] = len; 595*7b5038d7SDag-Erling Smørgrav 596*7b5038d7SDag-Erling Smørgrav i = ldns_b32_pton_extended_hex((const char*)str, strlen(str), buffer + 1, 597*7b5038d7SDag-Erling Smørgrav ldns_b32_ntop_calculate_size(strlen(str))); 598*7b5038d7SDag-Erling Smørgrav if (i < 0) { 599*7b5038d7SDag-Erling Smørgrav LDNS_FREE(buffer); 600*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_B32_EXT; 601*7b5038d7SDag-Erling Smørgrav } else { 602*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 603*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_B32_EXT, (uint16_t) i + 1, buffer); 604*7b5038d7SDag-Erling Smørgrav } 605*7b5038d7SDag-Erling Smørgrav LDNS_FREE(buffer); 606*7b5038d7SDag-Erling Smørgrav 607*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 608*7b5038d7SDag-Erling Smørgrav } 609*7b5038d7SDag-Erling Smørgrav 610*7b5038d7SDag-Erling Smørgrav ldns_status 611*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_hex(ldns_rdf **rd, const char *str) 612*7b5038d7SDag-Erling Smørgrav { 613*7b5038d7SDag-Erling Smørgrav uint8_t *t, *t_orig; 614*7b5038d7SDag-Erling Smørgrav int i; 615*7b5038d7SDag-Erling Smørgrav size_t len; 616*7b5038d7SDag-Erling Smørgrav 617*7b5038d7SDag-Erling Smørgrav len = strlen(str); 618*7b5038d7SDag-Erling Smørgrav 619*7b5038d7SDag-Erling Smørgrav if (len > LDNS_MAX_RDFLEN * 2) { 620*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_LABEL_OVERFLOW; 621*7b5038d7SDag-Erling Smørgrav } else { 622*7b5038d7SDag-Erling Smørgrav t = LDNS_XMALLOC(uint8_t, (len / 2) + 1); 623*7b5038d7SDag-Erling Smørgrav if(!t) { 624*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 625*7b5038d7SDag-Erling Smørgrav } 626*7b5038d7SDag-Erling Smørgrav t_orig = t; 627*7b5038d7SDag-Erling Smørgrav /* Now process octet by octet... */ 628*7b5038d7SDag-Erling Smørgrav while (*str) { 629*7b5038d7SDag-Erling Smørgrav *t = 0; 630*7b5038d7SDag-Erling Smørgrav if (isspace((int) *str)) { 631*7b5038d7SDag-Erling Smørgrav str++; 632*7b5038d7SDag-Erling Smørgrav } else { 633*7b5038d7SDag-Erling Smørgrav for (i = 16; i >= 1; i -= 15) { 634*7b5038d7SDag-Erling Smørgrav while (*str && isspace((int) *str)) { str++; } 635*7b5038d7SDag-Erling Smørgrav if (*str) { 636*7b5038d7SDag-Erling Smørgrav if (isxdigit((int) *str)) { 637*7b5038d7SDag-Erling Smørgrav *t += ldns_hexdigit_to_int(*str) * i; 638*7b5038d7SDag-Erling Smørgrav } else { 639*7b5038d7SDag-Erling Smørgrav LDNS_FREE(t_orig); 640*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 641*7b5038d7SDag-Erling Smørgrav } 642*7b5038d7SDag-Erling Smørgrav ++str; 643*7b5038d7SDag-Erling Smørgrav } 644*7b5038d7SDag-Erling Smørgrav } 645*7b5038d7SDag-Erling Smørgrav ++t; 646*7b5038d7SDag-Erling Smørgrav } 647*7b5038d7SDag-Erling Smørgrav } 648*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, 649*7b5038d7SDag-Erling Smørgrav (size_t) (t - t_orig), 650*7b5038d7SDag-Erling Smørgrav t_orig); 651*7b5038d7SDag-Erling Smørgrav LDNS_FREE(t_orig); 652*7b5038d7SDag-Erling Smørgrav } 653*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 654*7b5038d7SDag-Erling Smørgrav } 655*7b5038d7SDag-Erling Smørgrav 656*7b5038d7SDag-Erling Smørgrav ldns_status 657*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_nsec(ldns_rdf **rd, const char *str) 658*7b5038d7SDag-Erling Smørgrav { 659*7b5038d7SDag-Erling Smørgrav const char *delimiters = "\n\t "; 660*7b5038d7SDag-Erling Smørgrav char *token = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); 661*7b5038d7SDag-Erling Smørgrav ldns_buffer *str_buf; 662*7b5038d7SDag-Erling Smørgrav ssize_t c; 663*7b5038d7SDag-Erling Smørgrav uint16_t cur_type; 664*7b5038d7SDag-Erling Smørgrav size_t type_count = 0; 665*7b5038d7SDag-Erling Smørgrav ldns_rr_type type_list[65536]; 666*7b5038d7SDag-Erling Smørgrav if(!token) return LDNS_STATUS_MEM_ERR; 667*7b5038d7SDag-Erling Smørgrav if(rd == NULL) { 668*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 669*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_NULL; 670*7b5038d7SDag-Erling Smørgrav } 671*7b5038d7SDag-Erling Smørgrav 672*7b5038d7SDag-Erling Smørgrav str_buf = LDNS_MALLOC(ldns_buffer); 673*7b5038d7SDag-Erling Smørgrav if(!str_buf) { 674*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 675*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 676*7b5038d7SDag-Erling Smørgrav } 677*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); 678*7b5038d7SDag-Erling Smørgrav if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { 679*7b5038d7SDag-Erling Smørgrav LDNS_FREE(str_buf); 680*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 681*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 682*7b5038d7SDag-Erling Smørgrav } 683*7b5038d7SDag-Erling Smørgrav 684*7b5038d7SDag-Erling Smørgrav while ((c = ldns_bget_token(str_buf, token, delimiters, LDNS_MAX_RDFLEN)) != -1 && c != 0) { 685*7b5038d7SDag-Erling Smørgrav if(type_count >= sizeof(type_list)) { 686*7b5038d7SDag-Erling Smørgrav LDNS_FREE(str_buf); 687*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 688*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 689*7b5038d7SDag-Erling Smørgrav } 690*7b5038d7SDag-Erling Smørgrav cur_type = ldns_get_rr_type_by_name(token); 691*7b5038d7SDag-Erling Smørgrav type_list[type_count] = cur_type; 692*7b5038d7SDag-Erling Smørgrav type_count++; 693*7b5038d7SDag-Erling Smørgrav } 694*7b5038d7SDag-Erling Smørgrav 695*7b5038d7SDag-Erling Smørgrav *rd = ldns_dnssec_create_nsec_bitmap(type_list, 696*7b5038d7SDag-Erling Smørgrav type_count, 697*7b5038d7SDag-Erling Smørgrav LDNS_RR_TYPE_NSEC); 698*7b5038d7SDag-Erling Smørgrav 699*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 700*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 701*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 702*7b5038d7SDag-Erling Smørgrav } 703*7b5038d7SDag-Erling Smørgrav 704*7b5038d7SDag-Erling Smørgrav ldns_status 705*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_type(ldns_rdf **rd, const char *str) 706*7b5038d7SDag-Erling Smørgrav { 707*7b5038d7SDag-Erling Smørgrav uint16_t type; 708*7b5038d7SDag-Erling Smørgrav type = htons(ldns_get_rr_type_by_name(str)); 709*7b5038d7SDag-Erling Smørgrav /* ldns_rr_type is a 16 bit value */ 710*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 711*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TYPE, sizeof(uint16_t), &type); 712*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 713*7b5038d7SDag-Erling Smørgrav } 714*7b5038d7SDag-Erling Smørgrav 715*7b5038d7SDag-Erling Smørgrav ldns_status 716*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_class(ldns_rdf **rd, const char *str) 717*7b5038d7SDag-Erling Smørgrav { 718*7b5038d7SDag-Erling Smørgrav uint16_t klass; 719*7b5038d7SDag-Erling Smørgrav klass = htons(ldns_get_rr_class_by_name(str)); 720*7b5038d7SDag-Erling Smørgrav /* class is 16 bit */ 721*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 722*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_CLASS, sizeof(uint16_t), &klass); 723*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 724*7b5038d7SDag-Erling Smørgrav } 725*7b5038d7SDag-Erling Smørgrav 726*7b5038d7SDag-Erling Smørgrav /* An certificate alg field can either be specified as a 8 bits number 727*7b5038d7SDag-Erling Smørgrav * or by its symbolic name. Handle both 728*7b5038d7SDag-Erling Smørgrav */ 729*7b5038d7SDag-Erling Smørgrav ldns_status 730*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_cert_alg(ldns_rdf **rd, const char *str) 731*7b5038d7SDag-Erling Smørgrav { 732*7b5038d7SDag-Erling Smørgrav ldns_lookup_table *lt; 733*7b5038d7SDag-Erling Smørgrav ldns_status st; 734*7b5038d7SDag-Erling Smørgrav uint8_t idd[2]; 735*7b5038d7SDag-Erling Smørgrav lt = ldns_lookup_by_name(ldns_cert_algorithms, str); 736*7b5038d7SDag-Erling Smørgrav st = LDNS_STATUS_OK; 737*7b5038d7SDag-Erling Smørgrav 738*7b5038d7SDag-Erling Smørgrav if (lt) { 739*7b5038d7SDag-Erling Smørgrav ldns_write_uint16(idd, (uint16_t) lt->id); 740*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 741*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, sizeof(uint16_t), idd); 742*7b5038d7SDag-Erling Smørgrav if (!*rd) { 743*7b5038d7SDag-Erling Smørgrav st = LDNS_STATUS_ERR; 744*7b5038d7SDag-Erling Smørgrav } 745*7b5038d7SDag-Erling Smørgrav } else { 746*7b5038d7SDag-Erling Smørgrav /* try as-is (a number) */ 747*7b5038d7SDag-Erling Smørgrav st = ldns_str2rdf_int16(rd, str); 748*7b5038d7SDag-Erling Smørgrav if (st == LDNS_STATUS_OK && 749*7b5038d7SDag-Erling Smørgrav ldns_rdf2native_int16(*rd) == 0) { 750*7b5038d7SDag-Erling Smørgrav st = LDNS_STATUS_CERT_BAD_ALGORITHM; 751*7b5038d7SDag-Erling Smørgrav } 752*7b5038d7SDag-Erling Smørgrav } 753*7b5038d7SDag-Erling Smørgrav 754*7b5038d7SDag-Erling Smørgrav return st; 755*7b5038d7SDag-Erling Smørgrav } 756*7b5038d7SDag-Erling Smørgrav 757*7b5038d7SDag-Erling Smørgrav /* An alg field can either be specified as a 8 bits number 758*7b5038d7SDag-Erling Smørgrav * or by its symbolic name. Handle both 759*7b5038d7SDag-Erling Smørgrav */ 760*7b5038d7SDag-Erling Smørgrav ldns_status 761*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_alg(ldns_rdf **rd, const char *str) 762*7b5038d7SDag-Erling Smørgrav { 763*7b5038d7SDag-Erling Smørgrav ldns_lookup_table *lt; 764*7b5038d7SDag-Erling Smørgrav ldns_status st; 765*7b5038d7SDag-Erling Smørgrav 766*7b5038d7SDag-Erling Smørgrav lt = ldns_lookup_by_name(ldns_algorithms, str); 767*7b5038d7SDag-Erling Smørgrav st = LDNS_STATUS_OK; 768*7b5038d7SDag-Erling Smørgrav 769*7b5038d7SDag-Erling Smørgrav if (lt) { 770*7b5038d7SDag-Erling Smørgrav /* it was given as a integer */ 771*7b5038d7SDag-Erling Smørgrav *rd = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t) lt->id); 772*7b5038d7SDag-Erling Smørgrav if (!*rd) { 773*7b5038d7SDag-Erling Smørgrav st = LDNS_STATUS_ERR; 774*7b5038d7SDag-Erling Smørgrav } 775*7b5038d7SDag-Erling Smørgrav } else { 776*7b5038d7SDag-Erling Smørgrav /* try as-is (a number) */ 777*7b5038d7SDag-Erling Smørgrav st = ldns_str2rdf_int8(rd, str); 778*7b5038d7SDag-Erling Smørgrav } 779*7b5038d7SDag-Erling Smørgrav return st; 780*7b5038d7SDag-Erling Smørgrav } 781*7b5038d7SDag-Erling Smørgrav 782*7b5038d7SDag-Erling Smørgrav ldns_status 783*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_unknown( ATTR_UNUSED(ldns_rdf **rd) 784*7b5038d7SDag-Erling Smørgrav , ATTR_UNUSED(const char *str) 785*7b5038d7SDag-Erling Smørgrav ) 786*7b5038d7SDag-Erling Smørgrav { 787*7b5038d7SDag-Erling Smørgrav /* this should be caught in an earlier time (general str2host for 788*7b5038d7SDag-Erling Smørgrav rr's */ 789*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_NOT_IMPL; 790*7b5038d7SDag-Erling Smørgrav } 791*7b5038d7SDag-Erling Smørgrav 792*7b5038d7SDag-Erling Smørgrav ldns_status 793*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_tsig( ATTR_UNUSED(ldns_rdf **rd) 794*7b5038d7SDag-Erling Smørgrav , ATTR_UNUSED(const char *str) 795*7b5038d7SDag-Erling Smørgrav ) 796*7b5038d7SDag-Erling Smørgrav { 797*7b5038d7SDag-Erling Smørgrav /* there is no string representation for TSIG rrs */ 798*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_NOT_IMPL; 799*7b5038d7SDag-Erling Smørgrav } 800*7b5038d7SDag-Erling Smørgrav 801*7b5038d7SDag-Erling Smørgrav ldns_status 802*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_service( ATTR_UNUSED(ldns_rdf **rd) 803*7b5038d7SDag-Erling Smørgrav , ATTR_UNUSED(const char *str) 804*7b5038d7SDag-Erling Smørgrav ) 805*7b5038d7SDag-Erling Smørgrav { 806*7b5038d7SDag-Erling Smørgrav /* is this used? is this actually WKS? or SRV? */ 807*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_NOT_IMPL; 808*7b5038d7SDag-Erling Smørgrav } 809*7b5038d7SDag-Erling Smørgrav 810*7b5038d7SDag-Erling Smørgrav static int 811*7b5038d7SDag-Erling Smørgrav loc_parse_cm(char* my_str, char** endstr, uint8_t* m, uint8_t* e) 812*7b5038d7SDag-Erling Smørgrav { 813*7b5038d7SDag-Erling Smørgrav /* read <digits>[.<digits>][mM] */ 814*7b5038d7SDag-Erling Smørgrav /* into mantissa exponent format for LOC type */ 815*7b5038d7SDag-Erling Smørgrav uint32_t meters = 0, cm = 0, val; 816*7b5038d7SDag-Erling Smørgrav while (isblank(*my_str)) { 817*7b5038d7SDag-Erling Smørgrav my_str++; 818*7b5038d7SDag-Erling Smørgrav } 819*7b5038d7SDag-Erling Smørgrav meters = (uint32_t)strtol(my_str, &my_str, 10); 820*7b5038d7SDag-Erling Smørgrav if (*my_str == '.') { 821*7b5038d7SDag-Erling Smørgrav my_str++; 822*7b5038d7SDag-Erling Smørgrav cm = (uint32_t)strtol(my_str, &my_str, 10); 823*7b5038d7SDag-Erling Smørgrav } 824*7b5038d7SDag-Erling Smørgrav if (meters >= 1) { 825*7b5038d7SDag-Erling Smørgrav *e = 2; 826*7b5038d7SDag-Erling Smørgrav val = meters; 827*7b5038d7SDag-Erling Smørgrav } else { 828*7b5038d7SDag-Erling Smørgrav *e = 0; 829*7b5038d7SDag-Erling Smørgrav val = cm; 830*7b5038d7SDag-Erling Smørgrav } 831*7b5038d7SDag-Erling Smørgrav while(val >= 10) { 832*7b5038d7SDag-Erling Smørgrav (*e)++; 833*7b5038d7SDag-Erling Smørgrav val /= 10; 834*7b5038d7SDag-Erling Smørgrav } 835*7b5038d7SDag-Erling Smørgrav *m = (uint8_t)val; 836*7b5038d7SDag-Erling Smørgrav 837*7b5038d7SDag-Erling Smørgrav if (*e > 9) 838*7b5038d7SDag-Erling Smørgrav return 0; 839*7b5038d7SDag-Erling Smørgrav if (*my_str == 'm' || *my_str == 'M') { 840*7b5038d7SDag-Erling Smørgrav my_str++; 841*7b5038d7SDag-Erling Smørgrav } 842*7b5038d7SDag-Erling Smørgrav *endstr = my_str; 843*7b5038d7SDag-Erling Smørgrav return 1; 844*7b5038d7SDag-Erling Smørgrav } 845*7b5038d7SDag-Erling Smørgrav 846*7b5038d7SDag-Erling Smørgrav ldns_status 847*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_loc(ldns_rdf **rd, const char *str) 848*7b5038d7SDag-Erling Smørgrav { 849*7b5038d7SDag-Erling Smørgrav uint32_t latitude = 0; 850*7b5038d7SDag-Erling Smørgrav uint32_t longitude = 0; 851*7b5038d7SDag-Erling Smørgrav uint32_t altitude = 0; 852*7b5038d7SDag-Erling Smørgrav 853*7b5038d7SDag-Erling Smørgrav uint8_t *data; 854*7b5038d7SDag-Erling Smørgrav uint32_t equator = (uint32_t) ldns_power(2, 31); 855*7b5038d7SDag-Erling Smørgrav 856*7b5038d7SDag-Erling Smørgrav uint32_t h = 0; 857*7b5038d7SDag-Erling Smørgrav uint32_t m = 0; 858*7b5038d7SDag-Erling Smørgrav uint8_t size_b = 1, size_e = 2; 859*7b5038d7SDag-Erling Smørgrav uint8_t horiz_pre_b = 1, horiz_pre_e = 6; 860*7b5038d7SDag-Erling Smørgrav uint8_t vert_pre_b = 1, vert_pre_e = 3; 861*7b5038d7SDag-Erling Smørgrav 862*7b5038d7SDag-Erling Smørgrav double s = 0.0; 863*7b5038d7SDag-Erling Smørgrav bool northerness; 864*7b5038d7SDag-Erling Smørgrav bool easterness; 865*7b5038d7SDag-Erling Smørgrav 866*7b5038d7SDag-Erling Smørgrav char *my_str = (char *) str; 867*7b5038d7SDag-Erling Smørgrav 868*7b5038d7SDag-Erling Smørgrav /* only support version 0 */ 869*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 870*7b5038d7SDag-Erling Smørgrav h = (uint32_t) strtol(my_str, &my_str, 10); 871*7b5038d7SDag-Erling Smørgrav } else { 872*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 873*7b5038d7SDag-Erling Smørgrav } 874*7b5038d7SDag-Erling Smørgrav 875*7b5038d7SDag-Erling Smørgrav while (isblank((int) *my_str)) { 876*7b5038d7SDag-Erling Smørgrav my_str++; 877*7b5038d7SDag-Erling Smørgrav } 878*7b5038d7SDag-Erling Smørgrav 879*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 880*7b5038d7SDag-Erling Smørgrav m = (uint32_t) strtol(my_str, &my_str, 10); 881*7b5038d7SDag-Erling Smørgrav } else if (*my_str == 'N' || *my_str == 'S') { 882*7b5038d7SDag-Erling Smørgrav goto north; 883*7b5038d7SDag-Erling Smørgrav } else { 884*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 885*7b5038d7SDag-Erling Smørgrav } 886*7b5038d7SDag-Erling Smørgrav 887*7b5038d7SDag-Erling Smørgrav while (isblank((int) *my_str)) { 888*7b5038d7SDag-Erling Smørgrav my_str++; 889*7b5038d7SDag-Erling Smørgrav } 890*7b5038d7SDag-Erling Smørgrav 891*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 892*7b5038d7SDag-Erling Smørgrav s = strtod(my_str, &my_str); 893*7b5038d7SDag-Erling Smørgrav } 894*7b5038d7SDag-Erling Smørgrav north: 895*7b5038d7SDag-Erling Smørgrav while (isblank((int) *my_str)) { 896*7b5038d7SDag-Erling Smørgrav my_str++; 897*7b5038d7SDag-Erling Smørgrav } 898*7b5038d7SDag-Erling Smørgrav 899*7b5038d7SDag-Erling Smørgrav if (*my_str == 'N') { 900*7b5038d7SDag-Erling Smørgrav northerness = true; 901*7b5038d7SDag-Erling Smørgrav } else if (*my_str == 'S') { 902*7b5038d7SDag-Erling Smørgrav northerness = false; 903*7b5038d7SDag-Erling Smørgrav } else { 904*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 905*7b5038d7SDag-Erling Smørgrav } 906*7b5038d7SDag-Erling Smørgrav 907*7b5038d7SDag-Erling Smørgrav my_str++; 908*7b5038d7SDag-Erling Smørgrav 909*7b5038d7SDag-Erling Smørgrav /* store number */ 910*7b5038d7SDag-Erling Smørgrav s = 1000.0 * s; 911*7b5038d7SDag-Erling Smørgrav /* add a little to make floor in conversion a round */ 912*7b5038d7SDag-Erling Smørgrav s += 0.0005; 913*7b5038d7SDag-Erling Smørgrav latitude = (uint32_t) s; 914*7b5038d7SDag-Erling Smørgrav latitude += 1000 * 60 * m; 915*7b5038d7SDag-Erling Smørgrav latitude += 1000 * 60 * 60 * h; 916*7b5038d7SDag-Erling Smørgrav if (northerness) { 917*7b5038d7SDag-Erling Smørgrav latitude = equator + latitude; 918*7b5038d7SDag-Erling Smørgrav } else { 919*7b5038d7SDag-Erling Smørgrav latitude = equator - latitude; 920*7b5038d7SDag-Erling Smørgrav } 921*7b5038d7SDag-Erling Smørgrav while (isblank(*my_str)) { 922*7b5038d7SDag-Erling Smørgrav my_str++; 923*7b5038d7SDag-Erling Smørgrav } 924*7b5038d7SDag-Erling Smørgrav 925*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 926*7b5038d7SDag-Erling Smørgrav h = (uint32_t) strtol(my_str, &my_str, 10); 927*7b5038d7SDag-Erling Smørgrav } else { 928*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 929*7b5038d7SDag-Erling Smørgrav } 930*7b5038d7SDag-Erling Smørgrav 931*7b5038d7SDag-Erling Smørgrav while (isblank((int) *my_str)) { 932*7b5038d7SDag-Erling Smørgrav my_str++; 933*7b5038d7SDag-Erling Smørgrav } 934*7b5038d7SDag-Erling Smørgrav 935*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 936*7b5038d7SDag-Erling Smørgrav m = (uint32_t) strtol(my_str, &my_str, 10); 937*7b5038d7SDag-Erling Smørgrav } else if (*my_str == 'E' || *my_str == 'W') { 938*7b5038d7SDag-Erling Smørgrav goto east; 939*7b5038d7SDag-Erling Smørgrav } else { 940*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 941*7b5038d7SDag-Erling Smørgrav } 942*7b5038d7SDag-Erling Smørgrav 943*7b5038d7SDag-Erling Smørgrav while (isblank(*my_str)) { 944*7b5038d7SDag-Erling Smørgrav my_str++; 945*7b5038d7SDag-Erling Smørgrav } 946*7b5038d7SDag-Erling Smørgrav 947*7b5038d7SDag-Erling Smørgrav if (isdigit((int) *my_str)) { 948*7b5038d7SDag-Erling Smørgrav s = strtod(my_str, &my_str); 949*7b5038d7SDag-Erling Smørgrav } 950*7b5038d7SDag-Erling Smørgrav 951*7b5038d7SDag-Erling Smørgrav east: 952*7b5038d7SDag-Erling Smørgrav while (isblank(*my_str)) { 953*7b5038d7SDag-Erling Smørgrav my_str++; 954*7b5038d7SDag-Erling Smørgrav } 955*7b5038d7SDag-Erling Smørgrav 956*7b5038d7SDag-Erling Smørgrav if (*my_str == 'E') { 957*7b5038d7SDag-Erling Smørgrav easterness = true; 958*7b5038d7SDag-Erling Smørgrav } else if (*my_str == 'W') { 959*7b5038d7SDag-Erling Smørgrav easterness = false; 960*7b5038d7SDag-Erling Smørgrav } else { 961*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 962*7b5038d7SDag-Erling Smørgrav } 963*7b5038d7SDag-Erling Smørgrav 964*7b5038d7SDag-Erling Smørgrav my_str++; 965*7b5038d7SDag-Erling Smørgrav 966*7b5038d7SDag-Erling Smørgrav /* store number */ 967*7b5038d7SDag-Erling Smørgrav s *= 1000.0; 968*7b5038d7SDag-Erling Smørgrav /* add a little to make floor in conversion a round */ 969*7b5038d7SDag-Erling Smørgrav s += 0.0005; 970*7b5038d7SDag-Erling Smørgrav longitude = (uint32_t) s; 971*7b5038d7SDag-Erling Smørgrav longitude += 1000 * 60 * m; 972*7b5038d7SDag-Erling Smørgrav longitude += 1000 * 60 * 60 * h; 973*7b5038d7SDag-Erling Smørgrav 974*7b5038d7SDag-Erling Smørgrav if (easterness) { 975*7b5038d7SDag-Erling Smørgrav longitude += equator; 976*7b5038d7SDag-Erling Smørgrav } else { 977*7b5038d7SDag-Erling Smørgrav longitude = equator - longitude; 978*7b5038d7SDag-Erling Smørgrav } 979*7b5038d7SDag-Erling Smørgrav 980*7b5038d7SDag-Erling Smørgrav altitude = (uint32_t)(strtod(my_str, &my_str)*100.0 + 981*7b5038d7SDag-Erling Smørgrav 10000000.0 + 0.5); 982*7b5038d7SDag-Erling Smørgrav if (*my_str == 'm' || *my_str == 'M') { 983*7b5038d7SDag-Erling Smørgrav my_str++; 984*7b5038d7SDag-Erling Smørgrav } 985*7b5038d7SDag-Erling Smørgrav 986*7b5038d7SDag-Erling Smørgrav if (strlen(my_str) > 0) { 987*7b5038d7SDag-Erling Smørgrav if(!loc_parse_cm(my_str, &my_str, &size_b, &size_e)) 988*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 989*7b5038d7SDag-Erling Smørgrav } 990*7b5038d7SDag-Erling Smørgrav 991*7b5038d7SDag-Erling Smørgrav if (strlen(my_str) > 0) { 992*7b5038d7SDag-Erling Smørgrav if(!loc_parse_cm(my_str, &my_str, &horiz_pre_b, &horiz_pre_e)) 993*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 994*7b5038d7SDag-Erling Smørgrav } 995*7b5038d7SDag-Erling Smørgrav 996*7b5038d7SDag-Erling Smørgrav if (strlen(my_str) > 0) { 997*7b5038d7SDag-Erling Smørgrav if(!loc_parse_cm(my_str, &my_str, &vert_pre_b, &vert_pre_e)) 998*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 999*7b5038d7SDag-Erling Smørgrav } 1000*7b5038d7SDag-Erling Smørgrav 1001*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, 16); 1002*7b5038d7SDag-Erling Smørgrav if(!data) { 1003*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 1004*7b5038d7SDag-Erling Smørgrav } 1005*7b5038d7SDag-Erling Smørgrav data[0] = 0; 1006*7b5038d7SDag-Erling Smørgrav data[1] = 0; 1007*7b5038d7SDag-Erling Smørgrav data[1] = ((size_b << 4) & 0xf0) | (size_e & 0x0f); 1008*7b5038d7SDag-Erling Smørgrav data[2] = ((horiz_pre_b << 4) & 0xf0) | (horiz_pre_e & 0x0f); 1009*7b5038d7SDag-Erling Smørgrav data[3] = ((vert_pre_b << 4) & 0xf0) | (vert_pre_e & 0x0f); 1010*7b5038d7SDag-Erling Smørgrav ldns_write_uint32(data + 4, latitude); 1011*7b5038d7SDag-Erling Smørgrav ldns_write_uint32(data + 8, longitude); 1012*7b5038d7SDag-Erling Smørgrav ldns_write_uint32(data + 12, altitude); 1013*7b5038d7SDag-Erling Smørgrav 1014*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data( 1015*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_LOC, 16, data); 1016*7b5038d7SDag-Erling Smørgrav 1017*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 1018*7b5038d7SDag-Erling Smørgrav return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; 1019*7b5038d7SDag-Erling Smørgrav } 1020*7b5038d7SDag-Erling Smørgrav 1021*7b5038d7SDag-Erling Smørgrav ldns_status 1022*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_wks(ldns_rdf **rd, const char *str) 1023*7b5038d7SDag-Erling Smørgrav { 1024*7b5038d7SDag-Erling Smørgrav uint8_t *bitmap = NULL; 1025*7b5038d7SDag-Erling Smørgrav uint8_t *data; 1026*7b5038d7SDag-Erling Smørgrav int bm_len = 0; 1027*7b5038d7SDag-Erling Smørgrav 1028*7b5038d7SDag-Erling Smørgrav struct protoent *proto = NULL; 1029*7b5038d7SDag-Erling Smørgrav struct servent *serv = NULL; 1030*7b5038d7SDag-Erling Smørgrav int serv_port; 1031*7b5038d7SDag-Erling Smørgrav 1032*7b5038d7SDag-Erling Smørgrav ldns_buffer *str_buf; 1033*7b5038d7SDag-Erling Smørgrav 1034*7b5038d7SDag-Erling Smørgrav char *proto_str = NULL; 1035*7b5038d7SDag-Erling Smørgrav char *token; 1036*7b5038d7SDag-Erling Smørgrav if(strlen(str) == 0) 1037*7b5038d7SDag-Erling Smørgrav token = LDNS_XMALLOC(char, 50); 1038*7b5038d7SDag-Erling Smørgrav else token = LDNS_XMALLOC(char, strlen(str)+2); 1039*7b5038d7SDag-Erling Smørgrav if(!token) return LDNS_STATUS_MEM_ERR; 1040*7b5038d7SDag-Erling Smørgrav 1041*7b5038d7SDag-Erling Smørgrav str_buf = LDNS_MALLOC(ldns_buffer); 1042*7b5038d7SDag-Erling Smørgrav if(!str_buf) {LDNS_FREE(token); return LDNS_STATUS_MEM_ERR;} 1043*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); 1044*7b5038d7SDag-Erling Smørgrav if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { 1045*7b5038d7SDag-Erling Smørgrav LDNS_FREE(str_buf); 1046*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1047*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 1048*7b5038d7SDag-Erling Smørgrav } 1049*7b5038d7SDag-Erling Smørgrav 1050*7b5038d7SDag-Erling Smørgrav while(ldns_bget_token(str_buf, token, "\t\n ", strlen(str)) > 0) { 1051*7b5038d7SDag-Erling Smørgrav if (!proto_str) { 1052*7b5038d7SDag-Erling Smørgrav proto_str = strdup(token); 1053*7b5038d7SDag-Erling Smørgrav if (!proto_str) { 1054*7b5038d7SDag-Erling Smørgrav LDNS_FREE(bitmap); 1055*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1056*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1057*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1058*7b5038d7SDag-Erling Smørgrav } 1059*7b5038d7SDag-Erling Smørgrav } else { 1060*7b5038d7SDag-Erling Smørgrav serv = getservbyname(token, proto_str); 1061*7b5038d7SDag-Erling Smørgrav if (serv) { 1062*7b5038d7SDag-Erling Smørgrav serv_port = (int) ntohs((uint16_t) serv->s_port); 1063*7b5038d7SDag-Erling Smørgrav } else { 1064*7b5038d7SDag-Erling Smørgrav serv_port = atoi(token); 1065*7b5038d7SDag-Erling Smørgrav } 1066*7b5038d7SDag-Erling Smørgrav if (serv_port / 8 >= bm_len) { 1067*7b5038d7SDag-Erling Smørgrav uint8_t *b2 = LDNS_XREALLOC(bitmap, uint8_t, (serv_port / 8) + 1); 1068*7b5038d7SDag-Erling Smørgrav if(!b2) { 1069*7b5038d7SDag-Erling Smørgrav LDNS_FREE(bitmap); 1070*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1071*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1072*7b5038d7SDag-Erling Smørgrav free(proto_str); 1073*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1074*7b5038d7SDag-Erling Smørgrav } 1075*7b5038d7SDag-Erling Smørgrav bitmap = b2; 1076*7b5038d7SDag-Erling Smørgrav /* set to zero to be sure */ 1077*7b5038d7SDag-Erling Smørgrav for (; bm_len <= serv_port / 8; bm_len++) { 1078*7b5038d7SDag-Erling Smørgrav bitmap[bm_len] = 0; 1079*7b5038d7SDag-Erling Smørgrav } 1080*7b5038d7SDag-Erling Smørgrav } 1081*7b5038d7SDag-Erling Smørgrav ldns_set_bit(bitmap + (serv_port / 8), 7 - (serv_port % 8), true); 1082*7b5038d7SDag-Erling Smørgrav } 1083*7b5038d7SDag-Erling Smørgrav } 1084*7b5038d7SDag-Erling Smørgrav 1085*7b5038d7SDag-Erling Smørgrav if (!proto_str || !bitmap) { 1086*7b5038d7SDag-Erling Smørgrav LDNS_FREE(bitmap); 1087*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1088*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1089*7b5038d7SDag-Erling Smørgrav free(proto_str); 1090*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1091*7b5038d7SDag-Erling Smørgrav } 1092*7b5038d7SDag-Erling Smørgrav 1093*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, bm_len + 1); 1094*7b5038d7SDag-Erling Smørgrav if(!data) { 1095*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1096*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1097*7b5038d7SDag-Erling Smørgrav LDNS_FREE(bitmap); 1098*7b5038d7SDag-Erling Smørgrav free(proto_str); 1099*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1100*7b5038d7SDag-Erling Smørgrav } 1101*7b5038d7SDag-Erling Smørgrav if (proto_str) 1102*7b5038d7SDag-Erling Smørgrav proto = getprotobyname(proto_str); 1103*7b5038d7SDag-Erling Smørgrav if (proto) { 1104*7b5038d7SDag-Erling Smørgrav data[0] = (uint8_t) proto->p_proto; 1105*7b5038d7SDag-Erling Smørgrav } else if (proto_str) { 1106*7b5038d7SDag-Erling Smørgrav data[0] = (uint8_t) atoi(proto_str); 1107*7b5038d7SDag-Erling Smørgrav } else { 1108*7b5038d7SDag-Erling Smørgrav data[0] = 0; 1109*7b5038d7SDag-Erling Smørgrav } 1110*7b5038d7SDag-Erling Smørgrav memcpy(data + 1, bitmap, (size_t) bm_len); 1111*7b5038d7SDag-Erling Smørgrav 1112*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_WKS, (uint16_t) (bm_len + 1), data); 1113*7b5038d7SDag-Erling Smørgrav 1114*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 1115*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1116*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1117*7b5038d7SDag-Erling Smørgrav LDNS_FREE(bitmap); 1118*7b5038d7SDag-Erling Smørgrav free(proto_str); 1119*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_ENDSERVENT 1120*7b5038d7SDag-Erling Smørgrav endservent(); 1121*7b5038d7SDag-Erling Smørgrav #endif 1122*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_ENDPROTOENT 1123*7b5038d7SDag-Erling Smørgrav endprotoent(); 1124*7b5038d7SDag-Erling Smørgrav #endif 1125*7b5038d7SDag-Erling Smørgrav 1126*7b5038d7SDag-Erling Smørgrav if(!*rd) return LDNS_STATUS_MEM_ERR; 1127*7b5038d7SDag-Erling Smørgrav 1128*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_OK; 1129*7b5038d7SDag-Erling Smørgrav } 1130*7b5038d7SDag-Erling Smørgrav 1131*7b5038d7SDag-Erling Smørgrav ldns_status 1132*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_nsap(ldns_rdf **rd, const char *str) 1133*7b5038d7SDag-Erling Smørgrav { 1134*7b5038d7SDag-Erling Smørgrav size_t len, i; 1135*7b5038d7SDag-Erling Smørgrav char* nsap_str = (char*) str; 1136*7b5038d7SDag-Erling Smørgrav 1137*7b5038d7SDag-Erling Smørgrav /* just a hex string with optional dots? */ 1138*7b5038d7SDag-Erling Smørgrav if (str[0] != '0' || str[1] != 'x') { 1139*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1140*7b5038d7SDag-Erling Smørgrav } else { 1141*7b5038d7SDag-Erling Smørgrav len = strlen(str); 1142*7b5038d7SDag-Erling Smørgrav for (i=0; i < len; i++) { 1143*7b5038d7SDag-Erling Smørgrav if (nsap_str[i] == '.') 1144*7b5038d7SDag-Erling Smørgrav nsap_str[i] = ' '; 1145*7b5038d7SDag-Erling Smørgrav } 1146*7b5038d7SDag-Erling Smørgrav return ldns_str2rdf_hex(rd, str+2); 1147*7b5038d7SDag-Erling Smørgrav } 1148*7b5038d7SDag-Erling Smørgrav } 1149*7b5038d7SDag-Erling Smørgrav 1150*7b5038d7SDag-Erling Smørgrav ldns_status 1151*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_atma(ldns_rdf **rd, const char *str) 1152*7b5038d7SDag-Erling Smørgrav { 1153*7b5038d7SDag-Erling Smørgrav size_t len, i; 1154*7b5038d7SDag-Erling Smørgrav char* atma_str = (char*) str; 1155*7b5038d7SDag-Erling Smørgrav ldns_status status; 1156*7b5038d7SDag-Erling Smørgrav 1157*7b5038d7SDag-Erling Smørgrav /* just a hex string with optional dots? */ 1158*7b5038d7SDag-Erling Smørgrav len = strlen(str); 1159*7b5038d7SDag-Erling Smørgrav for (i=0; i < len; i++) { 1160*7b5038d7SDag-Erling Smørgrav if (atma_str[i] == '.') 1161*7b5038d7SDag-Erling Smørgrav atma_str[i] = ' '; 1162*7b5038d7SDag-Erling Smørgrav } 1163*7b5038d7SDag-Erling Smørgrav status = ldns_str2rdf_hex(rd, str); 1164*7b5038d7SDag-Erling Smørgrav if (status != LDNS_STATUS_OK) { 1165*7b5038d7SDag-Erling Smørgrav ; /* probably in e.164 format than */ 1166*7b5038d7SDag-Erling Smørgrav } 1167*7b5038d7SDag-Erling Smørgrav return status; 1168*7b5038d7SDag-Erling Smørgrav } 1169*7b5038d7SDag-Erling Smørgrav 1170*7b5038d7SDag-Erling Smørgrav ldns_status 1171*7b5038d7SDag-Erling Smørgrav ldns_str2rdf_ipseckey(ldns_rdf **rd, const char *str) 1172*7b5038d7SDag-Erling Smørgrav { 1173*7b5038d7SDag-Erling Smørgrav uint8_t precedence = 0; 1174*7b5038d7SDag-Erling Smørgrav uint8_t gateway_type = 0; 1175*7b5038d7SDag-Erling Smørgrav uint8_t algorithm = 0; 1176*7b5038d7SDag-Erling Smørgrav char* gateway = NULL; 1177*7b5038d7SDag-Erling Smørgrav char* publickey = NULL; 1178*7b5038d7SDag-Erling Smørgrav uint8_t *data; 1179*7b5038d7SDag-Erling Smørgrav ldns_buffer *str_buf; 1180*7b5038d7SDag-Erling Smørgrav char *token; 1181*7b5038d7SDag-Erling Smørgrav int token_count = 0; 1182*7b5038d7SDag-Erling Smørgrav int ipseckey_len = 0; 1183*7b5038d7SDag-Erling Smørgrav ldns_rdf* gateway_rdf = NULL; 1184*7b5038d7SDag-Erling Smørgrav ldns_rdf* publickey_rdf = NULL; 1185*7b5038d7SDag-Erling Smørgrav ldns_status status = LDNS_STATUS_OK; 1186*7b5038d7SDag-Erling Smørgrav 1187*7b5038d7SDag-Erling Smørgrav if(strlen(str) == 0) 1188*7b5038d7SDag-Erling Smørgrav token = LDNS_XMALLOC(char, 256); 1189*7b5038d7SDag-Erling Smørgrav else token = LDNS_XMALLOC(char, strlen(str)+2); 1190*7b5038d7SDag-Erling Smørgrav if(!token) return LDNS_STATUS_MEM_ERR; 1191*7b5038d7SDag-Erling Smørgrav 1192*7b5038d7SDag-Erling Smørgrav str_buf = LDNS_MALLOC(ldns_buffer); 1193*7b5038d7SDag-Erling Smørgrav if(!str_buf) {LDNS_FREE(token); return LDNS_STATUS_MEM_ERR;} 1194*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); 1195*7b5038d7SDag-Erling Smørgrav if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { 1196*7b5038d7SDag-Erling Smørgrav LDNS_FREE(str_buf); 1197*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1198*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 1199*7b5038d7SDag-Erling Smørgrav } 1200*7b5038d7SDag-Erling Smørgrav while(ldns_bget_token(str_buf, token, "\t\n ", strlen(str)) > 0) { 1201*7b5038d7SDag-Erling Smørgrav switch (token_count) { 1202*7b5038d7SDag-Erling Smørgrav case 0: 1203*7b5038d7SDag-Erling Smørgrav precedence = (uint8_t)atoi(token); 1204*7b5038d7SDag-Erling Smørgrav break; 1205*7b5038d7SDag-Erling Smørgrav case 1: 1206*7b5038d7SDag-Erling Smørgrav gateway_type = (uint8_t)atoi(token); 1207*7b5038d7SDag-Erling Smørgrav break; 1208*7b5038d7SDag-Erling Smørgrav case 2: 1209*7b5038d7SDag-Erling Smørgrav algorithm = (uint8_t)atoi(token); 1210*7b5038d7SDag-Erling Smørgrav break; 1211*7b5038d7SDag-Erling Smørgrav case 3: 1212*7b5038d7SDag-Erling Smørgrav gateway = strdup(token); 1213*7b5038d7SDag-Erling Smørgrav if (!gateway || (gateway_type == 0 && 1214*7b5038d7SDag-Erling Smørgrav (token[0] != '.' || token[1] != '\0'))) { 1215*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1216*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1217*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1218*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1219*7b5038d7SDag-Erling Smørgrav } 1220*7b5038d7SDag-Erling Smørgrav break; 1221*7b5038d7SDag-Erling Smørgrav case 4: 1222*7b5038d7SDag-Erling Smørgrav publickey = strdup(token); 1223*7b5038d7SDag-Erling Smørgrav break; 1224*7b5038d7SDag-Erling Smørgrav default: 1225*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1226*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1227*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1228*7b5038d7SDag-Erling Smørgrav break; 1229*7b5038d7SDag-Erling Smørgrav } 1230*7b5038d7SDag-Erling Smørgrav token_count++; 1231*7b5038d7SDag-Erling Smørgrav } 1232*7b5038d7SDag-Erling Smørgrav 1233*7b5038d7SDag-Erling Smørgrav if (!gateway || !publickey) { 1234*7b5038d7SDag-Erling Smørgrav if (gateway) 1235*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1236*7b5038d7SDag-Erling Smørgrav if (publickey) 1237*7b5038d7SDag-Erling Smørgrav LDNS_FREE(publickey); 1238*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1239*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1240*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1241*7b5038d7SDag-Erling Smørgrav } 1242*7b5038d7SDag-Erling Smørgrav 1243*7b5038d7SDag-Erling Smørgrav if (gateway_type == 1) { 1244*7b5038d7SDag-Erling Smørgrav status = ldns_str2rdf_a(&gateway_rdf, gateway); 1245*7b5038d7SDag-Erling Smørgrav } else if (gateway_type == 2) { 1246*7b5038d7SDag-Erling Smørgrav status = ldns_str2rdf_aaaa(&gateway_rdf, gateway); 1247*7b5038d7SDag-Erling Smørgrav } else if (gateway_type == 3) { 1248*7b5038d7SDag-Erling Smørgrav status = ldns_str2rdf_dname(&gateway_rdf, gateway); 1249*7b5038d7SDag-Erling Smørgrav } 1250*7b5038d7SDag-Erling Smørgrav 1251*7b5038d7SDag-Erling Smørgrav if (status != LDNS_STATUS_OK) { 1252*7b5038d7SDag-Erling Smørgrav if (gateway) 1253*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1254*7b5038d7SDag-Erling Smørgrav if (publickey) 1255*7b5038d7SDag-Erling Smørgrav LDNS_FREE(publickey); 1256*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1257*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1258*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1259*7b5038d7SDag-Erling Smørgrav } 1260*7b5038d7SDag-Erling Smørgrav 1261*7b5038d7SDag-Erling Smørgrav status = ldns_str2rdf_b64(&publickey_rdf, publickey); 1262*7b5038d7SDag-Erling Smørgrav 1263*7b5038d7SDag-Erling Smørgrav if (status != LDNS_STATUS_OK) { 1264*7b5038d7SDag-Erling Smørgrav if (gateway) 1265*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1266*7b5038d7SDag-Erling Smørgrav if (publickey) 1267*7b5038d7SDag-Erling Smørgrav LDNS_FREE(publickey); 1268*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1269*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1270*7b5038d7SDag-Erling Smørgrav if (gateway_rdf) ldns_rdf_free(gateway_rdf); 1271*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_INVALID_STR; 1272*7b5038d7SDag-Erling Smørgrav } 1273*7b5038d7SDag-Erling Smørgrav 1274*7b5038d7SDag-Erling Smørgrav /* now copy all into one ipseckey rdf */ 1275*7b5038d7SDag-Erling Smørgrav if (gateway_type) 1276*7b5038d7SDag-Erling Smørgrav ipseckey_len = 3 + (int)ldns_rdf_size(gateway_rdf) + (int)ldns_rdf_size(publickey_rdf); 1277*7b5038d7SDag-Erling Smørgrav else 1278*7b5038d7SDag-Erling Smørgrav ipseckey_len = 3 + (int)ldns_rdf_size(publickey_rdf); 1279*7b5038d7SDag-Erling Smørgrav 1280*7b5038d7SDag-Erling Smørgrav data = LDNS_XMALLOC(uint8_t, ipseckey_len); 1281*7b5038d7SDag-Erling Smørgrav if(!data) { 1282*7b5038d7SDag-Erling Smørgrav if (gateway) 1283*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1284*7b5038d7SDag-Erling Smørgrav if (publickey) 1285*7b5038d7SDag-Erling Smørgrav LDNS_FREE(publickey); 1286*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1287*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1288*7b5038d7SDag-Erling Smørgrav if (gateway_rdf) ldns_rdf_free(gateway_rdf); 1289*7b5038d7SDag-Erling Smørgrav if (publickey_rdf) ldns_rdf_free(publickey_rdf); 1290*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 1291*7b5038d7SDag-Erling Smørgrav } 1292*7b5038d7SDag-Erling Smørgrav 1293*7b5038d7SDag-Erling Smørgrav data[0] = precedence; 1294*7b5038d7SDag-Erling Smørgrav data[1] = gateway_type; 1295*7b5038d7SDag-Erling Smørgrav data[2] = algorithm; 1296*7b5038d7SDag-Erling Smørgrav 1297*7b5038d7SDag-Erling Smørgrav if (gateway_type) { 1298*7b5038d7SDag-Erling Smørgrav memcpy(data + 3, 1299*7b5038d7SDag-Erling Smørgrav ldns_rdf_data(gateway_rdf), ldns_rdf_size(gateway_rdf)); 1300*7b5038d7SDag-Erling Smørgrav memcpy(data + 3 + ldns_rdf_size(gateway_rdf), 1301*7b5038d7SDag-Erling Smørgrav ldns_rdf_data(publickey_rdf), ldns_rdf_size(publickey_rdf)); 1302*7b5038d7SDag-Erling Smørgrav } else { 1303*7b5038d7SDag-Erling Smørgrav memcpy(data + 3, 1304*7b5038d7SDag-Erling Smørgrav ldns_rdf_data(publickey_rdf), ldns_rdf_size(publickey_rdf)); 1305*7b5038d7SDag-Erling Smørgrav } 1306*7b5038d7SDag-Erling Smørgrav 1307*7b5038d7SDag-Erling Smørgrav *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_IPSECKEY, (uint16_t) ipseckey_len, data); 1308*7b5038d7SDag-Erling Smørgrav 1309*7b5038d7SDag-Erling Smørgrav if (gateway) 1310*7b5038d7SDag-Erling Smørgrav LDNS_FREE(gateway); 1311*7b5038d7SDag-Erling Smørgrav if (publickey) 1312*7b5038d7SDag-Erling Smørgrav LDNS_FREE(publickey); 1313*7b5038d7SDag-Erling Smørgrav LDNS_FREE(token); 1314*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(str_buf); 1315*7b5038d7SDag-Erling Smørgrav ldns_rdf_free(gateway_rdf); 1316*7b5038d7SDag-Erling Smørgrav ldns_rdf_free(publickey_rdf); 1317*7b5038d7SDag-Erling Smørgrav LDNS_FREE(data); 1318*7b5038d7SDag-Erling Smørgrav if(!*rd) return LDNS_STATUS_MEM_ERR; 1319*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_OK; 1320*7b5038d7SDag-Erling Smørgrav } 1321