aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorThomas Huth <thuth@redhat.com>2017-07-07 09:13:05 +0200
committerAlexey Kardashevskiy <aik@ozlabs.ru>2017-07-10 12:21:09 +1000
commit834113a1c67d6fb53dea153c3313d182238f2d36 (patch)
tree5e84b42a090627a392aece3812d0253c14b75d33 /lib
parent64215f41aafd182e51947dc5d544e5ebaab744ca (diff)
downloadSLOF-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.c106
-rw-r--r--lib/libnet/tftp.c104
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;
+ }
+}