1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <unistd.h>
6 
7 FILE *
exec_cmd(char * prog,char * format,...)8 exec_cmd(char *prog, char *format, ...) {
9 	va_list		v;
10 	char		buf[4096]	= { 0 };
11 	char		*p;
12 	int		err	= 0;
13 	int		len	= 0;
14 	FILE		*fd;
15 
16 	va_start(v, format);
17 
18 	strncpy(buf, prog, sizeof buf);
19 	buf[sizeof(buf) - 1] = 0;
20 	len = strlen(buf);
21 
22 	while (*format) {
23 		printf("HAH %c\n", *format);
24 		switch (*format) {
25 		case '%':
26 			switch (*++format) {
27 			case 's':
28 				p = va_arg(v, char *);
29 				printf("doing ");
30 				fflush(stdout);
31 				printf("%s\n", p);
32 
33 				if (strlen(p) > (sizeof buf - strlen(buf))) {
34 					(void) fprintf(stderr,
35 						"Arguments too long.\n");
36 					err = 1;
37 					break;
38 				}
39 				strcat(buf, p);
40 				len += strlen(p);
41 				break;
42 			default:
43 				(void) fprintf(stderr,
44 				"Unknown escape sequence - ignoring.\n");
45 				if (*format == 0) {
46 					err = 1;
47 				}
48 			}
49 			break;
50 		default:
51 			if (len < 4095) {
52 				buf[len] = *format;
53 				++len;
54 				buf[len] = 0;
55 			} else {
56 				fprintf(stderr, "Arguments too long.\n");
57 				err = 1;
58 				break;
59 			}
60 		}
61 		if (err == 1) {
62 			return NULL;
63 		}
64 		if (*++format == 0) {
65 			break;
66 		}
67 	}
68 	va_end(v);
69 	buf[len] = 0;
70 	fd = popen(buf, "r");
71 	return fd;
72 }
73 
74 int
main(void)75 main(void) {
76 	FILE	*fd;
77 	char	buf[128];
78 
79 	if (getcwd(buf, sizeof buf) == NULL) {
80 		perror("getcwd");
81 		return 1;
82 	}
83 
84 	if ((fd = exec_cmd("ls", " %s/n_%s", buf, "libc.c", NULL)) != NULL) {
85 		while (fgets(buf, sizeof buf, fd) != NULL) {
86 			char	*p = strrchr(buf, '/');
87 			printf("%s", p+1);
88 		}
89 		(void) pclose(fd);
90 	}
91 	return 0;
92 }
93 
94