[PATCH] time.c: numerous portability fixes
Rich Felker
dalias at aerifal.cx
Fri May 19 01:29:43 UTC 2006
1. printf format strings assume time_t == long. on my system it's long
long (y2038 compliance). posix and iso c allow it to be any
arithmetic type including floating point so it's really necessary
to cast (and the code is probably still broken for float..)
[btw it would probably reduce code size a lot to move all these
instances of time-printing to one function, maybe even use strftime
since it already exists and date already uses it...]
2. __sighandler_t is implementation-internal and is just void(*)(int).
better to declare these pointers directly or typedef your own type
rather than poking at libc internals. also breaks compile on my
system.
rich
-------------- next part --------------
Index: /home/shared/src/busybox/miscutils/time.c
===================================================================
--- /home/shared/src/busybox/miscutils/time.c (revision 15108)
+++ /home/shared/src/busybox/miscutils/time.c (working copy)
@@ -265,14 +265,14 @@
case 'E': /* Elapsed real (wall clock) time. */
if (resp->elapsed.tv_sec >= 3600) /* One hour -> h:m:s. */
fprintf (fp, "%ldh %ldm %02lds",
- resp->elapsed.tv_sec / 3600,
- (resp->elapsed.tv_sec % 3600) / 60,
- resp->elapsed.tv_sec % 60);
+ (long)(resp->elapsed.tv_sec / 3600),
+ (long)((resp->elapsed.tv_sec % 3600) / 60),
+ (long)(resp->elapsed.tv_sec % 60));
else
fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */
- resp->elapsed.tv_sec / 60,
- resp->elapsed.tv_sec % 60,
- resp->elapsed.tv_usec / 10000);
+ (long)(resp->elapsed.tv_sec / 60),
+ (long)(resp->elapsed.tv_sec % 60),
+ (long)(resp->elapsed.tv_usec / 10000));
break;
case 'F': /* Major page faults. */
fprintf (fp, "%ld", resp->ru.ru_majflt);
@@ -305,37 +305,37 @@
break;
case 'S': /* System time. */
fprintf (fp, "%ld.%02ld",
- resp->ru.ru_stime.tv_sec,
- resp->ru.ru_stime.TV_MSEC / 10);
+ (long)(resp->ru.ru_stime.tv_sec),
+ (long)(resp->ru.ru_stime.TV_MSEC / 10));
break;
case 'T': /* System time. */
if (resp->ru.ru_stime.tv_sec >= 3600) /* One hour -> h:m:s. */
fprintf (fp, "%ldh %ldm %02lds",
- resp->ru.ru_stime.tv_sec / 3600,
- (resp->ru.ru_stime.tv_sec % 3600) / 60,
- resp->ru.ru_stime.tv_sec % 60);
+ (long)(resp->ru.ru_stime.tv_sec / 3600),
+ (long)((resp->ru.ru_stime.tv_sec % 3600) / 60),
+ (long)(resp->ru.ru_stime.tv_sec % 60));
else
fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */
- resp->ru.ru_stime.tv_sec / 60,
- resp->ru.ru_stime.tv_sec % 60,
- resp->ru.ru_stime.tv_usec / 10000);
+ (long)(resp->ru.ru_stime.tv_sec / 60),
+ (long)(resp->ru.ru_stime.tv_sec % 60),
+ (long)(resp->ru.ru_stime.tv_usec / 10000));
break;
case 'U': /* User time. */
fprintf (fp, "%ld.%02ld",
- resp->ru.ru_utime.tv_sec,
- resp->ru.ru_utime.TV_MSEC / 10);
+ (long)(resp->ru.ru_utime.tv_sec),
+ (long)(resp->ru.ru_utime.TV_MSEC / 10));
break;
case 'u': /* User time. */
if (resp->ru.ru_utime.tv_sec >= 3600) /* One hour -> h:m:s. */
fprintf (fp, "%ldh %ldm %02lds",
- resp->ru.ru_utime.tv_sec / 3600,
- (resp->ru.ru_utime.tv_sec % 3600) / 60,
- resp->ru.ru_utime.tv_sec % 60);
+ (long)(resp->ru.ru_utime.tv_sec / 3600),
+ (long)((resp->ru.ru_utime.tv_sec % 3600) / 60),
+ (long)(resp->ru.ru_utime.tv_sec % 60));
else
fprintf (fp, "%ldm %ld.%02lds", /* -> m:s. */
- resp->ru.ru_utime.tv_sec / 60,
- resp->ru.ru_utime.tv_sec % 60,
- resp->ru.ru_utime.tv_usec / 10000);
+ (long)(resp->ru.ru_utime.tv_sec / 60),
+ (long)(resp->ru.ru_utime.tv_sec % 60),
+ (long)(resp->ru.ru_utime.tv_usec / 10000));
break;
case 'W': /* Times swapped out. */
fprintf (fp, "%ld", resp->ru.ru_nswap);
@@ -353,8 +353,8 @@
break;
case 'e': /* Elapsed real time in seconds. */
fprintf (fp, "%ld.%02ld",
- resp->elapsed.tv_sec,
- resp->elapsed.tv_usec / 10000);
+ (long)(resp->elapsed.tv_sec),
+ (long)(resp->elapsed.tv_usec / 10000));
break;
case 'k': /* Signals delivered. */
fprintf (fp, "%ld", resp->ru.ru_nsignals);
@@ -429,7 +429,7 @@
static void run_command (char *const *cmd, resource_t *resp)
{
pid_t pid; /* Pid of child. */
- __sighandler_t interrupt_signal, quit_signal;
+ void (*interrupt_signal)(int), (*quit_signal)(int);
gettimeofday (&resp->start, (struct timezone *) 0);
pid = fork (); /* Run CMD as child process. */
More information about the busybox
mailing list