That's how I roll. Thanks, applied to master.
On Mon, May 06, 2013 at 01:02:08PM -0700, Andy Zhou wrote: > Looks good. Thanks for addressing it cleanly. > > > On Thu, May 2, 2013 at 4:16 PM, Ben Pfaff <b...@nicira.com> wrote: > > > strftime() returns 0 and leaves the contents of the output buffer > > unspecified if the output buffer is not big enough. Thus, one should > > check strftime()'s return value. Until now, OVS has had a few invocations > > of strftime() that did not check the return value. This commit fixes > > those. I believe that the buffers were always large enough in each case, > > but it's better to be safe. > > > > Reported-by: Andy Zhou <az...@nicira.com> > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > lib/dynamic-string.c | 23 +++++++++++++++++------ > > lib/dynamic-string.h | 12 +++++++----- > > lib/table.c | 18 +++++++----------- > > lib/vlog.c | 11 ++++------- > > ovsdb/ovsdb-tool.c | 8 +++----- > > utilities/ovs-ofctl.c | 8 ++------ > > 6 files changed, 40 insertions(+), 40 deletions(-) > > > > diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c > > index c373601..ba9aa6d 100644 > > --- a/lib/dynamic-string.c > > +++ b/lib/dynamic-string.c > > @@ -183,17 +183,16 @@ ds_put_printable(struct ds *ds, const char *s, > > size_t n) > > } > > } > > > > -/* Writes the current time to 'string' based on 'template'. > > - * The current time is either local time or UTC based on 'utc'. */ > > +/* Writes time 'when' to 'string' based on 'template', in local time or > > UTC > > + * based on 'utc'. */ > > void > > -ds_put_strftime(struct ds *ds, const char *template, bool utc) > > +ds_put_strftime(struct ds *ds, const char *template, time_t when, bool > > utc) > > { > > struct tm tm; > > - time_t now = time_wall(); > > if (utc) { > > - gmtime_r(&now, &tm); > > + gmtime_r(&when, &tm); > > } else { > > - localtime_r(&now, &tm); > > + localtime_r(&when, &tm); > > } > > > > for (;;) { > > @@ -207,6 +206,18 @@ ds_put_strftime(struct ds *ds, const char *template, > > bool utc) > > } > > } > > > > +/* Returns a malloc()'d string for time 'when' based on 'template', in > > local > > + * time or UTC based on 'utc'. */ > > +char * > > +xastrftime(const char *template, time_t when, bool utc) > > +{ > > + struct ds s; > > + > > + ds_init(&s); > > + ds_put_strftime(&s, template, when, utc); > > + return s.string; > > +} > > + > > int > > ds_get_line(struct ds *ds, FILE *file) > > { > > diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h > > index 098caaf..b988e1f 100644 > > --- a/lib/dynamic-string.h > > +++ b/lib/dynamic-string.h > > @@ -1,5 +1,5 @@ > > /* > > - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. > > + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. > > * > > * Licensed under the Apache License, Version 2.0 (the "License"); > > * you may not use this file except in compliance with the License. > > @@ -22,10 +22,9 @@ > > #include <stddef.h> > > #include <stdint.h> > > #include <stdio.h> > > +#include <time.h> > > #include "compiler.h" > > > > -struct tm; > > - > > /* A "dynamic string", that is, a buffer that can be used to construct a > > * string across a series of operations that extend or modify it. > > * > > @@ -56,14 +55,17 @@ void ds_put_format(struct ds *, const char *, ...) > > PRINTF_FORMAT(2, 3); > > void ds_put_format_valist(struct ds *, const char *, va_list) > > PRINTF_FORMAT(2, 0); > > void ds_put_printable(struct ds *, const char *, size_t); > > -void ds_put_strftime(struct ds *, const char *, bool utc) > > - STRFTIME_FORMAT(2); > > void ds_put_hex_dump(struct ds *ds, const void *buf_, size_t size, > > uintptr_t ofs, bool ascii); > > int ds_get_line(struct ds *, FILE *); > > int ds_get_preprocessed_line(struct ds *, FILE *); > > int ds_get_test_line(struct ds *, FILE *); > > > > +void ds_put_strftime(struct ds *, const char *template, time_t when, bool > > utc) > > + STRFTIME_FORMAT(2); > > +char *xastrftime(const char *template, time_t when, bool utc) > > + STRFTIME_FORMAT(1); > > + > > char *ds_cstr(struct ds *); > > const char *ds_cstr_ro(const struct ds *); > > char *ds_steal_cstr(struct ds *); > > diff --git a/lib/table.c b/lib/table.c > > index 266c410..21f4905 100644 > > --- a/lib/table.c > > +++ b/lib/table.c > > @@ -218,22 +218,19 @@ table_print_table_line__(struct ds *line) > > ds_clear(line); > > } > > > > -static void > > -table_format_timestamp__(char *s, size_t size) > > +static char * > > +table_format_timestamp__(void) > > { > > - time_t now = time_wall(); > > - struct tm tm; > > - strftime(s, size, "%Y-%m-%d %H:%M:%S", gmtime_r(&now, &tm)); > > + return xastrftime("%Y-%m-%d %H:%M:%S", time_wall(), true); > > } > > > > static void > > table_print_timestamp__(const struct table *table) > > { > > if (table->timestamp) { > > - char s[32]; > > - > > - table_format_timestamp__(s, sizeof s); > > + char *s = table_format_timestamp__(); > > puts(s); > > + free(s); > > } > > } > > > > @@ -500,10 +497,9 @@ table_print_json__(const struct table *table, const > > struct table_style *style) > > json_object_put_string(json, "caption", table->caption); > > } > > if (table->timestamp) { > > - char s[32]; > > - > > - table_format_timestamp__(s, sizeof s); > > + char *s = table_format_timestamp__(); > > json_object_put_string(json, "time", s); > > + free(s); > > } > > > > headings = json_array_create_empty(); > > diff --git a/lib/vlog.c b/lib/vlog.c > > index 8bc9938..d53491c 100644 > > --- a/lib/vlog.c > > +++ b/lib/vlog.c > > @@ -570,12 +570,9 @@ vlog_init(void) > > > > now = time_wall(); > > if (now < 0) { > > - struct tm tm; > > - char s[128]; > > - > > - gmtime_r(&now, &tm); > > - strftime(s, sizeof s, "%a, %d %b %Y %H:%M:%S", &tm); > > + char *s = xastrftime("%a, %d %b %Y %H:%M:%S", now, true); > > VLOG_ERR("current time is negative: %s (%ld)", s, (long int) now); > > + free(s); > > } > > > > unixctl_command_register( > > @@ -709,11 +706,11 @@ format_log_message(const struct vlog_module *module, > > enum vlog_level level, > > break; > > case 'd': > > p = fetch_braces(p, "%Y-%m-%d %H:%M:%S", tmp, sizeof tmp); > > - ds_put_strftime(s, tmp, false); > > + ds_put_strftime(s, tmp, time_wall(), false); > > break; > > case 'D': > > p = fetch_braces(p, "%Y-%m-%d %H:%M:%S", tmp, sizeof tmp); > > - ds_put_strftime(s, tmp, true); > > + ds_put_strftime(s, tmp, time_wall(), true); > > break; > > case 'm': > > /* Format user-supplied log message and trim trailing > > new-lines. */ > > diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c > > index fe6ab42..4d7d4f4 100644 > > --- a/ovsdb/ovsdb-tool.c > > +++ b/ovsdb/ovsdb-tool.c > > @@ -519,11 +519,9 @@ do_show_log(int argc, char *argv[]) > > date = shash_find_data(json_object(json), "_date"); > > if (date && date->type == JSON_INTEGER) { > > time_t t = json_integer(date); > > - struct tm tm; > > - char s[128]; > > - > > - strftime(s, sizeof s, "%Y-%m-%d %H:%M:%S", gmtime_r(&t, > > &tm)); > > - printf(" %s", s); > > + char *s = xastrftime(" %Y-%m-%d %H:%M:%S", t, true); > > + fputs(s, stdout); > > + free(s); > > } > > > > comment = shash_find_data(json_object(json), "_comment"); > > diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c > > index 409d640..d33eebf 100644 > > --- a/utilities/ovs-ofctl.c > > +++ b/utilities/ovs-ofctl.c > > @@ -1357,13 +1357,9 @@ monitor_vconn(struct vconn *vconn) > > run(retval, "vconn_recv"); > > > > if (timestamp) { > > - time_t now = time_wall(); > > - struct tm tm; > > - char s[32]; > > - > > - strftime(s, sizeof s, "%Y-%m-%d %H:%M:%S: ", > > - gmtime_r(&now, &tm)); > > + char *s = xastrftime("%Y-%m-%d %H:%M:%S: ", time_wall(), > > true); > > fputs(s, stderr); > > + free(s); > > } > > > > ofptype_decode(&type, b->data); > > -- > > 1.7.2.5 > > > > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev