bool simulation::execute(string dna, uint32 id) { int status, ret; pid_t pid; string args; setup_input_file(dna, id); if (!file_exists(get_bin_path(id).c_str())) { INFO("verbose", "* simulation: simulator binary does not exists.\n"); exit(0); } pid = fork(); // con vfork gdb si blocca if (pid == 0) { int fd; ret = chdir((char *)get_sim_path(id).c_str()); if((fd = open("/dev/null", O_RDWR | O_CREAT, 0777)) == -1) { perror("open"); _exit(0); } dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); close(fd); ret = execle(get_bin_path(id).c_str(), conf->get_string_config(CONFIG_SIMULATOR_BIN).c_str(), "-N", "1", "-a", conf->get_string_config(CONFIG_TEST_FILE_OUT).c_str() , NULL, environ); perror("execle"); // qui non ci arriva mai ( si spera :D ) _exit(0); } else if (pid == -1) { perror("fork"); return false; } waitpid(pid, &status, 0); return true; }
void mmcli_get_sim (GDBusConnection *connection, const gchar *path_or_index, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GetSimContext *ctx; ctx = g_new0 (GetSimContext, 1); ctx->sim_path = get_sim_path (path_or_index); if (cancellable) ctx->cancellable = g_object_ref (cancellable); ctx->result = g_simple_async_result_new (G_OBJECT (connection), callback, user_data, mmcli_get_modem); mmcli_get_manager (connection, cancellable, (GAsyncReadyCallback)get_sim_manager_ready, ctx); }
MMSim * mmcli_get_sim_sync (GDBusConnection *connection, const gchar *path_or_index, MMManager **o_manager, MMObject **o_object) { MMManager *manager; GList *modems; GList *l; MMSim *found = NULL; gchar *sim_path; sim_path = get_sim_path (path_or_index); manager = mmcli_get_manager_sync (connection); modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager)); if (!modems) { g_printerr ("error: couldn't find sim at '%s': 'no modems found'\n", sim_path); exit (EXIT_FAILURE); } for (l = modems; !found && l; l = g_list_next (l)) { GError *error = NULL; MMObject *object; MMModem *modem; object = MM_OBJECT (l->data); modem = mm_object_get_modem (object); if (g_str_equal (sim_path, mm_modem_get_sim_path (modem))) { found = mm_modem_get_sim_sync (modem, NULL, &error); if (error) { g_printerr ("error: couldn't get sim '%s' in modem '%s': '%s'\n", sim_path, mm_modem_get_path (modem), error->message); exit (EXIT_FAILURE); } if (found && o_object) *o_object = g_object_ref (object); } g_object_unref (modem); } if (!found) { g_printerr ("error: couldn't find sim at '%s'\n", sim_path); exit (EXIT_FAILURE); } g_list_free_full (modems, (GDestroyNotify) g_object_unref); g_free (sim_path); if (o_manager) *o_manager = manager; else g_object_unref (manager); return found; }