mraa.c: made imraa mraa_add_from_lockfile more robust
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
49
src/mraa.c
49
src/mraa.c
@@ -44,6 +44,8 @@
|
|||||||
|
|
||||||
#if defined(IMRAA)
|
#if defined(IMRAA)
|
||||||
#include <json-c/json.h>
|
#include <json-c/json.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "mraa_internal.h"
|
#include "mraa_internal.h"
|
||||||
@@ -148,12 +150,7 @@ imraa_init()
|
|||||||
|
|
||||||
#if defined(IMRAA)
|
#if defined(IMRAA)
|
||||||
const char* subplatform_lockfile = "/tmp/imraa.lock";
|
const char* subplatform_lockfile = "/tmp/imraa.lock";
|
||||||
if (access(subplatform_lockfile, F_OK) != -1 ){
|
mraa_add_from_lockfile(subplatform_lockfile);
|
||||||
uint32_t plat_n = mraa_add_from_lockfile(subplatform_lockfile);
|
|
||||||
syslog(LOG_INFO, "imraa: added %d platforms", plat_n);
|
|
||||||
} else {
|
|
||||||
syslog(LOG_DEBUG, "imraa: no lockfile found");
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Look for IIO devices
|
// Look for IIO devices
|
||||||
@@ -988,27 +985,30 @@ mraa_add_subplatform(mraa_platform_t subplatformtype, const char* uart_dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(IMRAA)
|
#if defined(IMRAA)
|
||||||
uint32_t
|
mraa_result_t
|
||||||
mraa_add_from_lockfile(const char* imraa_lock_file) {
|
mraa_add_from_lockfile(const char* imraa_lock_file)
|
||||||
|
{
|
||||||
|
mraa_result_t ret = MRAA_SUCCESS;
|
||||||
mraa_platform_t type = plat->platform_type;
|
mraa_platform_t type = plat->platform_type;
|
||||||
char* buffer = NULL;
|
char* buffer = NULL;
|
||||||
long fsize;
|
off_t file_size;
|
||||||
|
struct stat st;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
uint32_t subplat_num = 0;
|
uint32_t subplat_num = 0;
|
||||||
FILE* flock = fopen(imraa_lock_file, "r");
|
int flock = open(imraa_lock_file, O_RDONLY);
|
||||||
if (flock == NULL) {
|
if (flock == -1) {
|
||||||
fprintf(stderr, "Failed to open lock file\n");
|
syslog(LOG_ERR, "imraa: Failed to open lock file");
|
||||||
return 0;
|
return MRAA_ERROR_INVALID_RESOURCE;
|
||||||
}
|
}
|
||||||
fseek(flock, 0, SEEK_END);
|
if (fstat(flock, &st) != 0 || (!S_ISREG(st.st_mode))) {
|
||||||
fsize = ftell(flock) + 1;
|
close(flock);
|
||||||
fseek(flock, 0, SEEK_SET);
|
return MRAA_ERROR_INVALID_RESOURCE;
|
||||||
buffer = (char*) calloc(fsize, sizeof(char));
|
|
||||||
if (buffer != NULL) {
|
|
||||||
int result = fread(buffer, sizeof(char), fsize, flock);
|
|
||||||
if (result != fsize) {
|
|
||||||
printf("imraa lockfile reading error");
|
|
||||||
}
|
}
|
||||||
|
buffer = mmap(0, st.st_size, PROT_READ, MAP_SHARED, flock, 0);
|
||||||
|
close(flock);
|
||||||
|
if (buffer == MAP_FAILED) {
|
||||||
|
syslog(LOG_ERR, "imraa: lockfile read error");
|
||||||
|
return MRAA_ERROR_INVALID_RESOURCE;
|
||||||
}
|
}
|
||||||
json_object* jobj_lock = json_tokener_parse(buffer);
|
json_object* jobj_lock = json_tokener_parse(buffer);
|
||||||
|
|
||||||
@@ -1038,11 +1038,10 @@ mraa_add_from_lockfile(const char* imraa_lock_file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "lockfile string incorrectly parsed\n");
|
ret = MRAA_ERROR_INVALID_RESOURCE;
|
||||||
}
|
}
|
||||||
json_object_put(jobj_lock);
|
json_object_put(jobj_lock);
|
||||||
free(buffer);
|
munmap(buffer, st.st_size);
|
||||||
fclose(flock);
|
return ret;
|
||||||
return subplat_num;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user