diff options
author | Thomas Huth <thuth@redhat.com> | 2017-07-07 09:13:05 +0200 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2017-07-10 12:21:09 +1000 |
commit | 834113a1c67d6fb53dea153c3313d182238f2d36 (patch) | |
tree | 5e84b42a090627a392aece3812d0253c14b75d33 /lib | |
parent | 64215f41aafd182e51947dc5d544e5ebaab744ca (diff) | |
download | SLOF-834113a1c67d6fb53dea153c3313d182238f2d36.zip SLOF-834113a1c67d6fb53dea153c3313d182238f2d36.tar.gz SLOF-834113a1c67d6fb53dea153c3313d182238f2d36.tar.bz2 |
libnet: Move parse_tftp_args to tftp.c
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.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libnet/netload.c | 106 | ||||
-rw-r--r-- | 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; + } +} |