Skip to content

Commit 5ebf67e

Browse files
author
David Sommerseth
committed
Added logging flag to log_append() to change log behaviour
Valid flags are: * LOGFL_NORMAL Log all messages to the log context, and send log message to stderr on errors * LOGFL_NODUPS Log only unique messages. Duplicated messages will be removed * LOGFL_NOSTDERR Don't write to stderr, even if errors occur
1 parent 24af406 commit 5ebf67e

8 files changed

Lines changed: 83 additions & 65 deletions

File tree

src/dmidecode.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4866,7 +4866,7 @@ static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver
48664866
}
48674867

48684868
if((buf = mem_chunk(logp, base, len, devmem)) == NULL) {
4869-
log_append(logp, LOG_WARNING, "Table is unreachable, sorry."
4869+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "Table is unreachable, sorry."
48704870
#ifndef USE_MMAP
48714871
"Try compiling dmidecode with -DUSE_MMAP."
48724872
#endif
@@ -4889,8 +4889,9 @@ static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver
48894889
** table is broken.
48904890
*/
48914891
if(h.length < 4) {
4892-
log_append(logp, LOG_WARNING, "Invalid entry length (%i). DMI table is broken! Stop.",
4893-
(unsigned int)h.length);
4892+
log_append(logp, LOGFL_NORMAL, LOG_WARNING,
4893+
"Invalid entry length (%i). DMI table is broken! Stop.",
4894+
(unsigned int)h.length);
48944895
break;
48954896
}
48964897

@@ -4955,10 +4956,10 @@ static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver
49554956
}
49564957

49574958
if(i != num)
4958-
log_append(logp, LOG_WARNING,
4959+
log_append(logp, LOGFL_NODUPS, LOG_WARNING,
49594960
"Wrong DMI structures count: %d announced, only %d decoded.\n", num, i);
49604961
if(data - buf != len)
4961-
log_append(logp, LOG_WARNING,
4962+
log_append(logp, LOGFL_NODUPS, LOG_WARNING,
49624963
"Wrong DMI structures length: %d bytes announced, structures occupy %d bytes.\n",
49634964
len, (unsigned int)(data - buf));
49644965

src/dmidecodemodule.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ static void init(options *opt)
6666

6767
/* sanity check */
6868
if(sizeof(u8) != 1 || sizeof(u16) != 2 || sizeof(u32) != 4 || '\0' != 0) {
69-
log_append(opt->logdata, LOG_WARNING, "%s: compiler incompatibility\n", "dmidecodemodule");
69+
log_append(opt->logdata, LOGFL_NORMAL, LOG_WARNING,
70+
"%s: compiler incompatibility\n", "dmidecodemodule");
7071
}
7172
}
7273

@@ -78,11 +79,11 @@ int parse_opt_type(Log_t *logp, const char *arg)
7879

7980
val = strtoul(arg, &next, 0);
8081
if(next == arg) {
81-
log_append(logp, LOG_ERR, "Invalid type keyword: %s\n", arg);
82+
log_append(logp, LOGFL_NODUPS, LOG_ERR, "Invalid type keyword: %s\n", arg);
8283
return -1;
8384
}
8485
if(val > 0xff) {
85-
log_append(logp, LOG_ERR, "Invalid type number: %i\n", val);
86+
log_append(logp, LOGFL_NODUPS, LOG_ERR, "Invalid type number: %i\n", val);
8687
return -1;
8788
}
8889

@@ -164,7 +165,8 @@ xmlNode *dmidecode_get_version(options *opt)
164165
free(buf);
165166
}
166167
if( !found ) {
167-
log_append(opt->logdata, LOG_WARNING, "No SMBIOS nor DMI entry point found, sorry.");
168+
log_append(opt->logdata, LOGFL_NODUPS, LOG_WARNING,
169+
"No SMBIOS nor DMI entry point found, sorry.");
168170
}
169171
return ver_n;
170172
}
@@ -185,7 +187,8 @@ int dmidecode_get_xml(options *opt, xmlNode* dmixml_n)
185187

186188
const char *f = opt->dumpfile ? opt->dumpfile : opt->devmem;
187189
if(access(f, R_OK) < 0) {
188-
log_append(opt->logdata, LOG_WARNING, "Permission denied to memory file/device (%s)", f);
190+
log_append(opt->logdata, LOGFL_NORMAL,
191+
LOG_WARNING, "Permission denied to memory file/device (%s)", f);
189192
return 0;
190193
}
191194

src/dmilog.c

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -59,51 +59,56 @@ Log_t * log_init()
5959
* Registers a new log entry
6060
*
6161
* @param logp Pointer to an allocated Log_t record. New records will be appended to the end
62+
* @param flags Log flags, to specify logging behaviour
6263
* @param level syslog log level values. LOG_ERR and LOG_WARNING are allowed
6364
* @param fmt stdarg based string with the log contents
6465
*
6566
* @return Returns 1 on successful registration of log entry, otherwise -1 and error is printed to stderr
67+
* unless LOGFL_NOSTDERR is set in flags.
6668
*/
67-
int log_append(Log_t *logp, int level, const char *fmt, ...)
69+
int log_append(Log_t *logp, Log_f flags, int level, const char *fmt, ...)
6870
{
69-
Log_t *ptr = NULL;
70-
va_list ap;
71-
72-
// Go the end of the record chain
73-
ptr = logp;
74-
while( ptr && ptr->next ) {
75-
ptr = ptr->next;
76-
}
77-
78-
79-
if( ptr && ((level == LOG_ERR) || (level == LOG_WARNING)) ) {
80-
ptr->next = log_init();
81-
if( ptr->next ) {
82-
ptr->next->message = (char *) calloc(1, 4098);
83-
}
84-
}
71+
Log_t *ptr = NULL;
72+
va_list ap;
73+
char logmsg[4098];
8574

75+
// Prepare log message
76+
memset(&logmsg, 0, 4098);
8677
va_start(ap, fmt);
87-
if( !ptr || !ptr->next || !ptr->next->message ) {
88-
if( logp ) {
89-
// Only print this if we logp is pointing somewhere.
90-
// If it is NULL, the caller did not establish a log
91-
// buffer on purpose (like dmidump.c) - thus this is
92-
// not an error with saving the log entry.
93-
fprintf(stderr, "** ERROR ** Failed to save log entry\n");
94-
}
95-
vfprintf(stderr, fmt, ap);
96-
fprintf(stderr, "\n");
97-
va_end(ap);
98-
return -1;
99-
}
100-
101-
ptr->next->level = level;
102-
vsnprintf(ptr->next->message, 4096, fmt, ap);
103-
ptr->next->message = realloc(ptr->next->message, strlen(ptr->next->message)+2);
104-
va_end(ap);
105-
106-
return 1;
78+
vsnprintf(logmsg, 4096, fmt, ap);
79+
va_end(ap);
80+
81+
// Go the end of the record chain
82+
ptr = logp;
83+
while( ptr && ptr->next ) {
84+
// Ignore duplicated messages if LOGFL_NODUPS is set
85+
if( (flags & LOGFL_NODUPS) && ptr->next && ptr->next->message
86+
&& (strcmp(ptr->next->message, logmsg) == 0) ) {
87+
return 1;
88+
}
89+
ptr = ptr->next;
90+
}
91+
92+
if( ptr && ((level == LOG_ERR) || (level == LOG_WARNING)) ) {
93+
ptr->next = log_init();
94+
if( ptr->next ) {
95+
ptr->next->level = level;
96+
ptr->next->message = strdup(logmsg);
97+
return 1;
98+
}
99+
}
100+
101+
if( !(flags & LOGFL_NOSTDERR) ) {
102+
if( logp ) {
103+
// Only print this if we logp is pointing somewhere.
104+
// If it is NULL, the caller did not establish a log
105+
// buffer on purpose (like dmidump.c) - thus this is
106+
// not an error with saving the log entry.
107+
fprintf(stderr, "** ERROR ** Failed to save log entry\n");
108+
}
109+
fprintf(stderr, "%s\n", logmsg);
110+
}
111+
return -1;
107112
}
108113

109114

src/dmilog.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,16 @@ struct _Log_t {
4646
};
4747
typedef struct _Log_t Log_t;
4848

49+
/**
50+
* Log flags. These flags can be OR'ed together
51+
*/
52+
typedef enum { LOGFL_NORMAL = 1, /**< Normal behaviour, log everything and use stderr on errors */
53+
LOGFL_NODUPS = 2, /**< Don't log messages we already have logged */
54+
LOGFL_NOSTDERR = 4 /**< Don't use stderr even if log functions fails */
55+
} Log_f;
56+
4957
Log_t * log_init();
50-
int log_append(Log_t *logp, int level, const char *fmt, ...);
58+
int log_append(Log_t *logp, Log_f flags, int level, const char *fmt, ...);
5159
char * log_retrieve(Log_t *logp, int level);
5260
size_t log_clear_partial(Log_t *logp, int level, int unread);
5361
void log_close(Log_t *logp);

src/dmixml.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,9 +352,9 @@ char *dmixml_GetXPathContent(Log_t *logp, char *buf, size_t buflen, xmlXPathObje
352352
break;
353353

354354
default:
355-
log_append(logp, LOG_WARNING, "dmixml_GetXPathContent(...):: "
356-
"Do not know how to handle XPath type %i\n",
357-
xpo->type);
355+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "dmixml_GetXPathContent(...):: "
356+
"Do not know how to handle XPath type %i\n",
357+
xpo->type);
358358
return NULL;
359359
}
360360
return buf;

src/efi.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ int address_from_efi(Log_t *logp, size_t * address)
7676
if(fclose(efi_systab) != 0)
7777
perror(filename);
7878

79-
if(ret == EFI_NO_SMBIOS)
80-
log_append(logp, LOG_WARNING, "%s: SMBIOS entry point missing\n", filename);
79+
if(ret == EFI_NO_SMBIOS) {
80+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "%s: SMBIOS entry point missing\n", filename);
81+
}
8182

8283
return ret;
8384
}

src/util.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static int myread(Log_t *logp, int fd, u8 * buf, size_t count, const char *prefi
6969

7070
if(r2 != count) {
7171
close(fd);
72-
log_append(logp, LOG_WARNING, "%s: Unexpected end of file\n", prefix);
72+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s: Unexpected end of file\n", prefix);
7373
return -1;
7474
}
7575

@@ -102,12 +102,12 @@ void *mem_chunk(Log_t *logp, size_t base, size_t len, const char *devmem)
102102
#endif
103103

104104
if((fd = open(devmem, O_RDONLY)) == -1) {
105-
log_append(logp, LOG_WARNING, "%s: %s", devmem, strerror(errno));
105+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s: %s", devmem, strerror(errno));
106106
return NULL;
107107
}
108108

109109
if((p = malloc(len)) == NULL) {
110-
log_append(logp, LOG_WARNING, "malloc: %s", strerror(errno));
110+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "malloc: %s", strerror(errno));
111111
return NULL;
112112
}
113113
#ifdef USE_MMAP
@@ -123,19 +123,19 @@ void *mem_chunk(Log_t *logp, size_t base, size_t len, const char *devmem)
123123
*/
124124
mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset);
125125
if(mmp == MAP_FAILED) {
126-
log_append(logp, LOG_WARNING, "%s (mmap): %s", devmem, strerror(errno));
126+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s (mmap): %s", devmem, strerror(errno));
127127
free(p);
128128
return NULL;
129129
}
130130

131131
memcpy(p, (u8 *) mmp + mmoffset, len);
132132

133133
if(munmap(mmp, mmoffset + len) == -1) {
134-
log_append(logp, LOG_WARNING, "%s (munmap): %s", devmem, strerror(errno));
134+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s (munmap): %s", devmem, strerror(errno));
135135
}
136136
#else /* USE_MMAP */
137137
if(lseek(fd, base, SEEK_SET) == -1) {
138-
log_append(logp, LOG_WARNING, "%s (lseek): %s", devmem, strerror(errno));
138+
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s (lseek): %s", devmem, strerror(errno));
139139
free(p);
140140
return NULL;
141141
}

src/xmlpythonizer.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ inline ptzTYPES _convert_maptype(Log_t *logp, const char *str) {
304304
} else if( strcmp(str, "list:dict") == 0 ) {
305305
return ptzLIST_DICT;
306306
} else {
307-
log_append(logp, LOG_WARNING,
307+
log_append(logp, LOGFL_NORMAL, LOG_WARNING,
308308
"Unknown field type: %s - defaulting to 'constant'\n", str);
309309
return ptzCONST;
310310
}
@@ -463,7 +463,7 @@ ptzMAP *_dmimap_parse_mapping_node_typeid(Log_t *logp, xmlNode *mapnode, const c
463463
node = dmixml_FindNodeByAttr_NoCase(mapnode, "TypeMap", "id", typeid);
464464
if( node == NULL ) {
465465
// No exception handling possible here, as we don't return PyObject
466-
log_append(logp, LOG_WARNING, "** WARNING: Could not find any XML->Python "
466+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "** WARNING: Could not find any XML->Python "
467467
"mapping for type ID '%s'", typeid);
468468
return NULL;
469469
}
@@ -665,7 +665,7 @@ inline PyObject *StringToPyObj(Log_t *logp, ptzMAP *val_m, const char *instr) {
665665
break;
666666

667667
default:
668-
log_append(logp, LOG_WARNING,
668+
log_append(logp, LOGFL_NODUPS, LOG_WARNING,
669669
"Invalid type '%i' for value '%s'\n",
670670
val_m->type_value, instr);
671671
value = Py_None;
@@ -737,7 +737,7 @@ char *_get_key_value(Log_t *logp, char *key, size_t buflen,
737737
break;
738738

739739
default:
740-
log_append(logp, LOG_WARNING, "Unknown key type: %i\n", map_p->type_key);
740+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "Unknown key type: %i\n", map_p->type_key);
741741
return NULL;
742742
}
743743
// We consider to have a key, if the first byte is a readable
@@ -999,7 +999,7 @@ PyObject *_deep_pythonize(Log_t *logp, PyObject *retdata,
999999
break;
10001000

10011001
default:
1002-
log_append(logp, LOG_WARNING, "Unknown value type: %i\n", map_p->type_value);
1002+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "Unknown value type: %i\n", map_p->type_value);
10031003
break;
10041004
}
10051005

@@ -1070,7 +1070,7 @@ PyObject *pythonizeXMLnode(Log_t *logp, ptzMAP *in_map, xmlNode *data_n) {
10701070
}
10711071
#ifdef DEBUG
10721072
else {
1073-
log_append(logp, LOG_WARNING,
1073+
log_append(logp, LOGFL_NODUPS, LOG_WARNING,
10741074
"** pythonizeXMLnode :: Could not locate node for key value: "
10751075
"root path '%s', key '%s'\n", map_p->rootpath, map_p->key);
10761076
}

0 commit comments

Comments
 (0)