[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