From 6e599264ad13e8fc105493d74d7c11d46f8739ed Mon Sep 17 00:00:00 2001 From: ng0 Date: Fri, 6 Sep 2019 22:46:29 +0000 Subject: first step to remove plibc --- src/gns/plugin_gnsrecord_gns.c | 438 ++++++++++++++++++----------------------- 1 file changed, 195 insertions(+), 243 deletions(-) (limited to 'src/gns/plugin_gnsrecord_gns.c') diff --git a/src/gns/plugin_gnsrecord_gns.c b/src/gns/plugin_gnsrecord_gns.c index ebba0db47..8cb76cffe 100644 --- a/src/gns/plugin_gnsrecord_gns.c +++ b/src/gns/plugin_gnsrecord_gns.c @@ -61,85 +61,68 @@ gns_value_to_string (void *cls, return GNUNET_strndup (data, data_size); case GNUNET_GNSRECORD_TYPE_LEHO: return GNUNET_strndup (data, data_size); - case GNUNET_GNSRECORD_TYPE_GNS2DNS: + case GNUNET_GNSRECORD_TYPE_GNS2DNS: { + char *ns; + char *ip; + size_t off; + char *nstr; + + off = 0; + ns = GNUNET_DNSPARSER_parse_name (data, data_size, &off); + ip = GNUNET_DNSPARSER_parse_name (data, data_size, &off); + if ((NULL == ns) || (NULL == ip) || (off != data_size)) { - char *ns; - char *ip; - size_t off; - char *nstr; - - off = 0; - ns = GNUNET_DNSPARSER_parse_name (data, - data_size, - &off); - ip = GNUNET_DNSPARSER_parse_name (data, - data_size, - &off); - if ( (NULL == ns) || - (NULL == ip) || - (off != data_size) ) - { - GNUNET_break_op (0); - GNUNET_free_non_null (ns); - GNUNET_free_non_null (ip); - return NULL; - } - GNUNET_asprintf (&nstr, - "%s@%s", - ns, - ip); + GNUNET_break_op (0); GNUNET_free_non_null (ns); GNUNET_free_non_null (ip); - return nstr; - } - case GNUNET_GNSRECORD_TYPE_VPN: - { - struct GNUNET_TUN_GnsVpnRecord vpn; - char* vpn_str; - - cdata = data; - if ( (data_size <= sizeof (vpn)) || - ('\0' != cdata[data_size - 1]) ) - return NULL; /* malformed */ - /* need to memcpy for alignment */ - GNUNET_memcpy (&vpn, - data, - sizeof (vpn)); - GNUNET_asprintf (&vpn_str, - "%u %s %s", - (unsigned int) ntohs (vpn.proto), - (const char*) GNUNET_i2s_full (&vpn.peer), - (const char*) &cdata[sizeof (vpn)]); - return vpn_str; - } - case GNUNET_GNSRECORD_TYPE_BOX: - { - struct GNUNET_GNSRECORD_BoxRecord box; - uint32_t rt; - char *box_str; - char *ival; - - cdata = data; - if (data_size < sizeof (struct GNUNET_GNSRECORD_BoxRecord)) - return NULL; /* malformed */ - GNUNET_memcpy (&box, - data, - sizeof (box)); - rt = ntohl (box.record_type); - ival = GNUNET_GNSRECORD_value_to_string (rt, - &cdata[sizeof (box)], - data_size - sizeof (box)); - if (NULL == ival) - return NULL; /* malformed */ - GNUNET_asprintf (&box_str, - "%u %u %u %s", - (unsigned int) ntohs (box.protocol), - (unsigned int) ntohs (box.service), - (unsigned int) rt, - ival); - GNUNET_free (ival); - return box_str; + return NULL; } + GNUNET_asprintf (&nstr, "%s@%s", ns, ip); + GNUNET_free_non_null (ns); + GNUNET_free_non_null (ip); + return nstr; + } + case GNUNET_GNSRECORD_TYPE_VPN: { + struct GNUNET_TUN_GnsVpnRecord vpn; + char *vpn_str; + + cdata = data; + if ((data_size <= sizeof (vpn)) || ('\0' != cdata[data_size - 1])) + return NULL; /* malformed */ + /* need to memcpy for alignment */ + GNUNET_memcpy (&vpn, data, sizeof (vpn)); + GNUNET_asprintf (&vpn_str, + "%u %s %s", + (unsigned int) ntohs (vpn.proto), + (const char *) GNUNET_i2s_full (&vpn.peer), + (const char *) &cdata[sizeof (vpn)]); + return vpn_str; + } + case GNUNET_GNSRECORD_TYPE_BOX: { + struct GNUNET_GNSRECORD_BoxRecord box; + uint32_t rt; + char *box_str; + char *ival; + + cdata = data; + if (data_size < sizeof (struct GNUNET_GNSRECORD_BoxRecord)) + return NULL; /* malformed */ + GNUNET_memcpy (&box, data, sizeof (box)); + rt = ntohl (box.record_type); + ival = GNUNET_GNSRECORD_value_to_string (rt, + &cdata[sizeof (box)], + data_size - sizeof (box)); + if (NULL == ival) + return NULL; /* malformed */ + GNUNET_asprintf (&box_str, + "%u %u %u %s", + (unsigned int) ntohs (box.protocol), + (unsigned int) ntohs (box.service), + (unsigned int) rt, + ival); + GNUNET_free (ival); + return box_str; + } default: return NULL; } @@ -171,154 +154,128 @@ gns_string_to_value (void *cls, switch (type) { - case GNUNET_GNSRECORD_TYPE_PKEY: - if (GNUNET_OK != - GNUNET_CRYPTO_ecdsa_public_key_from_string (s, - strlen (s), - &pkey)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse PKEY record `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); - GNUNET_memcpy (*data, - &pkey, - sizeof (pkey)); - *data_size = sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey); - return GNUNET_OK; - - case GNUNET_GNSRECORD_TYPE_NICK: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_GNSRECORD_TYPE_LEHO: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_GNSRECORD_TYPE_GNS2DNS: - { - char nsbuf[514]; - char *cpy; - char *at; - size_t off; - - cpy = GNUNET_strdup (s); - at = strchr (cpy, '@'); - if (NULL == at) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse GNS2DNS record `%s'\n"), - s); - GNUNET_free (cpy); - return GNUNET_SYSERR; - } - *at = '\0'; - at++; - - off = 0; - if ( (GNUNET_OK != - GNUNET_DNSPARSER_builder_add_name (nsbuf, - sizeof (nsbuf), - &off, - cpy)) || - (GNUNET_OK != - GNUNET_DNSPARSER_builder_add_name (nsbuf, - sizeof (nsbuf), - &off, - at)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to serialize GNS2DNS record with value `%s'\n"), - s); - GNUNET_free (cpy); - return GNUNET_SYSERR; - } - GNUNET_free (cpy); - *data_size = off; - *data = GNUNET_malloc (off); - GNUNET_memcpy (*data, - nsbuf, - off); - return GNUNET_OK; - } - case GNUNET_GNSRECORD_TYPE_VPN: - { - struct GNUNET_TUN_GnsVpnRecord *vpn; - char s_peer[103 + 1]; - char s_serv[253 + 1]; - unsigned int proto; - - if (3 != SSCANF (s, - "%u %103s %253s", - &proto, s_peer, s_serv)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse VPN record string `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data_size = sizeof (struct GNUNET_TUN_GnsVpnRecord) + strlen (s_serv) + 1; - *data = vpn = GNUNET_malloc (*data_size); - if (GNUNET_OK != - GNUNET_CRYPTO_eddsa_public_key_from_string ((char*) s_peer, - strlen (s_peer), - &vpn->peer.public_key)) - { - GNUNET_free (vpn); - *data_size = 0; - return GNUNET_SYSERR; - } - vpn->proto = htons ((uint16_t) proto); - strcpy ((char*)&vpn[1], s_serv); - return GNUNET_OK; - } - case GNUNET_GNSRECORD_TYPE_BOX: - { - struct GNUNET_GNSRECORD_BoxRecord *box; - size_t rest; - unsigned int protocol; - unsigned int service; - unsigned int record_type; - void *bval; - size_t bval_size; - - if (3 != SSCANF (s, - "%u %u %u ", - &protocol, - &service, - &record_type)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse BOX record string `%s'\n"), - s); - return GNUNET_SYSERR; - } - rest = snprintf (NULL, 0, - "%u %u %u ", - protocol, - service, - record_type); - if (GNUNET_OK != - GNUNET_GNSRECORD_string_to_value (record_type, - &s[rest], - &bval, - &bval_size)) - return GNUNET_SYSERR; - *data_size = sizeof (struct GNUNET_GNSRECORD_BoxRecord) + bval_size; - *data = box = GNUNET_malloc (*data_size); - box->protocol = htons (protocol); - box->service = htons (service); - box->record_type = htonl (record_type); - GNUNET_memcpy (&box[1], - bval, - bval_size); - GNUNET_free (bval); - return GNUNET_OK; - } - default: + case GNUNET_GNSRECORD_TYPE_PKEY: + if (GNUNET_OK != + GNUNET_CRYPTO_ecdsa_public_key_from_string (s, strlen (s), &pkey)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse PKEY record `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); + GNUNET_memcpy (*data, &pkey, sizeof (pkey)); + *data_size = sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey); + return GNUNET_OK; + + case GNUNET_GNSRECORD_TYPE_NICK: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_GNSRECORD_TYPE_LEHO: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_GNSRECORD_TYPE_GNS2DNS: { + char nsbuf[514]; + char *cpy; + char *at; + size_t off; + + cpy = GNUNET_strdup (s); + at = strchr (cpy, '@'); + if (NULL == at) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse GNS2DNS record `%s'\n"), + s); + GNUNET_free (cpy); + return GNUNET_SYSERR; + } + *at = '\0'; + at++; + + off = 0; + if ((GNUNET_OK != GNUNET_DNSPARSER_builder_add_name (nsbuf, + sizeof (nsbuf), + &off, + cpy)) || + (GNUNET_OK != + GNUNET_DNSPARSER_builder_add_name (nsbuf, sizeof (nsbuf), &off, at))) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Failed to serialize GNS2DNS record with value `%s'\n"), + s); + GNUNET_free (cpy); return GNUNET_SYSERR; + } + GNUNET_free (cpy); + *data_size = off; + *data = GNUNET_malloc (off); + GNUNET_memcpy (*data, nsbuf, off); + return GNUNET_OK; + } + case GNUNET_GNSRECORD_TYPE_VPN: { + struct GNUNET_TUN_GnsVpnRecord *vpn; + char s_peer[103 + 1]; + char s_serv[253 + 1]; + unsigned int proto; + + if (3 != sscanf (s, "%u %103s %253s", &proto, s_peer, s_serv)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse VPN record string `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data_size = sizeof (struct GNUNET_TUN_GnsVpnRecord) + strlen (s_serv) + 1; + *data = vpn = GNUNET_malloc (*data_size); + if (GNUNET_OK != + GNUNET_CRYPTO_eddsa_public_key_from_string ((char *) s_peer, + strlen (s_peer), + &vpn->peer.public_key)) + { + GNUNET_free (vpn); + *data_size = 0; + return GNUNET_SYSERR; + } + vpn->proto = htons ((uint16_t) proto); + strcpy ((char *) &vpn[1], s_serv); + return GNUNET_OK; + } + case GNUNET_GNSRECORD_TYPE_BOX: { + struct GNUNET_GNSRECORD_BoxRecord *box; + size_t rest; + unsigned int protocol; + unsigned int service; + unsigned int record_type; + void *bval; + size_t bval_size; + + if (3 != sscanf (s, "%u %u %u ", &protocol, &service, &record_type)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _ ("Unable to parse BOX record string `%s'\n"), + s); + return GNUNET_SYSERR; + } + rest = snprintf (NULL, 0, "%u %u %u ", protocol, service, record_type); + if (GNUNET_OK != GNUNET_GNSRECORD_string_to_value (record_type, + &s[rest], + &bval, + &bval_size)) + return GNUNET_SYSERR; + *data_size = sizeof (struct GNUNET_GNSRECORD_BoxRecord) + bval_size; + *data = box = GNUNET_malloc (*data_size); + box->protocol = htons (protocol); + box->service = htons (service); + box->record_type = htonl (record_type); + GNUNET_memcpy (&box[1], bval, bval_size); + GNUNET_free (bval); + return GNUNET_OK; + } + default: + return GNUNET_SYSERR; } } @@ -327,18 +284,17 @@ gns_string_to_value (void *cls, * Mapping of record type numbers to human-readable * record type names. */ -static struct { +static struct +{ const char *name; uint32_t number; -} gns_name_map[] = { - { "PKEY", GNUNET_GNSRECORD_TYPE_PKEY }, - { "NICK", GNUNET_GNSRECORD_TYPE_NICK }, - { "LEHO", GNUNET_GNSRECORD_TYPE_LEHO }, - { "VPN", GNUNET_GNSRECORD_TYPE_VPN }, - { "GNS2DNS", GNUNET_GNSRECORD_TYPE_GNS2DNS }, - { "BOX", GNUNET_GNSRECORD_TYPE_BOX }, - { NULL, UINT32_MAX } -}; +} gns_name_map[] = {{"PKEY", GNUNET_GNSRECORD_TYPE_PKEY}, + {"NICK", GNUNET_GNSRECORD_TYPE_NICK}, + {"LEHO", GNUNET_GNSRECORD_TYPE_LEHO}, + {"VPN", GNUNET_GNSRECORD_TYPE_VPN}, + {"GNS2DNS", GNUNET_GNSRECORD_TYPE_GNS2DNS}, + {"BOX", GNUNET_GNSRECORD_TYPE_BOX}, + {NULL, UINT32_MAX}}; /** @@ -349,15 +305,13 @@ static struct { * @return corresponding number, UINT32_MAX on error */ static uint32_t -gns_typename_to_number (void *cls, - const char *gns_typename) +gns_typename_to_number (void *cls, const char *gns_typename) { unsigned int i; - i=0; - while ( (NULL != gns_name_map[i].name) && - (0 != strcasecmp (gns_typename, - gns_name_map[i].name)) ) + i = 0; + while ((NULL != gns_name_map[i].name) && + (0 != strcasecmp (gns_typename, gns_name_map[i].name))) i++; return gns_name_map[i].number; } @@ -371,14 +325,12 @@ gns_typename_to_number (void *cls, * @return corresponding typestring, NULL on error */ static const char * -gns_number_to_typename (void *cls, - uint32_t type) +gns_number_to_typename (void *cls, uint32_t type) { unsigned int i; - i=0; - while ( (NULL != gns_name_map[i].name) && - (type != gns_name_map[i].number) ) + i = 0; + while ((NULL != gns_name_map[i].name) && (type != gns_name_map[i].number)) i++; return gns_name_map[i].name; } -- cgit v1.2.3