diff options
Diffstat (limited to 'package/raspberrypi-usbboot/0003-main.c-rework-logic-to-find-def1-def2-and-def3-files.patch')
-rw-r--r-- | package/raspberrypi-usbboot/0003-main.c-rework-logic-to-find-def1-def2-and-def3-files.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/package/raspberrypi-usbboot/0003-main.c-rework-logic-to-find-def1-def2-and-def3-files.patch b/package/raspberrypi-usbboot/0003-main.c-rework-logic-to-find-def1-def2-and-def3-files.patch new file mode 100644 index 0000000000..30cde49f34 --- /dev/null +++ b/package/raspberrypi-usbboot/0003-main.c-rework-logic-to-find-def1-def2-and-def3-files.patch @@ -0,0 +1,127 @@ +From 935894908dc24acda0acea7d211a9d80e55ecadb Mon Sep 17 00:00:00 2001 +From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +Date: Fri, 2 Dec 2016 23:43:23 +0100 +Subject: [PATCH] main.c: rework logic to find def1, def2 and def3 files + +The current logic to find def1, def2 and def3 first tries to find them +in the local directory, and if they are not available, find them in +/usr/share. + +However, this doesn't work if rpiboot and its related files are +installed, but not in /usr. In order to address this use-case, this +commit reworks the logic to find the file path. + +A new function, getfilepath() is created. If the requested file is +available in the current directory, it is used. If not, then the path to +the file is inferred from the location of the currently running +program. I.e if we run /home/foo/sys/bin/rpiboot, then we will search +def1 in usbbootcode.bin in +/home/foo/sys/bin/../share/rpiboot/usbbootcode.bin. + +This continues to address the case of an installation in /usr, while +allowing installation in other locations as well. + +Submitted-upstream: https://github.com/raspberrypi/usbboot/pull/2 +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +--- + main.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 48 insertions(+), 13 deletions(-) + +diff --git a/main.c b/main.c +index 1b4e042..7c571d6 100755 +--- a/main.c ++++ b/main.c +@@ -1,10 +1,12 @@ +-#include "libusb-1.0/libusb.h" ++#define _GNU_SOURCE + #include <stdio.h> + #include <stdlib.h> + #include <string.h> +- ++#include <libgen.h> + #include <unistd.h> + ++#include "libusb-1.0/libusb.h" ++ + int verbose = 0; + int out_ep = 1; + int in_ep = 2; +@@ -146,6 +148,37 @@ int ep_read(unsigned char *buf, int len, libusb_device_handle * usb_device) + return len; + } + ++char *getfilepath(char *filename) ++{ ++ char *progpath, *filepath, *progdir; ++ ssize_t len; ++ ++ /* If file is available locally, use it */ ++ if (access(filename, F_OK) != -1) ++ return filename; ++ ++ /* Otherwise, use the installed version */ ++ progpath = malloc(PATH_MAX); ++ len = readlink("/proc/self/exe", progpath, PATH_MAX - 1); ++ if (len == -1) ++ { ++ free(progpath); ++ return NULL; ++ } ++ ++ progpath[len] = '\0'; ++ progdir = dirname(progpath); ++ if (asprintf(&filepath, "%s/../share/rpiboot/%s", progdir, filename) < 0) ++ { ++ free(progpath); ++ return NULL; ++ } ++ ++ free(progpath); ++ ++ return filepath; ++} ++ + int main(int argc, char *argv[]) + { + int result; +@@ -157,13 +190,9 @@ int main(int argc, char *argv[]) + int last_serial = -1; + FILE *fp1, *fp2, *fp; + +- char def1_inst[] = "/usr/share/rpiboot/usbbootcode.bin"; +- char def2_inst[] = "/usr/share/rpiboot/msd.elf"; +- char def3_inst[] = "/usr/share/rpiboot/buildroot.elf"; +- +- char def1_loc[] = "./usbbootcode.bin"; +- char def2_loc[] = "./msd.elf"; +- char def3_loc[] = "./buildroot.elf"; ++ char def1_name[] = "usbbootcode.bin"; ++ char def2_name[] = "msd.elf"; ++ char def3_name[] = "buildroot.elf"; + + char *def1, *def2, *def3; + +@@ -171,10 +200,16 @@ int main(int argc, char *argv[]) + char *fatimage = NULL, *executable = NULL; + int loop = 0; + +-// if local file version exists use it else use installed +- if( access( def1_loc, F_OK ) != -1 ) { def1 = def1_loc; } else { def1 = def1_inst; } +- if( access( def2_loc, F_OK ) != -1 ) { def2 = def2_loc; } else { def2 = def2_inst; } +- if( access( def3_loc, F_OK ) != -1 ) { def3 = def3_loc; } else { def3 = def3_inst; } ++ def1 = getfilepath(def1_name); ++ def2 = getfilepath(def2_name); ++ def3 = getfilepath(def3_name); ++ ++ if (!def1 || !def2 || !def3) ++ { ++ fprintf(stderr, "One of %s, %s or %s cannot be found\n", ++ def1_name, def2_name, def3_name); ++ exit(1); ++ } + + stage1 = def1; + stage2 = def2; +-- +2.7.4 + |