123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 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
|