-#define GTP_ADD_BY_PATH "/sys/kernel/debug/swap/got_patcher/by_path/add"
-#define GTP_ADD_BY_PID "/sys/kernel/debug/swap/got_patcher/by_pid/add"
-#define GTP_ADD_BY_ID "/sys/kernel/debug/swap/got_patcher/by_id/add"
-
-static int add_bins_to_gtp(struct user_space_inst_t *us_inst)
+struct feature_paths_t {
+ const char *by_path;
+ const char *by_pid;
+ const char *by_id;
+ const char *clean;
+};
+
+static const char gtp_path[] = "/sys/kernel/debug/swap/got_patcher/by_path/add";
+static const char gtp_pid[] = "/sys/kernel/debug/swap/got_patcher/by_pid/add";
+static const char gtp_id[] = "/sys/kernel/debug/swap/got_patcher/by_id/add";
+static const char gtp_clean[] = "/sys/kernel/debug/swap/got_patcher/del_all";
+static const char preload_path[] = "/sys/kernel/debug/swap/preload/by_path/add";
+static const char preload_pid[] = "/sys/kernel/debug/swap/preload/by_pid/add";
+static const char preload_id[] = "/sys/kernel/debug/swap/preload/by_id/add";
+static const char preload_clean[] = "/sys/kernel/debug/swap/preload/del_all";
+
+static struct feature_paths_t gtp_paths = {
+ .by_path = gtp_path,
+ .by_pid = gtp_pid,
+ .by_id = gtp_id,
+ .clean = gtp_clean
+};
+
+static struct feature_paths_t preload_paths = {
+ .by_path = preload_path,
+ .by_pid = preload_pid,
+ .by_id = preload_id,
+ .clean = preload_clean
+};
+
+static int add_procs(struct user_space_inst_t *us_inst,
+ struct feature_paths_t *ps)
{
struct app_list_t *app = us_inst->app_inst_list;
uint32_t total_maps_count = 0;
char real_path_buf[PATH_MAX];
char *to_write;
- FILE *gtp_p;
+ FILE *file;
while (app != NULL) {
switch (app->app->app_type) {
* functionality
*/
- gtp_p = fopen(GTP_ADD_BY_PATH, "w");
- if (gtp_p == NULL) {
- LOGE("Cannot open <%s> to write!",
- GTP_ADD_BY_PATH);
+ file = fopen(ps->by_path, "w");
+ if (file == NULL) {
+ LOGE("Cannot open <%s> to write!", ps->by_path);
break;
}
real_path_buf);
if (to_write != NULL) {
total_maps_count++;
- fwrite(to_write, strlen(to_write) + 1, 1,
- gtp_p);
- fflush(gtp_p);
+ fwrite(to_write, strlen(to_write) + 1, 1, file);
+ fflush(file);
LOGI("app #%u <%s>\n", total_maps_count,
to_write);
}
- fclose(gtp_p);
+ fclose(file);
break;
case APP_TYPE_WEB:
- gtp_p = fopen(GTP_ADD_BY_ID, "w");
- if (gtp_p == NULL) {
- LOGE("Cannot open <%s> to write!",
- GTP_ADD_BY_ID);
+ file = fopen(ps->by_id, "w");
+ if (file == NULL) {
+ LOGE("Cannot open <%s> to write!", ps->by_id);
break;
}
to_write = app->app->app_id;
if (to_write != NULL) {
total_maps_count++;
- fwrite(to_write, strlen(to_write) + 1, 1,
- gtp_p);
- fflush(gtp_p);
+ fwrite(to_write, strlen(to_write) + 1, 1, file);
+ fflush(file);
LOGI("app #%u <%s>\n", total_maps_count,
to_write);
}
- fclose(gtp_p);
+ fclose(file);
break;
}
return 0;
}
-#undef GTP_ADD_BY_ID
-#undef GTP_ADD_BY_PID
-#undef GTP_ADD_BY_PATH
+static int add_procs_to_gtp(struct user_space_inst_t *us_inst)
+{
+ return add_procs(us_inst, >p_paths);
+}
-#define GTP_CLEAN "/sys/kernel/debug/swap/got_patcher/del_all"
+static int add_procs_to_preload(struct user_space_inst_t *us_inst)
+{
+ return add_procs(us_inst, &preload_paths);
+}
-static int clean_bins_gtp(void)
+static int clean_procs(struct feature_paths_t *ps)
{
const char clean_str[] = "c";
- FILE *gtp_p;
+ FILE *file;
- gtp_p = fopen(GTP_CLEAN, "w");
- if (gtp_p == NULL)
+ file = fopen(ps->clean, "w");
+ if (!file) {
+ LOGE("Error while cleaning at <%s>!", ps->clean);
return -EINVAL;
+ }
- fwrite(clean_str, sizeof(clean_str), 1, gtp_p);
+ fwrite(clean_str, sizeof(clean_str), 1, file);
- fclose(gtp_p);
+ fclose(file);
return 0;
}
-#undef GTP_CLEAN
+static int clean_procs_gtp(void)
+{
+ return clean_procs(>p_paths);
+}
+
+static int clean_procs_preload(void)
+{
+ return clean_procs(&preload_paths);
+}
-static int write_bins_to_gtp(struct user_space_inst_t *us_inst)
+static int write_procs(struct user_space_inst_t *us_inst)
{
int ret;
- ret = clean_bins_gtp();
- if (ret != 0)
+ ret = clean_procs_gtp();
+ if (ret)
return ret;
- ret = add_bins_to_gtp(us_inst);
+ ret = clean_procs_preload();
+ if (ret)
+ return ret;
+ ret = add_procs_to_gtp(us_inst);
+ if (ret)
+ return ret;
+
+ ret = add_procs_to_preload(us_inst);
return ret;
}
int got_patcher_stop(void)
{
- return clean_bins_gtp();
+ return clean_procs_gtp();
+}
+
+int preload_stop(void)
+{
+ return clean_procs_preload();
}
void send_target_bins_to(struct target *t)
goto msg_start_exit;
}
- if (write_bins_to_gtp(us_inst))
+ if (write_procs(us_inst))
LOGE("Error adding binaries\n");
generate_target_bins(us_inst);
if (write_bins_to_preload(us_inst))
LOGE("Error adding binaries\n");
- if (write_bins_to_gtp(us_inst))
+ if (write_procs(us_inst))
LOGE("Error adding binaries\n");
generate_target_bins(us_inst);
if (write_bins_to_preload(us_inst))
LOGE("Error adding binaries\n");
- if (write_bins_to_gtp(us_inst))
+ if (write_procs(us_inst))
LOGE("Error adding binaries\n");
generate_target_bins(us_inst);
send_target_bins_to_all_targets();