diff options
author | Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de> | 2010-02-26 09:51:16 +0000 |
---|---|---|
committer | Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de> | 2010-02-26 09:51:16 +0000 |
commit | ff994fda4140cbcf1687376b9731d0d2822dd7f9 (patch) | |
tree | 968a4b46bd69e98e76f976175a5aee110703c0ab /dmi.c | |
parent | 18d9be256c36364316257f9f76d87513d7c7174a (diff) | |
download | flashrom-ff994fda4140cbcf1687376b9731d0d2822dd7f9.zip flashrom-ff994fda4140cbcf1687376b9731d0d2822dd7f9.tar.gz |
Factor out DMI string reading into subfunction
Corresponding to flashrom svn r915.
Signed-off-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Diffstat (limited to 'dmi.c')
-rw-r--r-- | dmi.c | 91 |
1 files changed, 47 insertions, 44 deletions
@@ -54,55 +54,58 @@ char *dmistrings[DMI_ID_INVALID]; /* strings longer than 4096 in DMI are just insane */ #define DMI_MAX_ANSWER_LEN 4096 -void dmi_init(void) +static char *get_dmi_string(const char *string_name) { FILE *dmidecode_pipe; - int i; - char *answerbuf = malloc(DMI_MAX_ANSWER_LEN); - if(!answerbuf) - { - fprintf(stderr, "DMI: couldn't alloc answer buffer\n"); - return; + char *result; + char answerbuf[DMI_MAX_ANSWER_LEN]; + char commandline[DMI_COMMAND_LEN_MAX+40]; + snprintf(commandline, sizeof(commandline), + "%s -s %s", dmidecode_command, string_name); + dmidecode_pipe = popen(commandline, "r"); + if (!dmidecode_pipe) { + printf_debug("DMI pipe open error\n"); + return NULL; } - for (i = 0; i < DMI_ID_INVALID; i++) - { - char commandline[DMI_COMMAND_LEN_MAX+40]; - snprintf(commandline, sizeof(commandline), - "%s -s %s", dmidecode_command, dmidecode_names[i]); - dmidecode_pipe = popen(commandline, "r"); - if (!dmidecode_pipe) - { - printf_debug("DMI pipe open error\n"); - goto out_free; - } - if (!fgets(answerbuf, DMI_MAX_ANSWER_LEN, dmidecode_pipe) && - ferror(dmidecode_pipe)) - { - printf_debug("DMI pipe read error\n"); - pclose(dmidecode_pipe); - goto out_free; - } - /* Toss all output above DMI_MAX_ANSWER_LEN away to prevent - deadlock on pclose. */ - while (!feof(dmidecode_pipe)) - getc(dmidecode_pipe); - if (pclose(dmidecode_pipe) != 0) - { - printf_debug("DMI pipe close error\n"); - goto out_free; - } - - /* chomp trailing newline */ - if (answerbuf[0] != 0 && - answerbuf[strlen(answerbuf) - 1] == '\n') - answerbuf[strlen(answerbuf) - 1] = 0; - printf_debug("DMI string %s: \"%s\"\n", dmidecode_names[i], - answerbuf); - dmistrings[i] = strdup(answerbuf); + if (!fgets(answerbuf, DMI_MAX_ANSWER_LEN, dmidecode_pipe) && + ferror(dmidecode_pipe)) { + printf_debug("DMI pipe read error\n"); + pclose(dmidecode_pipe); + return NULL; + } + /* Toss all output above DMI_MAX_ANSWER_LEN away to prevent + deadlock on pclose. */ + while (!feof(dmidecode_pipe)) + getc(dmidecode_pipe); + if (pclose(dmidecode_pipe) != 0) { + printf_debug("DMI pipe close error\n"); + return NULL; } + + /* chomp trailing newline */ + if (answerbuf[0] != 0 && + answerbuf[strlen(answerbuf) - 1] == '\n') + answerbuf[strlen(answerbuf) - 1] = 0; + printf_debug("DMI string %s: \"%s\"\n", string_name, answerbuf); + + result = strdup(answerbuf); + if (!result) + puts("WARNING: Out of memory - DMI support fails"); + + return result; +} + +void dmi_init(void) +{ + int i; has_dmi_support = 1; -out_free: - free(answerbuf); + for (i = 0; i < DMI_ID_INVALID; i++) { + dmistrings[i] = get_dmi_string(dmidecode_names[i]); + if (!dmistrings[i]) { + has_dmi_support = 0; + break; + } + } } /** |