summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml44
-rw-r--r--README2
-rw-r--r--config.mk2
-rw-r--r--src/Makefile6
-rw-r--r--src/cal.c6
-rw-r--r--src/disk.c107
-rw-r--r--src/disk.h1
-rw-r--r--src/image.c39
-rw-r--r--src/image.h1
-rw-r--r--src/main.c40
-rw-r--r--src/operations.c5
-rw-r--r--src/usb-device.c2
12 files changed, 171 insertions, 84 deletions
diff --git a/.travis.yml b/.travis.yml
index b623f9a..6d6b33f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,26 +1,32 @@
+sudo: false
+
language: c
+
compiler:
- gcc
- clang
-before_install:
- - sudo apt-get update -qq
- - sudo apt-get install -qq -y libusb-dev
-script: if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make ; fi
-matrix:
- exclude:
- - compiler: clang
- - env: COVERITY_SCAN_BRANCH=1
+addons: &addons
+ apt:
+ packages:
+ - libusb-dev
-env:
- global:
- - secure: "JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI="
+matrix:
+ include:
+ - compiler: gcc
+ if: (branch = master) AND (type != pull_request)
+ env:
+ - secure: "JdUp+xFykPZoYA4aRfmYk2CtilLapniQllWPKo2dDdJd1vzdawfTvVxIAKjy7ac9RKwZzg3Chq3RsMEXPv8BtaLbssw266C7RDLMgjacl1eFLcmGRj/Gkk9peDSZ6vVdGEcA2j+6KDSfpCa/XjFjvOufZOgKw6m+3+d0A4G45SI="
+ addons:
+ <<: *addons
+ coverity_scan:
+ project:
+ name: "pali/0xFFFF"
+ description: "Build submitted via Travis CI"
+ notification_email: pali.rohar@gmail.com
+ build_command: make
+ branch_pattern: master
-addons:
- coverity_scan:
- project:
- name: "pali/0xFFFF"
- description: "Build submitted via Travis CI"
- notification_email: pali.rohar@gmail.com
- build_command: make
- branch_pattern: master
+script:
+ - if [ -n "$COVERITY_SCAN_TOKEN" ]; then exit 0; fi
+ - make
diff --git a/README b/README
index 76367fa..5177816 100644
--- a/README
+++ b/README
@@ -23,7 +23,7 @@ R&D mode, changing HW revision strings, ...).
by Nokia fiasco-gen.
Use it with CARE. This is an experimental tool and it can brick your device.
-It's not suposed to be stable, so nokia will probably release incompatible
+It's not supposed to be stable, so nokia will probably release incompatible
bootloaders to break this tool. USE IT AT YOUR OWN RISK.
PLEASE. Read carefully all the documentation inside doc/* for more information
diff --git a/config.mk b/config.mk
index 1d5f3ad..85c7684 100644
--- a/config.mk
+++ b/config.mk
@@ -1,4 +1,4 @@
-VERSION = 0.7
+VERSION = 0.8
PREFIX = /usr/local
# NetBSD stuff
diff --git a/src/Makefile b/src/Makefile
index be4ade6..0f05ed6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -5,9 +5,9 @@ INSTALL ?= install
BUILD_DATE ?= $(shell LC_ALL=C date '+%b %e %Y')
-CC = gcc
-CROSS_CC = $(CROSS_COMPILE)$(CC)
-HOST_CC = $(HOST_COMPILE)$(CC)
+CC ?= cc
+CROSS_CC ?= $(CROSS_COMPILE)$(CC)
+HOST_CC ?= $(HOST_COMPILE)$(CC)
CPPFLAGS += -DVERSION=\"$(VERSION)\" -DBUILD_DATE="\"$(BUILD_DATE)\"" -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64
CFLAGS += -W -Wall -O2 -pedantic -std=c99
diff --git a/src/cal.c b/src/cal.c
index 4d07e5e..0688aa9 100644
--- a/src/cal.c
+++ b/src/cal.c
@@ -76,14 +76,14 @@ int cal_init_file(const char * file, struct cal ** cal_out) {
off_t lsize = 0;
#endif
- if ( stat(file, &st) != 0 )
- return -1;
-
fd = open(file, O_RDONLY);
if ( fd < 0 )
return -1;
+ if ( fstat(fd, &st) != 0 )
+ goto err;
+
if ( S_ISREG(st.st_mode) )
size = st.st_size;
else if ( S_ISBLK(st.st_mode) ) {
diff --git a/src/disk.c b/src/disk.c
index 6bdd974..f58b1dd 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -51,6 +51,7 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
DIR * dir;
struct dirent * dirent;
int found;
+ int old_errno;
size_t len;
char blkdev[1024];
@@ -117,6 +118,18 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
blkdev[len] = 0;
+ fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL | O_NONBLOCK);
+ if ( fd < 0 ) {
+ ERROR_INFO("Cannot open block device %s", blkdev);
+ return -1;
+ } else {
+ if ( fstat(fd, &st) != 0 || ! S_ISBLK(st.st_mode) || makedev(maj, min) != st.st_rdev ) {
+ ERROR("Block device %s does not have id %d:%d\n", blkdev, maj, min);
+ close(fd);
+ return -1;
+ }
+ }
+
} else if ( partition > 0 ) {
/* Select partition */
@@ -127,35 +140,48 @@ int disk_open_dev(int maj, int min, int partition, int readonly) {
return -1;
}
- memcpy(blkdev+len, "p1", 3);
- if ( stat(blkdev, &st) != 0 || ! S_ISBLK(st.st_mode) ) {
- memcpy(blkdev+len, "1", 2);
- if ( stat(blkdev, &st) != 0 || ! S_ISBLK(st.st_mode) ) {
- blkdev[len] = 0;
- fd = open(blkdev, O_RDONLY);
- if ( fd < 0 ) {
- if ( errno != ENOMEDIUM ) {
- ERROR_INFO("Cannot open block device %s", blkdev);
- return -1;
- }
- } else {
- close(fd);
- ERROR("Block device does not have partitions");
- return -1;
- }
+ if ( snprintf(blkdev+len, sizeof(blkdev)-len, "p%d", partition) >= (int)(sizeof(blkdev)-len) ) {
+ ERROR("Block device name is too long");
+ return -1;
+ }
+ fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
+ if ( fd < 0 && errno == ENOENT ) {
+ if ( snprintf(blkdev+len, sizeof(blkdev)-len, "%d", partition) >= (int)(sizeof(blkdev)-len) ) {
+ ERROR("Block device name is too long");
+ return -1;
+ }
+ fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
+ }
+ if ( fd < 0 && errno == ENOENT ) {
+ blkdev[len] = 0;
+ fd = open(blkdev, O_RDONLY | O_NONBLOCK);
+ if ( fd < 0 ) {
+ ERROR_INFO("Cannot open block device %s", blkdev);
+ } else {
+ close(fd);
+ ERROR("Block device %s does not have partitions", blkdev);
}
+ return -1;
}
+ if ( fd < 0 )
+ old_errno = errno;
printf("Found block device %s for partition %d\n", blkdev, partition);
- }
+ if ( fd < 0 ) {
+ errno = old_errno;
+ ERROR_INFO("Cannot open block device %s", blkdev);
+ } else if ( fstat(fd, &st) != 0 || ! S_ISBLK(st.st_mode) ) {
+ ERROR("Block device %s is not block device\n", blkdev);
+ close(fd);
+ return -1;
+ }
- fd = open(blkdev, (readonly ? O_RDONLY : O_RDWR) | O_EXCL);
+ } else {
+
+ ERROR("Invalid partition %d for block device %s", partition, blkdev);
+ fd = -1;
- if ( fd < 0 ) {
- if ( errno != ENOMEDIUM )
- ERROR_INFO("Cannot open block device %s", blkdev);
- return -1;
}
return fd;
@@ -195,7 +221,7 @@ int disk_dump_dev(int fd, const char * file) {
#else
blksize = lseek(fd, 0, SEEK_END);
- if ( blksize == (off_t)-1 ) {
+ if ( (off_t)blksize == (off_t)-1 ) {
ERROR_INFO("Cannot get size of block device");
return -1;
}
@@ -207,11 +233,6 @@ int disk_dump_dev(int fd, const char * file) {
#endif
- if ( blksize > ULLONG_MAX ) {
- ERROR("Block device is too big");
- return -1;
- }
-
if ( blksize == 0 ) {
ERROR("Block device has zero size");
return -1;
@@ -281,6 +302,7 @@ int disk_init(struct usb_device_info * dev) {
int maj2;
int min1;
int min2;
+ int tmp;
maj1 = -1;
maj2 = -1;
@@ -341,9 +363,17 @@ int disk_init(struct usb_device_info * dev) {
fclose(f);
- if ( devnum != device->devnum || device->bus->location != busnum )
+ if ( device->devnum != devnum )
continue;
+ if ( device->bus->location ) {
+ if ( device->bus->location != busnum )
+ continue;
+ } else if ( device->bus->dirname[0] ) {
+ if ( atoi(device->bus->dirname) != (int)busnum )
+ continue;
+ }
+
if ( sscanf(dirent->d_name, "%d:%d", &maj2, &min2) != 2 ) {
maj2 = -1;
min2 = -1;
@@ -367,6 +397,16 @@ int disk_init(struct usb_device_info * dev) {
return -1;
}
+ /* Ensure that maj1:min1 is first device and maj2:min2 is second device */
+ if ( min2 != -1 && min2 < min1 ) {
+ tmp = min1;
+ min1 = min2;
+ min2 = tmp;
+ tmp = maj1;
+ maj1 = maj2;
+ maj2 = tmp;
+ }
+
/* TODO: change 1 to 0 when disk_flash_dev will be implemented */
/* RX-51 and RM-680 export MyDocs in first usb device and just first partion, so host system see whole device without MBR table */
@@ -378,7 +418,7 @@ int disk_init(struct usb_device_info * dev) {
else
fd = disk_open_dev(maj1, min1, 1, 1);
- if ( fd < 0 && errno != ENOMEDIUM )
+ if ( fd < 0 )
return -1;
dev->data = fd;
@@ -394,6 +434,13 @@ int disk_init(struct usb_device_info * dev) {
}
+void disk_exit(struct usb_device_info * dev) {
+
+ if ( dev->data >= 0 )
+ close(dev->data);
+
+}
+
enum device disk_get_device(struct usb_device_info * dev) {
return dev->device;
diff --git a/src/disk.h b/src/disk.h
index d5f367d..15eb127 100644
--- a/src/disk.h
+++ b/src/disk.h
@@ -24,6 +24,7 @@
#include "usb-device.h"
int disk_init(struct usb_device_info * dev);
+void disk_exit(struct usb_device_info * dev);
enum device disk_get_device(struct usb_device_info * dev);
diff --git a/src/image.c b/src/image.c
index 9cb3e41..b78633b 100644
--- a/src/image.c
+++ b/src/image.c
@@ -162,8 +162,10 @@ static int image_append(struct image * image, const char * type, const char * de
image->hash = image_hash_from_data(image);
image->devices = calloc(1, sizeof(struct device_list));
- if ( ! image->devices )
- return -1;
+ if ( ! image->devices ) {
+ image_free(image);
+ ALLOC_ERROR_RETURN(-1);
+ }
image->devices->device = DEVICE_ANY;
@@ -244,22 +246,33 @@ static struct image * image_alloc(void) {
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
+ int fd;
+
+ fd = open(file, O_RDONLY);
+ if ( fd < 0 ) {
+ ERROR_INFO("Cannot open image file %s", file);
+ return NULL;
+ }
+
+ return image_alloc_from_fd(fd, file, type, device, hwrevs, version, layout);
+
+}
+
+struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
+
off_t offset;
struct image * image = image_alloc();
- if ( ! image )
+ if ( ! image ) {
+ close(fd);
return NULL;
+ }
image->is_shared_fd = 0;
- image->fd = open(file, O_RDONLY);
- if ( image->fd < 0 ) {
- ERROR_INFO("Cannot open image file %s", file);
- free(image);
- return NULL;
- }
+ image->fd = fd;
offset = lseek(image->fd, 0, SEEK_END);
if ( offset == (off_t)-1 ) {
- ERROR_INFO("Cannot seek to end of file %s", file);
+ ERROR_INFO("Cannot seek to end of file %s", orig_filename);
close(image->fd);
free(image);
return NULL;
@@ -268,10 +281,10 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
image->size = offset;
image->offset = 0;
image->cur = 0;
- image->orig_filename = strdup(file);
+ image->orig_filename = strdup(orig_filename);
if ( lseek(image->fd, 0, SEEK_SET) == (off_t)-1 ) {
- ERROR_INFO("Cannot seek to begin of file %s", file);
+ ERROR_INFO("Cannot seek to begin of file %s", orig_filename);
close(image->fd);
free(image->orig_filename);
free(image);
@@ -282,7 +295,7 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
return NULL;
if ( ( ! type || ! type[0] ) && ( ! device || ! device[0] ) && ( ! hwrevs || ! hwrevs[0] ) && ( ! version || ! version[0] ) )
- image_missing_values_from_name(image, file);
+ image_missing_values_from_name(image, orig_filename);
image_align(image);
diff --git a/src/image.h b/src/image.h
index 709fef7..42111bf 100644
--- a/src/image.h
+++ b/src/image.h
@@ -64,6 +64,7 @@ struct image_list {
};
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
+struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, uint16_t hash, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
void image_free(struct image * image);
void image_seek(struct image * image, size_t whence);
diff --git a/src/main.c b/src/main.c
index 40f367a..a43512b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -155,16 +155,24 @@ static void parse_image_arg(char * arg, struct image_list ** image_first) {
char * version;
char * layout;
char * layout_file;
+ int fd;
/* First check if arg is file, then try to parse arg format */
- if ( stat(arg, &st) == 0 ) {
- image = image_alloc_from_file(arg, NULL, NULL, NULL, NULL, NULL);
- if ( ! image ) {
- ERROR("Cannot load image file %s", arg);
- exit(1);
+ fd = open(arg, O_RDONLY);
+ if ( fd >= 0 ) {
+ if ( fstat(fd, &st) == 0 && !S_ISDIR(st.st_mode) ) {
+ image = image_alloc_from_fd(fd, arg, NULL, NULL, NULL, NULL, NULL);
+ if ( ! image ) {
+ ERROR("Cannot load image file %s", arg);
+ exit(1);
+ }
+ image_list_add(image_first, image);
+ return;
}
- image_list_add(image_first, image);
- return;
+ close(fd);
+ } else if ( errno != ENOENT ) {
+ ERROR("Cannot load image file %s", arg);
+ exit(1);
}
layout_file = strchr(arg, '%');
@@ -1239,6 +1247,8 @@ int main(int argc, char **argv) {
if ( chdir(buf) < 0 )
ERROR_INFO("Cannot chdir back to %s", buf);
+ printf("Done\n");
+
}
/* dump fiasco */
@@ -1319,14 +1329,12 @@ int main(int argc, char **argv) {
for ( i = 0; i < IMAGE_COUNT; ++i ) {
- struct stat st;
+ int rename_ret;
+ int rename_errno;
if ( ! image_tmp_name(i) )
continue;
- if ( stat(image_tmp_name(i), &st) != 0 )
- continue;
-
switch ( i ) {
case IMAGE_2ND:
case IMAGE_XLOADER:
@@ -1357,10 +1365,18 @@ int main(int argc, char **argv) {
buf[0] = 0;
snprintf(buf, sizeof(buf), "%s-%s:%hd_%s", image_type_to_string(i), device_to_string(dev->detected_device), dev->detected_hwrev, ptr);
+
+ rename_ret = rename(image_tmp_name(i), buf);
+ rename_errno = errno;
+
+ if ( rename_ret < 0 && rename_errno == ENOENT )
+ continue;
+
printf("Renaming %s image file to %s...\n", image_type_to_string(i), buf);
- if ( rename(image_tmp_name(i), buf) < 0 ) {
+ if ( rename_ret < 0 ) {
+ errno = rename_errno;
ERROR_INFO("Renaming failed");
buf[0] = 0;
diff --git a/src/operations.c b/src/operations.c
index cd7ef44..b3be2c7 100644
--- a/src/operations.c
+++ b/src/operations.c
@@ -91,8 +91,11 @@ clean:
void dev_free(struct device_info * dev) {
- if ( dev->usb )
+ if ( dev->usb ) {
+ if ( dev->usb->flash_device->protocol == FLASH_DISK )
+ disk_exit(dev->usb);
usb_close_device(dev->usb);
+ }
free(dev);
}
diff --git a/src/usb-device.c b/src/usb-device.c
index 5379b82..f7c16bb 100644
--- a/src/usb-device.c
+++ b/src/usb-device.c
@@ -47,7 +47,7 @@
static struct usb_flash_device usb_devices[] = {
{ 0x0421, 0x0096, -1, -1, -1, FLASH_DISK, { DEVICE_RX_44, 0 } },
- { 0x0421, 0x0105, 2, 1, -1, FLASH_NOLO, { DEVICE_SU_18, DEVICE_RX_44, DEVICE_RX_48, DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } },
+ { 0x0421, 0x0105, 2, 1, -1, FLASH_NOLO, { DEVICE_SU_18, DEVICE_RX_34, DEVICE_RX_44, DEVICE_RX_48, DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } },
{ 0x0421, 0x0106, 0, -1, -1, FLASH_COLD, { DEVICE_RX_51, DEVICE_RM_680, DEVICE_RM_696, 0 } },
{ 0x0421, 0x0189, -1, -1, -1, FLASH_DISK, { DEVICE_RX_48, 0 } },
{ 0x0421, 0x01c7, -1, -1, -1, FLASH_DISK, { DEVICE_RX_51, 0 } },