[SLOF] [PATCH] libnet: Move parse_tftp_args to tftp.c
Alexey Kardashevskiy
aik at ozlabs.ru
Mon Jul 10 12:39:21 AEST 2017
On 07/07/17 17:13, Thomas Huth wrote:
> To be able to re-use the libnet code in other projects (where
> the rather Open Firmware specific netload.c can not be used),
> the function parse_tftp_args() must be moved to another file.
> The function is related to TFTP, and its prototype is already
> declared in tftp.h, so the code should reside in tftp.c.
Thanks, applied.
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
> lib/libnet/netload.c | 106 ---------------------------------------------------
> lib/libnet/tftp.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 104 insertions(+), 106 deletions(-)
>
> diff --git a/lib/libnet/netload.c b/lib/libnet/netload.c
> index c549e69..cecb2a0 100644
> --- a/lib/libnet/netload.c
> +++ b/lib/libnet/netload.c
> @@ -17,7 +17,6 @@
> #include <dhcpv6.h>
> #include <ipv4.h>
> #include <ipv6.h>
> -#include <dns.h>
> #include <string.h>
> #include <stdio.h>
> #include <time.h>
> @@ -735,108 +734,3 @@ int netload(char *buffer, int len, char *ret_buffer, int huge_load,
>
> return rc;
> }
> -
> -/**
> - * Parses a tftp arguments, extracts all
> - * parameters and fills server ip according to this
> - *
> - * Parameters:
> - * @param buffer string with arguments,
> - * @param server_ip server ip as result
> - * @param filename default filename
> - * @param fd Socket descriptor
> - * @param len len of the buffer,
> - * @return 0 on SUCCESS and -1 on failure
> - */
> -int parse_tftp_args(char buffer[], char *server_ip, char filename[], int fd,
> - int len)
> -{
> - char *raw;
> - char *tmp, *tmp1;
> - int i, j = 0;
> - char domainname[256];
> - uint8_t server_ip6[16];
> -
> - raw = malloc(len);
> - if (raw == NULL) {
> - printf("\n unable to allocate memory, parsing failed\n");
> - return -1;
> - }
> - strncpy(raw,(const char *)buffer,len);
> - /*tftp url contains tftp://[fd00:4f53:4444:90:214:5eff:fed9:b200]/testfile*/
> - if(strncmp(raw,"tftp://",7)){
> - printf("\n tftp missing in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - tmp = strchr(raw,'[');
> - if(tmp != NULL && *tmp == '[') {
> - /*check for valid ipv6 address*/
> - tmp1 = strchr(tmp,']');
> - if (tmp1 == NULL) {
> - printf("\n missing ] in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - i = tmp1 - tmp;
> - /*look for file name*/
> - tmp1 = strchr(tmp,'/');
> - if (tmp1 == NULL) {
> - printf("\n missing filename in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - tmp[i] = '\0';
> - /*check for 16 byte ipv6 address */
> - if (!str_to_ipv6((tmp+1), (uint8_t *)(server_ip))) {
> - printf("\n wrong format IPV6 address in %s\n",raw);
> - free(raw);
> - return -1;;
> - }
> - else {
> - /*found filename */
> - strcpy(filename,(tmp1+1));
> - free(raw);
> - return 0;
> - }
> - }
> - else {
> - /*here tftp://hostname/testfile from option request of dhcp*/
> - /*look for dns server name */
> - tmp1 = strchr(raw,'.');
> - if(tmp1 == NULL) {
> - printf("\n missing . seperator in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - /*look for domain name beyond dns server name
> - * so ignore the current . and look for one more
> - */
> - tmp = strchr((tmp1+1),'.');
> - if(tmp == NULL) {
> - printf("\n missing domain in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - tmp1 = strchr(tmp1,'/');
> - if (tmp1 == NULL) {
> - printf("\n missing filename in %s\n",raw);
> - free(raw);
> - return -1;
> - }
> - j = tmp1 - (raw + 7);
> - tmp = raw + 7;
> - tmp[j] = '\0';
> - strcpy(domainname, tmp);
> - if (dns_get_ip(fd, domainname, server_ip6, 6) == 0) {
> - printf("\n DNS failed for IPV6\n");
> - return -1;
> - }
> - ipv6_to_str(server_ip6, server_ip);
> -
> - strcpy(filename,(tmp1+1));
> - free(raw);
> - return 0;
> - }
> -
> -}
> diff --git a/lib/libnet/tftp.c b/lib/libnet/tftp.c
> index 108092b..cda8bf3 100644
> --- a/lib/libnet/tftp.c
> +++ b/lib/libnet/tftp.c
> @@ -21,6 +21,7 @@
> #include <ipv4.h>
> #include <ipv6.h>
> #include <udp.h>
> +#include <dns.h>
>
> //#define __DEBUG__
>
> @@ -593,3 +594,106 @@ int tftp(filename_ip_t * _fn_ip, unsigned char *_buffer, int _len,
>
> return received_len;
> }
> +
> +/**
> + * Parses a tftp arguments, extracts all
> + * parameters and fills server ip according to this
> + *
> + * Parameters:
> + * @param buffer string with arguments,
> + * @param server_ip server ip as result
> + * @param filename default filename
> + * @param fd Socket descriptor
> + * @param len len of the buffer,
> + * @return 0 on SUCCESS and -1 on failure
> + */
> +int parse_tftp_args(char buffer[], char *server_ip, char filename[], int fd,
> + int len)
> +{
> + char *raw;
> + char *tmp, *tmp1;
> + int i, j = 0;
> + char domainname[256];
> + uint8_t server_ip6[16];
> +
> + raw = malloc(len);
> + if (raw == NULL) {
> + printf("\n unable to allocate memory, parsing failed\n");
> + return -1;
> + }
> + strncpy(raw, (const char *)buffer, len);
> + /* tftp url contains tftp://[fd00:4f53:4444:90:214:5eff:fed9:b200]/testfile */
> + if (strncmp(raw, "tftp://", 7)){
> + printf("\n tftp missing in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + tmp = strchr(raw, '[');
> + if (tmp != NULL && *tmp == '[') {
> + /* check for valid ipv6 address */
> + tmp1 = strchr(tmp, ']');
> + if (tmp1 == NULL) {
> + printf("\n missing ] in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + i = tmp1 - tmp;
> + /* look for file name */
> + tmp1 = strchr(tmp, '/');
> + if (tmp1 == NULL) {
> + printf("\n missing filename in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + tmp[i] = '\0';
> + /* check for 16 byte ipv6 address */
> + if (!str_to_ipv6(tmp + 1, (uint8_t *)server_ip)) {
> + printf("\n wrong format IPV6 address in %s\n", raw);
> + free(raw);
> + return -1;;
> + }
> + else {
> + /* found filename */
> + strcpy(filename, tmp1 + 1);
> + free(raw);
> + return 0;
> + }
> + }
> + else {
> + /* here tftp://hostname/testfile from option request of dhcp */
> + /* look for dns server name */
> + tmp1 = strchr(raw, '.');
> + if (tmp1 == NULL) {
> + printf("\n missing . seperator in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + /* look for domain name beyond dns server name
> + * so ignore the current . and look for one more */
> + tmp = strchr(tmp1 + 1, '.');
> + if (tmp == NULL) {
> + printf("\n missing domain in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + tmp1 = strchr(tmp1, '/');
> + if (tmp1 == NULL) {
> + printf("\n missing filename in %s\n", raw);
> + free(raw);
> + return -1;
> + }
> + j = tmp1 - (raw + 7);
> + tmp = raw + 7;
> + tmp[j] = '\0';
> + strcpy(domainname, tmp);
> + if (dns_get_ip(fd, domainname, server_ip6, 6) == 0) {
> + printf("\n DNS failed for IPV6\n");
> + return -1;
> + }
> + ipv6_to_str(server_ip6, server_ip);
> +
> + strcpy(filename, tmp1 + 1);
> + free(raw);
> + return 0;
> + }
> +}
>
--
Alexey
More information about the SLOF
mailing list