xref: /aosp_15_r20/external/toybox/toys/other/yes.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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