diff --git a/plugins/mbpi.c b/plugins/mbpi.c index ffcdb9b80..45a3bd6a5 100644 --- a/plugins/mbpi.c +++ b/plugins/mbpi.c @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -37,10 +38,8 @@ #include #include -#ifndef MBPI_DATABASE -#define MBPI_DATABASE "/usr/share/mobile-broadband-provider-info/" \ - "serviceproviders.xml" -#endif +#define MBPI_FILE "serviceproviders.xml" +#define MBPI_DATABASE "/usr/share/mobile-broadband-provider-info/" MBPI_FILE #include "mbpi.h" @@ -110,7 +109,7 @@ static void mbpi_g_set_error(GMarkupParseContext *context, GError **error, va_end(ap); - g_prefix_error(error, "%s:%d ", MBPI_DATABASE, line_number); + g_prefix_error(error, "%s:%d ", MBPI_FILE, line_number); } static void text_handler(GMarkupParseContext *context, @@ -565,24 +564,30 @@ static gboolean mbpi_parse(const GMarkupParser *parser, gpointer userdata, char *db; int fd; GMarkupParseContext *context; - gboolean ret; + gboolean ret = FALSE; + const char *snap; + char *filename; + + /* SNAP is a path to our data in snappy systems */ + snap = getenv("SNAP"); + filename = g_strdup_printf("%s%s", snap ? snap : "", MBPI_DATABASE); - fd = open(MBPI_DATABASE, O_RDONLY); + fd = open(filename, O_RDONLY); if (fd < 0) { g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(errno), - "open(%s) failed: %s", MBPI_DATABASE, + "open(%s) failed: %s", filename, g_strerror(errno)); - return FALSE; + goto done; } if (fstat(fd, &st) < 0) { close(fd); g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(errno), - "fstat(%s) failed: %s", MBPI_DATABASE, + "fstat(%s) failed: %s", filename, g_strerror(errno)); - return FALSE; + goto done; } db = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); @@ -590,9 +595,9 @@ static gboolean mbpi_parse(const GMarkupParser *parser, gpointer userdata, close(fd); g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(errno), - "mmap(%s) failed: %s", MBPI_DATABASE, + "mmap(%s) failed: %s", filename, g_strerror(errno)); - return FALSE; + goto done; } context = g_markup_parse_context_new(parser, @@ -608,6 +613,8 @@ static gboolean mbpi_parse(const GMarkupParser *parser, gpointer userdata, close(fd); g_markup_parse_context_free(context); +done: + g_free(filename); return ret; } diff --git a/plugins/phonesim.c b/plugins/phonesim.c index 2b65ce340..838f60777 100644 --- a/plugins/phonesim.c +++ b/plugins/phonesim.c @@ -1107,12 +1107,20 @@ static void parse_config(void) char **modems; int i; const char *filename; + char *snap_filename = NULL; + const char *conf_override = getenv("OFONO_PHONESIM_CONFIG"); + /* SNAP_COMMON gives us a writable path for daemons in snappy systems */ + const char *snap_common = getenv("SNAP_COMMON"); - char *conf_override = getenv("OFONO_PHONESIM_CONFIG"); - if (conf_override) + if (conf_override) { filename = conf_override; - else + } else if (snap_common) { + snap_filename = g_strdup_printf("%s/etc/phonesim.conf", + snap_common); + filename = snap_filename; + } else { filename = CONFIGDIR "/phonesim.conf"; + } DBG("filename %s", filename); @@ -1143,6 +1151,9 @@ static void parse_config(void) g_strfreev(modems); done: + if (snap_filename) + g_free(snap_filename); + g_key_file_free(keyfile); } diff --git a/plugins/u8500.c b/plugins/u8500.c index 59ec70bd9..3a73c3430 100644 --- a/plugins/u8500.c +++ b/plugins/u8500.c @@ -590,9 +590,18 @@ static void u8500_query_serial(struct ofono_devinfo *info, { char imei[16]; /* IMEI 15 digits + 1 null*/ char numbers[] = "1234567890"; - FILE *fp = fopen("/etc/imei", "r"); + FILE *fp; + char *imei_file; + /* SNAP_COMMON gives us a writable path for daemons in snappy systems */ + const char *snap_common = getenv("SNAP_COMMON"); + DBG(""); + imei_file = g_strdup_printf("%s/etc/imei", + snap_common ? snap_common : ""); + fp = fopen(imei_file, "r"); + g_free(imei_file); + if (fp == NULL) { DBG("failed to open /etc/imei file"); goto error; diff --git a/src/simfs.c b/src/simfs.c index c62667e85..873bd0dd9 100644 --- a/src/simfs.c +++ b/src/simfs.c @@ -42,12 +42,12 @@ #include "storage.h" #define SIM_CACHE_MODE 0600 -#define SIM_CACHE_BASEPATH STORAGEDIR "/%s-%i" +#define SIM_CACHE_BASEPATH "%s/%s-%i" #define SIM_CACHE_VERSION SIM_CACHE_BASEPATH "/version" #define SIM_CACHE_PATH SIM_CACHE_BASEPATH "/%04x" #define SIM_CACHE_HEADER_SIZE 39 #define SIM_FILE_INFO_SIZE 7 -#define SIM_IMAGE_CACHE_BASEPATH STORAGEDIR "/%s-%i/images" +#define SIM_IMAGE_CACHE_BASEPATH "%s/%s-%i/images" #define SIM_IMAGE_CACHE_PATH SIM_IMAGE_CACHE_BASEPATH "/%d.xpm" #define SIM_FS_VERSION 2 @@ -653,7 +653,8 @@ static void sim_fs_op_cache_fileinfo(struct sim_fs *fs, fileinfo[5] = record_length & 0xff; fileinfo[6] = file_status; - path = g_strdup_printf(SIM_CACHE_PATH, imsi, phase, op->id); + path = g_strdup_printf(SIM_CACHE_PATH, + storage_dir(), imsi, phase, op->id); fs->fd = TFR(open(path, O_WRONLY | O_CREAT | O_TRUNC, SIM_CACHE_MODE)); g_free(path); @@ -750,7 +751,8 @@ static gboolean sim_fs_op_check_cached(struct sim_fs *fs) if (imsi == NULL || phase == OFONO_SIM_PHASE_UNKNOWN) return FALSE; - path = g_strdup_printf(SIM_CACHE_PATH, imsi, phase, op->id); + path = g_strdup_printf(SIM_CACHE_PATH, + storage_dir(), imsi, phase, op->id); if (path == NULL) return FALSE; @@ -1117,8 +1119,8 @@ void sim_fs_cache_image(struct sim_fs *fs, const char *image, int id) return; write_file((const unsigned char *) image, strlen(image), - SIM_CACHE_MODE, SIM_IMAGE_CACHE_PATH, imsi, - phase, id); + SIM_CACHE_MODE, SIM_IMAGE_CACHE_PATH, + storage_dir(), imsi, phase, id); } char *sim_fs_get_cached_image(struct sim_fs *fs, int id) @@ -1143,7 +1145,8 @@ char *sim_fs_get_cached_image(struct sim_fs *fs, int id) if (phase == OFONO_SIM_PHASE_UNKNOWN) return NULL; - path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, imsi, phase, id); + path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, + storage_dir(), imsi, phase, id); TFR(stat(path, &st_buf)); fd = TFR(open(path, O_RDONLY)); @@ -1183,7 +1186,7 @@ static void remove_cachefile(const char *imsi, enum ofono_sim_phase phase, if (sscanf(file->d_name, "%4x", &id) != 1) return; - path = g_strdup_printf(SIM_CACHE_PATH, imsi, phase, id); + path = g_strdup_printf(SIM_CACHE_PATH, storage_dir(), imsi, phase, id); remove(path); g_free(path); } @@ -1200,7 +1203,8 @@ static void remove_imagefile(const char *imsi, enum ofono_sim_phase phase, if (sscanf(file->d_name, "%d", &id) != 1) return; - path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, imsi, phase, id); + path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, + storage_dir(), imsi, phase, id); remove(path); g_free(path); } @@ -1214,21 +1218,24 @@ void sim_fs_check_version(struct sim_fs *fs) if (imsi == NULL || phase == OFONO_SIM_PHASE_UNKNOWN) return; - if (read_file(&version, 1, SIM_CACHE_VERSION, imsi, phase) == 1) + if (read_file(&version, 1, SIM_CACHE_VERSION, + storage_dir(), imsi, phase) == 1) if (version == SIM_FS_VERSION) return; sim_fs_cache_flush(fs); version = SIM_FS_VERSION; - write_file(&version, 1, SIM_CACHE_MODE, SIM_CACHE_VERSION, imsi, phase); + write_file(&version, 1, SIM_CACHE_MODE, SIM_CACHE_VERSION, + storage_dir(), imsi, phase); } void sim_fs_cache_flush(struct sim_fs *fs) { const char *imsi = ofono_sim_get_imsi(fs->sim); enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim); - char *path = g_strdup_printf(SIM_CACHE_BASEPATH, imsi, phase); + char *path = g_strdup_printf(SIM_CACHE_BASEPATH, + storage_dir(), imsi, phase); struct dirent **entries; int len = scandir(path, &entries, NULL, alphasort); @@ -1251,7 +1258,8 @@ void sim_fs_cache_flush_file(struct sim_fs *fs, int id) { const char *imsi = ofono_sim_get_imsi(fs->sim); enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim); - char *path = g_strdup_printf(SIM_CACHE_PATH, imsi, phase, id); + char *path = g_strdup_printf(SIM_CACHE_PATH, + storage_dir(), imsi, phase, id); remove(path); g_free(path); @@ -1261,7 +1269,8 @@ void sim_fs_image_cache_flush(struct sim_fs *fs) { const char *imsi = ofono_sim_get_imsi(fs->sim); enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim); - char *path = g_strdup_printf(SIM_IMAGE_CACHE_BASEPATH, imsi, phase); + char *path = g_strdup_printf(SIM_IMAGE_CACHE_BASEPATH, + storage_dir(), imsi, phase); struct dirent **entries; int len = scandir(path, &entries, NULL, alphasort); @@ -1283,7 +1292,8 @@ void sim_fs_image_cache_flush_file(struct sim_fs *fs, int id) { const char *imsi = ofono_sim_get_imsi(fs->sim); enum ofono_sim_phase phase = ofono_sim_get_phase(fs->sim); - char *path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, imsi, phase, id); + char *path = g_strdup_printf(SIM_IMAGE_CACHE_PATH, + storage_dir(), imsi, phase, id); remove(path); g_free(path); diff --git a/src/smsutil.c b/src/smsutil.c index 86468e512..87048893f 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -41,14 +41,14 @@ #define uninitialized_var(x) x = x #define SMS_BACKUP_MODE 0600 -#define SMS_BACKUP_PATH STORAGEDIR "/%s/sms_assembly" +#define SMS_BACKUP_PATH "%s/%s/sms_assembly" #define SMS_BACKUP_PATH_DIR SMS_BACKUP_PATH "/%s-%i-%i" #define SMS_BACKUP_PATH_FILE SMS_BACKUP_PATH_DIR "/%03i" -#define SMS_SR_BACKUP_PATH STORAGEDIR "/%s/sms_sr" +#define SMS_SR_BACKUP_PATH "%s/%s/sms_sr" #define SMS_SR_BACKUP_PATH_FILE SMS_SR_BACKUP_PATH "/%s-%s" -#define SMS_TX_BACKUP_PATH STORAGEDIR "/%s/tx_queue" +#define SMS_TX_BACKUP_PATH "%s/%s/tx_queue" #define SMS_TX_BACKUP_PATH_DIR SMS_TX_BACKUP_PATH "/%lu-%lu-%s" #define SMS_TX_BACKUP_PATH_FILE SMS_TX_BACKUP_PATH_DIR "/%03i" @@ -2410,7 +2410,7 @@ static void sms_assembly_load(struct sms_assembly *assembly, return; path = g_strdup_printf(SMS_BACKUP_PATH "/%s", - assembly->imsi, dir->d_name); + storage_dir(), assembly->imsi, dir->d_name); len = scandir(path, &segments, NULL, versionsort); g_free(path); @@ -2426,7 +2426,7 @@ static void sms_assembly_load(struct sms_assembly *assembly, continue; r = read_file(buf, sizeof(buf), SMS_BACKUP_PATH "/%s/%s", - assembly->imsi, + storage_dir(), assembly->imsi, dir->d_name, segments[i]->d_name); if (r < 0) continue; @@ -2435,7 +2435,7 @@ static void sms_assembly_load(struct sms_assembly *assembly, continue; path = g_strdup_printf(SMS_BACKUP_PATH "/%s/%s", - assembly->imsi, + storage_dir(), assembly->imsi, dir->d_name, segments[i]->d_name); r = stat(path, &segment_stat); g_free(path); @@ -2471,8 +2471,8 @@ static gboolean sms_assembly_store(struct sms_assembly *assembly, len = sms_serialize(buf, sms); - if (write_file(buf, len, SMS_BACKUP_MODE, - SMS_BACKUP_PATH_FILE, assembly->imsi, straddr, + if (write_file(buf, len, SMS_BACKUP_MODE, SMS_BACKUP_PATH_FILE, + storage_dir(), assembly->imsi, straddr, node->ref, node->max_fragments, seq) != len) return FALSE; @@ -2498,14 +2498,15 @@ static void sms_assembly_backup_free(struct sms_assembly *assembly, if (node->bitmap[offset] & bit) { path = g_strdup_printf(SMS_BACKUP_PATH_FILE, - assembly->imsi, straddr, + storage_dir(), assembly->imsi, straddr, node->ref, node->max_fragments, seq); unlink(path); g_free(path); } } - path = g_strdup_printf(SMS_BACKUP_PATH_DIR, assembly->imsi, straddr, + path = g_strdup_printf(SMS_BACKUP_PATH_DIR, storage_dir(), + assembly->imsi, straddr, node->ref, node->max_fragments); rmdir(path); g_free(path); @@ -2523,7 +2524,7 @@ struct sms_assembly *sms_assembly_new(const char *imsi) /* Restore state from backup */ - path = g_strdup_printf(SMS_BACKUP_PATH, imsi); + path = g_strdup_printf(SMS_BACKUP_PATH, storage_dir(), imsi); len = scandir(path, &entries, NULL, alphasort); g_free(path); @@ -2772,7 +2773,7 @@ static void sr_assembly_load_backup(GHashTable *assembly_table, r = read_file((unsigned char *) node, sizeof(struct id_table_node), SMS_SR_BACKUP_PATH "/%s", - imsi, addr_dir->d_name); + storage_dir(), imsi, addr_dir->d_name); if (r < 0) { g_free(node); @@ -2813,7 +2814,7 @@ struct status_report_assembly *status_report_assembly_new(const char *imsi) ret->imsi = imsi; /* Restore state from backup */ - path = g_strdup_printf(SMS_SR_BACKUP_PATH, imsi); + path = g_strdup_printf(SMS_SR_BACKUP_PATH, storage_dir(), imsi); len = scandir(path, &addresses, NULL, alphasort); g_free(path); @@ -2858,7 +2859,7 @@ static gboolean sr_assembly_add_fragment_backup(const char *imsi, /* storagedir/%s/sms_sr/%s-%s */ if (write_file((unsigned char *) node, len, SMS_BACKUP_MODE, - SMS_SR_BACKUP_PATH_FILE, imsi, + SMS_SR_BACKUP_PATH_FILE, storage_dir(), imsi, straddr, msgid_str) != len) return FALSE; @@ -2883,7 +2884,7 @@ static gboolean sr_assembly_remove_fragment_backup(const char *imsi, return FALSE; path = g_strdup_printf(SMS_SR_BACKUP_PATH_FILE, - imsi, straddr, msgid_str); + storage_dir(), imsi, straddr, msgid_str); unlink(path); g_free(path); @@ -3202,7 +3203,8 @@ static GSList *sms_tx_load(const char *imsi, const struct dirent *dir) if (dir->d_type != DT_DIR) return NULL; - path = g_strdup_printf(SMS_TX_BACKUP_PATH "/%s", imsi, dir->d_name); + path = g_strdup_printf(SMS_TX_BACKUP_PATH "/%s", + storage_dir(), imsi, dir->d_name); len = scandir(path, &pdus, sms_tx_load_filter, versionsort); g_free(path); @@ -3211,7 +3213,8 @@ static GSList *sms_tx_load(const char *imsi, const struct dirent *dir) while (len--) { r = read_file(buf, sizeof(buf), SMS_TX_BACKUP_PATH "/%s/%s", - imsi, dir->d_name, pdus[len]->d_name); + storage_dir(), imsi, dir->d_name, + pdus[len]->d_name); if (r < 0) goto free_pdu; @@ -3257,7 +3260,7 @@ GQueue *sms_tx_queue_load(const char *imsi) if (imsi == NULL) return NULL; - path = g_strdup_printf(SMS_TX_BACKUP_PATH, imsi); + path = g_strdup_printf(SMS_TX_BACKUP_PATH, storage_dir(), imsi); len = scandir(path, &entries, sms_tx_queue_filter, versionsort); if (len < 0) @@ -3301,7 +3304,8 @@ GQueue *sms_tx_queue_load(const char *imsi) oldpath = g_strdup_printf("%s/%s", path, dir->d_name); newpath = g_strdup_printf(SMS_TX_BACKUP_PATH_DIR, - imsi, id++, flags, uuid); + storage_dir(), imsi, id++, + flags, uuid); /* rename directory to reflect new position in queue */ rename(oldpath, newpath); @@ -3339,7 +3343,7 @@ gboolean sms_tx_backup_store(const char *imsi, unsigned long id, * file name is: imsi/tx_queue/order-flags-uuid/pdu */ if (write_file(buf, len, SMS_BACKUP_MODE, SMS_TX_BACKUP_PATH_FILE, - imsi, id, flags, uuid, seq) != len) + storage_dir(), imsi, id, flags, uuid, seq) != len) return FALSE; return TRUE; @@ -3353,7 +3357,7 @@ void sms_tx_backup_free(const char *imsi, unsigned long id, int len; path = g_strdup_printf(SMS_TX_BACKUP_PATH_DIR, - imsi, id, flags, uuid); + storage_dir(), imsi, id, flags, uuid); len = scandir(path, &entries, NULL, versionsort); @@ -3388,7 +3392,7 @@ void sms_tx_backup_remove(const char *imsi, unsigned long id, char *path; path = g_strdup_printf(SMS_TX_BACKUP_PATH_FILE, - imsi, id, flags, uuid, seq); + storage_dir(), imsi, id, flags, uuid, seq); unlink(path); g_free(path); diff --git a/src/storage.c b/src/storage.c index bde0bea69..0bbcff208 100644 --- a/src/storage.c +++ b/src/storage.c @@ -168,9 +168,9 @@ GKeyFile *storage_open(const char *imsi, const char *store) return NULL; if (imsi) - path = g_strdup_printf(STORAGEDIR "/%s/%s", imsi, store); + path = g_strdup_printf("%s/%s/%s", storage_dir(), imsi, store); else - path = g_strdup_printf(STORAGEDIR "/%s", store); + path = g_strdup_printf("%s/%s", storage_dir(), store); keyfile = g_key_file_new(); @@ -189,9 +189,9 @@ void storage_sync(const char *imsi, const char *store, GKeyFile *keyfile) gsize length = 0; if (imsi) - path = g_strdup_printf(STORAGEDIR "/%s/%s", imsi, store); + path = g_strdup_printf("%s/%s/%s", storage_dir(), imsi, store); else - path = g_strdup_printf(STORAGEDIR "/%s", store); + path = g_strdup_printf("%s/%s", storage_dir(), store); if (path == NULL) return; @@ -217,3 +217,15 @@ void storage_close(const char *imsi, const char *store, GKeyFile *keyfile, g_key_file_free(keyfile); } + +/* Returns a writable path for the daemon */ +const char* storage_dir(void) +{ + static char *storagedir = NULL; + + /* SNAP_COMMON gives us a writable path for daemons in snappy systems */ + if (!storagedir) + storagedir = getenv("SNAP_COMMON"); + + return storagedir ? storagedir : STORAGEDIR; +} diff --git a/src/storage.h b/src/storage.h index dedc876e3..c02dd2bb4 100644 --- a/src/storage.h +++ b/src/storage.h @@ -43,3 +43,4 @@ GKeyFile *storage_open(const char *imsi, const char *store); void storage_sync(const char *imsi, const char *store, GKeyFile *keyfile); void storage_close(const char *imsi, const char *store, GKeyFile *keyfile, gboolean save); +const char* storage_dir(void);