]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Pass a correct pointer type to localtime_r(3).
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 4 Sep 2012 17:03:41 +0000 (10:03 -0700)
committerEric Blake <eblake@redhat.com>
Tue, 4 Sep 2012 23:20:08 +0000 (17:20 -0600)
On 09/04/2012 08:20 AM, Eric Blake wrote:
> tv_sec is required by POSIX to be
> of type time_t; so this is a bug in the OpenBSD header
> [for declaring it as long]

Most likely this problem arose because of the patch I pushed
in gnulib commit e07d7c40f3ca5ec410cf5aa6fa03cfe51e712039.
Previously, gnulib required timeval's tv_sec to be
the same size as time_t.  But now, it requires only that
tv_sec be big enough to hold a time_t.

This patch was needed for Emacs.  Without the patch, gnulib
replaced struct timeval on OpenBSD, and this messed up
utimens.c, and Emacs wouldn't build.

Alternatively, gnulib could substitute its own struct timeval
for the system's, wrapping every struct timeval-using function
(gettimeofday, futimesat, futimes, lutimes, etc.  That'd be
more work, though.  And it would introduce some performance
issues with gettimeofday, which is supposed to be fast.

I've been trying to get away from using struct timeval,
and to use the higher-resolution struct timespec instead,
so messing with these obsolescent interfaces has been
lower priority for me.  But if someone wants to take the
more-ambitious approach that'd be fine, I expect.

For this particular case, though, how about if we avoid
the problem entirely?  libvirt doesn't need to use struct
timeval here at all.  It makes libvirt smaller and probably
faster, and it ports to OpenBSD without messing with gnulib.

AUTHORS
tools/virsh-domain.c
tools/virsh.c

diff --git a/AUTHORS b/AUTHORS
index 12eba2b5d64da50093fdba05ff55a3a8ebed0830..156cc854e2689df08458ead79f62df9449af3093 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -263,6 +263,7 @@ Patches have also been contributed by:
   Gene Czarcinski      <gene@czarc.net>
   Nishank Trivedi      <nistrive@cisco.com>
   Jasper Lievisse Adriaanse <jasper@humppa.nl>
+  Paul Eggert          <eggert@cs.ucla.edu>
 
   [....send patches to get your name here....]
 
index f0ec742aa90a071d1781b6896ee5b75783252144..3cef7824b8bbc67ddf74daa5c935876c0047ad16 100644 (file)
@@ -3707,7 +3707,7 @@ static char *
 vshGenFileName(vshControl *ctl, virDomainPtr dom, const char *mime)
 {
     char timestr[100];
-    struct timeval cur_time;
+    time_t cur_time;
     struct tm time_info;
     const char *ext = NULL;
     char *ret = NULL;
@@ -3723,8 +3723,8 @@ vshGenFileName(vshControl *ctl, virDomainPtr dom, const char *mime)
         ext = ".png";
     /* add mime type here */
 
-    gettimeofday(&cur_time, NULL);
-    localtime_r(&cur_time.tv_sec, &time_info);
+    time (&cur_time);
+    localtime_r(&cur_time, &time_info);
     strftime(timestr, sizeof(timestr), "%Y-%m-%d-%H:%M:%S", &time_info);
 
     if (virAsprintf(&ret, "%s-%s%s", virDomainGetName(dom),
index 5cf3237dd371fc073b4a0f651a4fb96f22c808c3..88da4297b2535cefeeb9c552172242eeda28892a 100644 (file)
@@ -2187,7 +2187,7 @@ vshOutputLogFile(vshControl *ctl, int log_level, const char *msg_format,
     char *str;
     size_t len;
     const char *lvl = "";
-    struct timeval stTimeval;
+    time_t stTime;
     struct tm *stTm;
 
     if (ctl->log_fd == -1)
@@ -2198,8 +2198,8 @@ vshOutputLogFile(vshControl *ctl, int log_level, const char *msg_format,
      *
      * [YYYY.MM.DD HH:MM:SS SIGNATURE PID] LOG_LEVEL message
     */
-    gettimeofday(&stTimeval, NULL);
-    stTm = localtime(&stTimeval.tv_sec);
+    time (&stTime);
+    stTm = localtime(&stTime);
     virBufferAsprintf(&buf, "[%d.%02d.%02d %02d:%02d:%02d %s %d] ",
                       (1900 + stTm->tm_year),
                       (1 + stTm->tm_mon),