1*cf5a6c84SAndroid Build Coastguard Worker /* yes.c - Repeatedly output a string.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2007 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker
5*cf5a6c84SAndroid Build Coastguard Worker USE_YES(NEWTOY(yes, 0, TOYFLAG_USR|TOYFLAG_BIN))
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker config YES
8*cf5a6c84SAndroid Build Coastguard Worker bool "yes"
9*cf5a6c84SAndroid Build Coastguard Worker default y
10*cf5a6c84SAndroid Build Coastguard Worker help
11*cf5a6c84SAndroid Build Coastguard Worker usage: yes [args...]
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker Repeatedly output line until killed. If no args, output 'y'.
14*cf5a6c84SAndroid Build Coastguard Worker */
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
17*cf5a6c84SAndroid Build Coastguard Worker
yes_main(void)18*cf5a6c84SAndroid Build Coastguard Worker void yes_main(void)
19*cf5a6c84SAndroid Build Coastguard Worker {
20*cf5a6c84SAndroid Build Coastguard Worker struct iovec *iov = (void *)toybuf;
21*cf5a6c84SAndroid Build Coastguard Worker char *out, *ss;
22*cf5a6c84SAndroid Build Coastguard Worker long len, ll, i, j;
23*cf5a6c84SAndroid Build Coastguard Worker
24*cf5a6c84SAndroid Build Coastguard Worker // Collate command line arguments into one string, or repeated "y\n".
25*cf5a6c84SAndroid Build Coastguard Worker for (len = i = 0; toys.optargs[i]; i++) len += strlen(toys.optargs[i]) + 1;
26*cf5a6c84SAndroid Build Coastguard Worker ss = out = xmalloc(len ? : 128);
27*cf5a6c84SAndroid Build Coastguard Worker if (!i) for (i = 0; i<64; i++) {
28*cf5a6c84SAndroid Build Coastguard Worker *ss++ = 'y';
29*cf5a6c84SAndroid Build Coastguard Worker *ss++ = '\n';
30*cf5a6c84SAndroid Build Coastguard Worker } else {
31*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; toys.optargs[i]; i++)
32*cf5a6c84SAndroid Build Coastguard Worker ss += sprintf(ss, " %s"+!i, toys.optargs[i]);
33*cf5a6c84SAndroid Build Coastguard Worker *ss++ = '\n';
34*cf5a6c84SAndroid Build Coastguard Worker }
35*cf5a6c84SAndroid Build Coastguard Worker
36*cf5a6c84SAndroid Build Coastguard Worker // Populate a redundant iovec[] outputting the same string many times
37*cf5a6c84SAndroid Build Coastguard Worker for (i = ll = 0; i<sizeof(toybuf)/sizeof(*iov); i++) {
38*cf5a6c84SAndroid Build Coastguard Worker iov[i].iov_base = out;
39*cf5a6c84SAndroid Build Coastguard Worker ll += (iov[i].iov_len = ss-out);
40*cf5a6c84SAndroid Build Coastguard Worker }
41*cf5a6c84SAndroid Build Coastguard Worker
42*cf5a6c84SAndroid Build Coastguard Worker // Writev the output until stdout stops accepting it
43*cf5a6c84SAndroid Build Coastguard Worker for (;;) for (len = 0; len<ll; len += j)
44*cf5a6c84SAndroid Build Coastguard Worker if (0>(j = writev(1, iov, i))) perror_exit(0);
45*cf5a6c84SAndroid Build Coastguard Worker }
46