svn commit: trunk/busybox: coreutils include

vda at busybox.net vda at busybox.net
Fri Oct 20 23:48:31 UTC 2006


Author: vda
Date: 2006-10-20 16:48:30 -0700 (Fri, 20 Oct 2006)
New Revision: 16417

Log:
watch: execute command thru shell, not fork/exec. Other fixes


Modified:
   trunk/busybox/coreutils/watch.c
   trunk/busybox/include/usage.h


Changeset:
Modified: trunk/busybox/coreutils/watch.c
===================================================================
--- trunk/busybox/coreutils/watch.c	2006-10-20 19:40:44 UTC (rev 16416)
+++ trunk/busybox/coreutils/watch.c	2006-10-20 23:48:30 UTC (rev 16417)
@@ -13,45 +13,66 @@
 
 #include "busybox.h"
 
+// procps 2.0.18:
+// watch [-d] [-n seconds]
+//   [--differences[=cumulative]] [--interval=seconds] command
+//
+// procps-3.2.3:
+// watch [-dt] [-n seconds]
+//   [--differences[=cumulative]] [--interval=seconds] [--no-title] command
+//
+// (procps 3.x and procps 2.x are forks, not newer/older versions of the same)
 
 int watch_main(int argc, char **argv)
 {
-	int width, len;
+	unsigned opt;
 	unsigned period = 2;
-	char **watched_argv, *header;
+	unsigned cmdlen = 1; // 1 for terminal NUL
+	char *header = NULL;
+	char *cmd;
+	char *tmp;
+	char **p;
 
-	if (argc < 2) bb_show_usage();
+	opt_complementary = "-1"; // at least one param please
+	opt = getopt32(argc, argv, "+dtn:", &tmp);
+	//if (opt & 0x1) // -d (ignore)
+	//if (opt & 0x2) // -t
+	if (opt & 0x4) period = xatou(tmp);
+	argv += optind;
 
-	get_terminal_width_height(STDOUT_FILENO, &width, 0);
-	header = xzalloc(width--);
-
-	/* don't use getopt, because it permutes the arguments */
-	++argv;
-	if ((argc > 3) && argv[0][0] == '-' && argv[0][1] == 'n') {
-		period = xatou(argv[1]);
-		argv += 2;
+	p = argv;
+	while (*p)
+		cmdlen += strlen(*p++) + 1;
+	tmp = cmd = xmalloc(cmdlen);
+	while (*argv) {
+		tmp += sprintf(tmp, " %s", *argv);
+		argv++;
 	}
-	watched_argv = argv;
+	cmd++; // skip initial space
 
-	/* create header */
-	len = snprintf(header, width, "Every %ds:", period);
-	while (*argv && len<width)
-		snprintf(header+len, width-len, " %s", *(argv++));
-
 	while (1) {
-		char *thyme;
-		time_t t;
+		printf("\033[H\033[J");
+		if (!(opt & 0x2)) { // no -t
+			int width, len;
+			char *thyme;
+			time_t t;
 
-		time(&t);
-		thyme = ctime(&t);
-		len = strlen(thyme);
-		if (len < width)
-			header[width-len] = 0;
-		bb_printf("\033[H\033[J%s %s\n", header, thyme);
-
-		waitpid(xspawn(watched_argv),0,0);
+			get_terminal_width_height(STDOUT_FILENO, &width, 0);
+			header = xrealloc(header, width--);
+			// We pad with spaces entire length
+			snprintf(header, width, "Every %ds: %-*s", period, width, cmd);
+			time(&t);
+			thyme = ctime(&t);
+			len = strlen(thyme);
+			if (len < width)
+				strcpy(header + width - len, thyme);
+			puts(header);
+		}
+		fflush(stdout);
+		// TODO: 'real' watch pipes cmd's output to itself
+		// and does not allow it to overflow the screen
+		// (taking into account linewrap!)
+		system(cmd);
 		sleep(period);
 	}
-	if (ENABLE_FEATURE_CLEAN_UP)
-		free(header);
 }

Modified: trunk/busybox/include/usage.h
===================================================================
--- trunk/busybox/include/usage.h	2006-10-20 19:40:44 UTC (rev 16416)
+++ trunk/busybox/include/usage.h	2006-10-20 23:48:30 UTC (rev 16417)
@@ -3296,11 +3296,12 @@
 	"\t-a\tLock all VTs"
 
 #define watch_trivial_usage \
-	"[-n <seconds>] COMMAND..."
+	"[-n <seconds>] [-t] COMMAND..."
 #define watch_full_usage \
-	"Executes a program periodically.\n" \
+	"Executes a program periodically\n\n" \
 	"Options:\n" \
-	"\t-n\tLoop period in seconds - default is 2"
+	"\t-n\tLoop period in seconds - default is 2\n"
+	"\t-t\tDon't print header"
 #define watch_example_usage \
 	"$ watch date\n" \
 	"Mon Dec 17 10:31:40 GMT 2000\n" \




More information about the busybox-cvs mailing list