コード例 #1
0
ファイル: dialogs.c プロジェクト: lrmodesgh/iio-oscilloscope
static int is_eeprom_fru(char *eeprom_file, GtkTextBuffer *buf, GtkTextIter *iter)
{
    FILE *fp;
    unsigned char *raw_input_data = NULL;
    size_t bytes;
    struct FRU_DATA *fru = NULL;
    char text[256];

    fp = fopen(eeprom_file, "rb");
    if(fp == NULL) {
        int errsv = errno;
        printf_err("Cannot open file %s\n%s\n", eeprom_file, strerror(errsv));
        return 0;
    }

    raw_input_data = x_calloc(1, 1024);
    bytes = fread(raw_input_data, 1024, 1, fp);
    fclose(fp);

    /* Since EOF should be reached, bytes should be zero */
    if (!bytes)
        fru = parse_FRU(raw_input_data);

    if (fru) {
        sprintf(text, "Found %s:\n", eeprom_file);
        gtk_text_buffer_insert(buf, iter, text, -1);

        if (fru->Board_Area->manufacturer && fru->Board_Area->manufacturer[0] & 0x3F) {
            sprintf(text, "FMC Manufacture : %s\n", &fru->Board_Area->manufacturer[1]);
            gtk_text_buffer_insert(buf, iter, text, -1);
        }
        if (fru->Board_Area->product_name && fru->Board_Area->product_name[0] & 0x3F) {
            sprintf(text, "Product Name: %s\n", &fru->Board_Area->product_name[1]);
            gtk_text_buffer_insert(buf, iter, text, -1);
        }
        if (fru->Board_Area->part_number && fru->Board_Area->part_number[0] & 0x3F) {
            sprintf(text, "Part Number : %s\n", &fru->Board_Area->part_number[1]);
            gtk_text_buffer_insert(buf, iter, text, -1);
        }
        if (fru->Board_Area->serial_number && fru->Board_Area->serial_number[0] & 0x3F) {
            sprintf(text, "Serial Number : %s\n", &fru->Board_Area->serial_number[1]);
            gtk_text_buffer_insert(buf, iter, text, -1);
        }
        if (fru->Board_Area->mfg_date) {
            time_t tmp = min2date(fru->Board_Area->mfg_date);
            sprintf(text, "Date of Man : %s", ctime(&tmp));
            gtk_text_buffer_insert(buf, iter, text, -1);
        }

        sprintf(text, "\n");
        gtk_text_buffer_insert(buf, iter, text, -1);

        free(fru);
        fru = NULL;

        return 1;
    }
    return 0;
}
コード例 #2
0
ファイル: dialogs.c プロジェクト: lrmodesgh/iio-oscilloscope
static size_t write_fru(char *eeprom)
{
    gint result;
    const char *serial, *file;
    char *ser_num, *filename;
    time_t frutime;
    FILE *fp = NULL;
    size_t i;
    time_t tmp;
    struct tm *tmp2;
    char buf[256];
    int j, n;
    struct dirent **namelist;
    GtkListStore *store;

    n = scandir(FRU_FILES, &namelist, 0, alphasort);
    /* No fru files, don't bother */
    if (n < 0) {
        printf("didn't find FRU_Files in %s at %s(%s)\n", FRU_FILES, __FILE__, __func__);
        return 0;
    }

    g_object_set(dialogs.serial_num, "secondary_text", eeprom, NULL);

    filename = g_malloc(PATH_MAX);
    ser_num = malloc(128);
    memset(ser_num, 0, 128);

    fp = fopen(".serialnum", "r");
    if (fp) {
        i = fread(ser_num, 1, 128, fp);
        if (!ferror(fp) && (i == 128 || feof(fp)))
            gtk_entry_set_text(GTK_ENTRY(serial_num), (const gchar*)&ser_num[1]);
        fclose(fp);
    }

    store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(fru_file_list)));
    gtk_list_store_clear(store);

    for (j = 0; j < n; j++) {
        if (namelist[j]->d_type == DT_REG && str_endswith(namelist[j]->d_name, ".bin"))
            gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(fru_file_list), namelist[j]->d_name);
        free(namelist[j]);
    }
    free(namelist);

    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(fru_file_list), "Other...");

    gtk_combo_box_set_active(GTK_COMBO_BOX(fru_file_list), ser_num[0]);
    free(ser_num);

    frutime = mins_since_jan_1_1996();
    tmp = min2date(frutime);
    tmp2 = gmtime(&tmp);

    strftime(buf, sizeof(buf), "%a %b %d %H:%M %Y", tmp2);

    gtk_entry_set_text(GTK_ENTRY(fru_date), buf);

get_serial_and_file:
    result = gtk_dialog_run(GTK_DIALOG(dialogs.serial_num));

    i = 0;
    switch (result) {
    case GTK_RESPONSE_OK:
        serial = gtk_entry_get_text(GTK_ENTRY(serial_num));
        if (strlen(serial) == 0) {
            create_blocking_popup(GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
                                  "", "Serial number required");
            goto get_serial_and_file;
        }

        file = gtk_combo_box_get_active_text(GTK_COMBO_BOX(fru_file_list));

        if (strncmp(file, "Other...", 8) != 0) {
            snprintf(filename, PATH_MAX, FRU_FILES "%s", file);
        } else {
            /* manually choose fru file */
            GtkWidget *dialog;

            dialog = gtk_file_chooser_dialog_new("Select FRU file",
                                                 GTK_WINDOW(dialogs.serial_num),
                                                 GTK_FILE_CHOOSER_ACTION_OPEN,
                                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                                                 NULL);

            if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
                filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
            }
            gtk_widget_destroy(dialog);
        }

        if (filename) {
            fflush(NULL);
            sprintf(buf, "fru-dump -i %s -o %s -s %s -d %d 2>&1",
                    filename, eeprom, serial, (unsigned int)frutime);
#if DEBUG
            printf("%s\n", buf);
#else
            fp = popen(buf, "r");
#endif
            if (!fp) {
                printf("can't execute \"%s\"\n", buf);
            } else {
                i = 0;
                while(fgets(buf, sizeof(buf), fp) != NULL) {
                    /* fru-dump not installed */
                    if (strstr(buf, "not found"))
                        printf("no fru-tools installed\n");
                    if (strstr(buf, "wrote") && strstr(buf, "bytes to") && strstr(buf, eeprom))
                        i = 1;
                }
                pclose(fp);
            }
            fp = fopen(".serialnum", "w");
            if (fp) {
                fprintf(fp, "%c%s", gtk_combo_box_get_active(GTK_COMBO_BOX(fru_file_list)), serial);
                fclose(fp);
            }
        }
        break;
    case GTK_RESPONSE_DELETE_EVENT:
        break;
    default:
        printf("unknown response %d in %s\n", result, __func__);
        break;
    }
    gtk_widget_hide(GTK_WIDGET(dialogs.serial_num));

    g_free(filename);
    return i;
}
コード例 #3
0
ファイル: dialogs.c プロジェクト: jagsmani/iio-oscilloscope
static size_t write_fru(char *eeprom)
{
	gint result;
	const char *serial, *file;
	char *ser_num;
	time_t frutime;
	FILE *fp = NULL;
	size_t i;
	time_t tmp;
	struct tm *tmp2;
	char buf[256];
	struct dirent *ent;
	DIR *d;
	GtkListStore *store;

	d = opendir(FRU_FILES);
	/* No fru files, don't bother */
	if (!d) {
		printf("didn't find FRU_Files in %s at %s(%s)\n", FRU_FILES, __FILE__, __func__);
		return 0;
	}

	g_object_set(dialogs.serial_num, "secondary_text", eeprom, NULL);

	ser_num = malloc (128);
	memset(ser_num, 0, 128);

	fp = fopen(".serialnum", "r");
	if (fp) {
		i = fread(ser_num, 1, 128, fp);
		if (i >= 0)
			gtk_entry_set_text(GTK_ENTRY(serial_num), (const gchar*)&ser_num[1]);
		fclose(fp);
	}

	store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(fru_file_list)));
	gtk_list_store_clear (store);

	while ((ent = readdir(d))) {
		if (ent->d_type != DT_REG)
			continue;
		if (!str_endswith(ent->d_name, ".bin"))
			continue;
		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(fru_file_list), ent->d_name);
	}

	gtk_combo_box_set_active(GTK_COMBO_BOX(fru_file_list), ser_num[0]);
	free(ser_num);

	frutime = mins_since_jan_1_1996();
	tmp = min2date(frutime);
	tmp2 = gmtime(&tmp);

	strftime(buf, sizeof(buf), "%a %b %d %H:%M %Y", tmp2);

	gtk_entry_set_text(GTK_ENTRY(fru_date), buf);

	result = gtk_dialog_run(GTK_DIALOG(dialogs.serial_num));

	i = 0;
	switch (result) {
		case GTK_RESPONSE_OK:
			file = gtk_combo_box_get_active_text(GTK_COMBO_BOX(fru_file_list));
			serial = gtk_entry_get_text(GTK_ENTRY(serial_num));
			fflush(NULL);
			sprintf(buf, "fru-dump -i " FRU_FILES "%s -o %s -s %s -d %d 2>&1",
					file, eeprom, serial, (unsigned int)frutime);
#if DEBUG
			printf("%s\n", buf);
#else
			fp = popen(buf, "r");
#endif
			if (!fp) {
				printf("can't execute \"%s\"\n", buf);
			} else {
				i = 0;
				while(fgets(buf, sizeof(buf), fp) != NULL){
					/* fru-dump not installed */
					if (strstr(buf, "not found"))
						printf("no fru-tools installed\n");
					if (strstr(buf, "wrote") && strstr(buf, "bytes to") && strstr(buf, eeprom))
						i = 1;
				}
				pclose(fp);
			}
			fp = fopen(".serialnum", "w");
			if (fp) {
				fprintf(fp, "%c%s", gtk_combo_box_get_active(GTK_COMBO_BOX(fru_file_list)), serial);
				fclose(fp);
			}
			break;
		case GTK_RESPONSE_DELETE_EVENT:
			break;
		default:
			printf("unknown response %d in %s\n", result, __func__);
			break;
	}
	gtk_widget_hide(GTK_WIDGET(dialogs.serial_num));

	return i;
}