/*! \brief select_datalog_for_import() loads a datalog file for playback \param widget is the Calling widget \param data is unused */ G_MODULE_EXPORT gboolean select_datalog_for_import(GtkWidget *widget, gpointer data) { MtxFileIO *fileio = NULL; gchar *filename = NULL; GIOChannel *iochannel = NULL; ENTER(); reset_logviewer_state(); free_log_info((Log_Info *)DATA_GET(global_data,"log_info")); fileio = g_new0(MtxFileIO ,1); fileio->default_path = g_strdup(DATALOG_DATA_DIR); fileio->project = (const gchar *)DATA_GET(global_data,"project_name"); fileio->parent = lookup_widget("main_window"); fileio->on_top = TRUE; fileio->title = g_strdup("Choose a datalog to view"); fileio->action = GTK_FILE_CHOOSER_ACTION_OPEN; filename = choose_file(fileio); if (filename == NULL) { update_logbar("dlog_view","warning",_("NO FILE opened for logviewing!\n"),FALSE,FALSE,FALSE); EXIT(); return FALSE; } iochannel = g_io_channel_new_file(filename, "r+",NULL); if (!iochannel) { update_logbar("dlog_view","warning",_("File open FAILURE! \n"),FALSE,FALSE,FALSE); EXIT(); return FALSE; } update_logbar("dlog_view",NULL,_("DataLog ViewFile Opened\n"),FALSE,FALSE,FALSE); load_logviewer_file(iochannel); g_io_channel_shutdown(iochannel,FALSE,NULL); g_io_channel_unref(iochannel); update_logbar("dlog_view",NULL,_("LogView File Closed\n"),FALSE,FALSE,FALSE); gtk_widget_set_sensitive(lookup_widget("logviewer_controls_hbox"),TRUE); enable_playback_controls(TRUE); free_mtxfileio(fileio); EXIT(); return TRUE; }
/*! \brief set_logviewer_mode() sets things up for playback mode \param mode Enumeration defining the logviewr mode (live or playback) */ G_MODULE_EXPORT void set_logviewer_mode(Lv_Mode mode) { GtkWidget *widget = NULL; reset_logviewer_state(); free_log_info(DATA_GET(global_data,"log_info")); if (mode == LV_PLAYBACK) { DATA_SET(global_data,"playback_mode",GINT_TO_POINTER(TRUE)); gtk_widget_set_sensitive(lookup_widget("logviewer_select_logfile_button"), TRUE); gtk_widget_set_sensitive(lookup_widget("logviewer_select_params_button"), FALSE); gtk_widget_hide(lookup_widget("logviewer_rt_control_vbox1")); /* This one should NOT be enabled until at least 1 var is selected */ gtk_widget_show(lookup_widget("logviewer_playback_control_vbox1")); gtk_widget_show(lookup_widget("scroll_speed_vbox")); widget = lookup_widget("logviewer_log_position_hscale"); if (GTK_IS_RANGE(widget)) gtk_range_set_value(GTK_RANGE(widget),0.0); hue = -60.0; col_sat = 1.0; col_val = 1.0; } else if (mode == LV_REALTIME) { enable_playback_controls(FALSE); stop_tickler(LV_PLAYBACK_TICKLER); DATA_SET(global_data,"playback_mode",GINT_TO_POINTER(FALSE)); gtk_widget_set_sensitive(lookup_widget("logviewer_select_logfile_button"), FALSE); gtk_widget_set_sensitive(lookup_widget("logviewer_select_params_button"), TRUE); gtk_widget_show(lookup_widget("logviewer_rt_control_vbox1")); gtk_widget_hide(lookup_widget("logviewer_playback_control_vbox1")); gtk_widget_hide(lookup_widget("scroll_speed_vbox")); widget = lookup_widget("logviewer_log_position_hscale"); if (GTK_IS_RANGE(widget)) gtk_range_set_value(GTK_RANGE(widget),100.0); hue = -60.0; col_sat = 1.0; col_val = 1.0; } }
struct log_info * parse_logfile(const char *logfile) { FILE *fp; char *buf = NULL, *cp, *ep; const char *errstr; size_t bufsize = 0, cwdsize = 0, cmdsize = 0; struct log_info *li = NULL; debug_decl(parse_logfile, SUDO_DEBUG_UTIL) fp = fopen(logfile, "r"); if (fp == NULL) { sudo_warn(U_("unable to open %s"), logfile); goto bad; } /* * ID file has three lines: * 1) a log info line * 2) cwd * 3) command with args */ if ((li = calloc(1, sizeof(*li))) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); if (getdelim(&buf, &bufsize, '\n', fp) == -1 || getdelim(&li->cwd, &cwdsize, '\n', fp) == -1 || getdelim(&li->cmd, &cmdsize, '\n', fp) == -1) { sudo_warn(U_("%s: invalid log file"), logfile); goto bad; } /* Strip the newline from the cwd and command. */ li->cwd[strcspn(li->cwd, "\n")] = '\0'; li->cmd[strcspn(li->cmd, "\n")] = '\0'; /* * Crack the log line (rows and cols not present in old versions). * timestamp:user:runas_user:runas_group:tty:rows:cols * XXX - probably better to use strtok and switch on the state. */ buf[strcspn(buf, "\n")] = '\0'; cp = buf; /* timestamp */ if ((ep = strchr(cp, ':')) == NULL) { sudo_warn(U_("%s: time stamp field is missing"), logfile); goto bad; } *ep = '\0'; li->tstamp = strtonum(cp, 0, TIME_T_MAX, &errstr); if (errstr != NULL) { sudo_warn(U_("%s: time stamp %s: %s"), logfile, cp, errstr); goto bad; } /* user */ cp = ep + 1; if ((ep = strchr(cp, ':')) == NULL) { sudo_warn(U_("%s: user field is missing"), logfile); goto bad; } if ((li->user = strndup(cp, (size_t)(ep - cp))) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); /* runas user */ cp = ep + 1; if ((ep = strchr(cp, ':')) == NULL) { sudo_warn(U_("%s: runas user field is missing"), logfile); goto bad; } if ((li->runas_user = strndup(cp, (size_t)(ep - cp))) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); /* runas group */ cp = ep + 1; if ((ep = strchr(cp, ':')) == NULL) { sudo_warn(U_("%s: runas group field is missing"), logfile); goto bad; } if (cp != ep) { if ((li->runas_group = strndup(cp, (size_t)(ep - cp))) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); } /* tty, followed by optional rows + columns */ cp = ep + 1; if ((ep = strchr(cp, ':')) == NULL) { /* just the tty */ if ((li->tty = strdup(cp)) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); } else { /* tty followed by rows + columns */ if ((li->tty = strndup(cp, (size_t)(ep - cp))) == NULL) sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); cp = ep + 1; /* need to NULL out separator to use strtonum() */ if ((ep = strchr(cp, ':')) != NULL) { *ep = '\0'; } li->rows = strtonum(cp, 1, INT_MAX, &errstr); if (errstr != NULL) { sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, "%s: tty rows %s: %s", logfile, cp, errstr); } if (ep != NULL) { cp = ep + 1; li->cols = strtonum(cp, 1, INT_MAX, &errstr); if (errstr != NULL) { sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, "%s: tty cols %s: %s", logfile, cp, errstr); } } } fclose(fp); free(buf); debug_return_ptr(li); bad: if (fp != NULL) fclose(fp); free(buf); free_log_info(li); debug_return_ptr(NULL); }