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