annotate lib/lib.c @ 658:2b957eaa00c7

Add du command.
author Ashwini Kumar <ak.ashwini@gmail.com>
date Sun, 26 Aug 2012 21:17:00 -0500
parents 7bdebd2af1d6
children e4b96507688a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
1 /* vi: set sw=4 ts=4 :*/
250
101a71a76c24 Fix filename in header
Charlie Shepherd <masterdriverz@gentoo.org>
parents: 245
diff changeset
2 /* lib.c - reusable stuff.
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
3 *
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
4 * Functions with the x prefix are wrappers for library functions. They either
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
5 * succeed or kill the program with an error message, but never return failure.
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
6 * They usually have the same arguments and return value as the function they
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
7 * wrap.
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
8 *
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
9 * Copyright 2006 Rob Landley <rob@landley.net>
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
10 */
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
11
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
12 #include "toys.h"
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
13
167
f16c8e5e9435 Replace strlcpy() with xstrcpy(), which exits if the string won't fit.
Rob Landley <rob@landley.net>
parents: 156
diff changeset
14 // Strcpy with size checking: exit if there's not enough space for the string.
f16c8e5e9435 Replace strlcpy() with xstrcpy(), which exits if the string won't fit.
Rob Landley <rob@landley.net>
parents: 156
diff changeset
15 void xstrcpy(char *dest, char *src, size_t size)
124
ef2bc92d5fb0 Work around uClibc weirdness.
Rob Landley <rob@landley.net>
parents: 115
diff changeset
16 {
167
f16c8e5e9435 Replace strlcpy() with xstrcpy(), which exits if the string won't fit.
Rob Landley <rob@landley.net>
parents: 156
diff changeset
17 if (strlen(src)+1 > size) error_exit("xstrcpy");
f16c8e5e9435 Replace strlcpy() with xstrcpy(), which exits if the string won't fit.
Rob Landley <rob@landley.net>
parents: 156
diff changeset
18 strcpy(dest, src);
124
ef2bc92d5fb0 Work around uClibc weirdness.
Rob Landley <rob@landley.net>
parents: 115
diff changeset
19 }
ef2bc92d5fb0 Work around uClibc weirdness.
Rob Landley <rob@landley.net>
parents: 115
diff changeset
20
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
21 void verror_msg(char *msg, int err, va_list va)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
22 {
245
67a0839bda77 Teach perror_exit() to take a NULL argument when we just want "command: error".
Rob Landley <rob@landley.net>
parents: 234
diff changeset
23 char *s = ": %s";
67a0839bda77 Teach perror_exit() to take a NULL argument when we just want "command: error".
Rob Landley <rob@landley.net>
parents: 234
diff changeset
24
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
25 fprintf(stderr, "%s: ", toys.which->name);
245
67a0839bda77 Teach perror_exit() to take a NULL argument when we just want "command: error".
Rob Landley <rob@landley.net>
parents: 234
diff changeset
26 if (msg) vfprintf(stderr, msg, va);
67a0839bda77 Teach perror_exit() to take a NULL argument when we just want "command: error".
Rob Landley <rob@landley.net>
parents: 234
diff changeset
27 else s+=2;
67a0839bda77 Teach perror_exit() to take a NULL argument when we just want "command: error".
Rob Landley <rob@landley.net>
parents: 234
diff changeset
28 if (err) fprintf(stderr, s, strerror(err));
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
29 putc('\n', stderr);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
30 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
31
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
32 void error_msg(char *msg, ...)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
33 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
34 va_list va;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
35
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
36 va_start(va, msg);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
37 verror_msg(msg, 0, va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
38 va_end(va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
39 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
40
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
41 void perror_msg(char *msg, ...)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
42 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
43 va_list va;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
44
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
45 va_start(va, msg);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
46 verror_msg(msg, errno, va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
47 va_end(va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
48 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
49
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
50 // Die with an error message.
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
51 void error_exit(char *msg, ...)
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
52 {
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
53 va_list va;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
54
144
1fbc50374a30 Promote help to global config option, teach error_exit() to output usage message when called
Rob Landley <rob@landley.net>
parents: 143
diff changeset
55 if (CFG_HELP && toys.exithelp) {
1fbc50374a30 Promote help to global config option, teach error_exit() to output usage message when called
Rob Landley <rob@landley.net>
parents: 143
diff changeset
56 *toys.optargs=*toys.argv;
234
163498bf547b Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents: 220
diff changeset
57 USE_HELP(help_main();) // dear gcc: shut up.
144
1fbc50374a30 Promote help to global config option, teach error_exit() to output usage message when called
Rob Landley <rob@landley.net>
parents: 143
diff changeset
58 fprintf(stderr,"\n");
1fbc50374a30 Promote help to global config option, teach error_exit() to output usage message when called
Rob Landley <rob@landley.net>
parents: 143
diff changeset
59 }
1fbc50374a30 Promote help to global config option, teach error_exit() to output usage message when called
Rob Landley <rob@landley.net>
parents: 143
diff changeset
60
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
61 va_start(va, msg);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
62 verror_msg(msg, 0, va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
63 va_end(va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
64
197
571623c6765d Changeset 186 assumed that toys.exitval defaults to 0. Actually change the
Rob Landley <rob@landley.net>
parents: 187
diff changeset
65 exit(!toys.exitval ? 1 : toys.exitval);
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
66 }
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
67
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
68
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
69 // Die with an error message and strerror(errno)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
70 void perror_exit(char *msg, ...)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
71 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
72 va_list va;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
73
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
74 va_start(va, msg);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
75 verror_msg(msg, errno, va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
76 va_end(va);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
77
197
571623c6765d Changeset 186 assumed that toys.exitval defaults to 0. Actually change the
Rob Landley <rob@landley.net>
parents: 187
diff changeset
78 exit(!toys.exitval ? 1 : toys.exitval);
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
79 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
80
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
81 // Die unless we can allocate memory.
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
82 void *xmalloc(size_t size)
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
83 {
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
84 void *ret = malloc(size);
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
85 if (!ret) error_exit("xmalloc");
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
86
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
87 return ret;
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
88 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
89
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
90 // Die unless we can allocate prezeroed memory.
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
91 void *xzalloc(size_t size)
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
92 {
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
93 void *ret = xmalloc(size);
480
f558dce66095 Nathan McSween convinced me compilers that inline memset() can optimize the bzero case pretty well.
Rob Landley <rob@landley.net>
parents: 477
diff changeset
94 memset(ret, 0, size);
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
95 return ret;
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
96 }
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
97
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
98 // Die unless we can change the size of an existing allocation, possibly
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
99 // moving it. (Notice different arguments from libc function.)
115
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
100 void *xrealloc(void *ptr, size_t size)
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
101 {
115
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
102 ptr = realloc(ptr, size);
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
103 if (!ptr) error_exit("xrealloc");
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
104
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
105 return ptr;
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
106 }
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
107
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
108 // Die unless we can allocate a copy of this many bytes of string.
369
5715eed39575 Correct return types of xstrdup() and xstrndup()
Rob Landley <rob@landley.net>
parents: 354
diff changeset
109 char *xstrndup(char *s, size_t n)
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
110 {
284
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
111 char *ret = xmalloc(++n);
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
112 strncpy(ret, s, n);
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
113 ret[--n]=0;
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
114
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
115 return ret;
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
116 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
117
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
118 // Die unless we can allocate a copy of this string.
369
5715eed39575 Correct return types of xstrdup() and xstrndup()
Rob Landley <rob@landley.net>
parents: 354
diff changeset
119 char *xstrdup(char *s)
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
120 {
252
8d751063a563 Add spaces after some commas (from Charlie Shepherd).
Rob Landley <rob@landley.net>
parents: 251
diff changeset
121 return xstrndup(s, strlen(s));
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
122 }
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
123
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
124 // Die unless we can allocate enough space to sprintf() into.
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
125 char *xmsprintf(char *format, ...)
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
126 {
126
7b22987a7b47 Vladimir Oleynik pointed out that va_start() twice in the same function
Rob Landley <rob@landley.net>
parents: 124
diff changeset
127 va_list va, va2;
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
128 int len;
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
129 char *ret;
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
130
126
7b22987a7b47 Vladimir Oleynik pointed out that va_start() twice in the same function
Rob Landley <rob@landley.net>
parents: 124
diff changeset
131 va_start(va, format);
7b22987a7b47 Vladimir Oleynik pointed out that va_start() twice in the same function
Rob Landley <rob@landley.net>
parents: 124
diff changeset
132 va_copy(va2, va);
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
133
126
7b22987a7b47 Vladimir Oleynik pointed out that va_start() twice in the same function
Rob Landley <rob@landley.net>
parents: 124
diff changeset
134 // How long is it?
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
135 len = vsnprintf(0, 0, format, va);
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
136 len++;
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
137 va_end(va);
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
138
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
139 // Allocate and do the sprintf()
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
140 ret = xmalloc(len);
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
141 vsnprintf(ret, len, format, va2);
126
7b22987a7b47 Vladimir Oleynik pointed out that va_start() twice in the same function
Rob Landley <rob@landley.net>
parents: 124
diff changeset
142 va_end(va2);
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
143
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
144 return ret;
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
145 }
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
146
70
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
147 void xprintf(char *format, ...)
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
148 {
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
149 va_list va;
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
150 va_start(va, format);
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
151
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
152 vprintf(format, va);
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
153 if (ferror(stdout)) perror_exit("write");
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
154 }
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
155
128
0a90a5fbc1bf Add xputs() to detect EOF on writes.
Rob Landley <rob@landley.net>
parents: 126
diff changeset
156 void xputs(char *s)
0a90a5fbc1bf Add xputs() to detect EOF on writes.
Rob Landley <rob@landley.net>
parents: 126
diff changeset
157 {
0a90a5fbc1bf Add xputs() to detect EOF on writes.
Rob Landley <rob@landley.net>
parents: 126
diff changeset
158 if (EOF == puts(s)) perror_exit("write");
0a90a5fbc1bf Add xputs() to detect EOF on writes.
Rob Landley <rob@landley.net>
parents: 126
diff changeset
159 }
0a90a5fbc1bf Add xputs() to detect EOF on writes.
Rob Landley <rob@landley.net>
parents: 126
diff changeset
160
70
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
161 void xputc(char c)
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
162 {
640
85fc06bd63c4 Workaround longstanding glibc/ld bug, ala http://sources.redhat.com/bugzilla/show_bug.cgi?id=3400, which prevents "./toybox | wc" from producing any output when toybox was statically linked.
Rob Landley <rob@landley.net>
parents: 638
diff changeset
163 if (EOF == fputc(c, stdout) || fflush(stdout)) perror_exit("write");
70
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
164 }
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
165
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
166 void xflush(void)
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
167 {
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
168 if (fflush(stdout)) perror_exit("write");;
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
169 }
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
170
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
171 // Die unless we can exec argv[] (or run builtin command). Note that anything
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
172 // with a path isn't a builtin, so /bin/sh won't match the builtin sh.
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
173 void xexec(char **argv)
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
174 {
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
175 toy_exec(argv);
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
176 execvp(argv[0], argv);
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
177
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
178 perror_exit("exec %s", argv[0]);
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
179 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
180
51
63edd4de94dd Add xaccess()
Rob Landley <rob@landley.net>
parents: 50
diff changeset
181 void xaccess(char *path, int flags)
63edd4de94dd Add xaccess()
Rob Landley <rob@landley.net>
parents: 50
diff changeset
182 {
251
d9ddba2c7acf Remove extra newlines on error_paths
Charlie Shepherd <masterdriverz@gentoo.org>
parents: 250
diff changeset
183 if (access(path, flags)) perror_exit("Can't access '%s'", path);
51
63edd4de94dd Add xaccess()
Rob Landley <rob@landley.net>
parents: 50
diff changeset
184 }
63edd4de94dd Add xaccess()
Rob Landley <rob@landley.net>
parents: 50
diff changeset
185
214
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
186 // Die unless we can delete a file. (File must exist to be deleted.)
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
187 void xunlink(char *path)
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
188 {
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
189 if (unlink(path)) perror_exit("unlink '%s'", path);
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
190 }
98820d1eaa79 Upgrade patch to understand creating and deleting files.
Rob Landley <rob@landley.net>
parents: 209
diff changeset
191
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
192 // Die unless we can open/create a file, returning file descriptor.
49
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
193 int xcreate(char *path, int flags, int mode)
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
194 {
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
195 int fd = open(path, flags, mode);
148
88dd003ccdf4 xcreate(): perror already prints error name and newline, remove redundancy.
Rob Landley <rob@landley.net>
parents: 144
diff changeset
196 if (fd == -1) perror_exit("%s", path);
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
197 return fd;
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
198 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
199
49
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
200 // Die unless we can open a file, returning file descriptor.
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
201 int xopen(char *path, int flags)
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
202 {
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
203 return xcreate(path, flags, 0);
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
204 }
bb4c38853a7d xopen() wants 2 arguments unless you're creating a file, in which case you
Rob Landley <rob@landley.net>
parents: 44
diff changeset
205
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
206 void xclose(int fd)
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
207 {
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
208 if (close(fd)) perror_exit("xclose");
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
209 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
210
565
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
211 int xdup(int fd)
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
212 {
592
be4b2d3796eb Feeding -1 to xdup() isn't an error.
Rob Landley <rob@landley.net>
parents: 590
diff changeset
213 if (fd != -1) {
be4b2d3796eb Feeding -1 to xdup() isn't an error.
Rob Landley <rob@landley.net>
parents: 590
diff changeset
214 fd = dup(fd);
be4b2d3796eb Feeding -1 to xdup() isn't an error.
Rob Landley <rob@landley.net>
parents: 590
diff changeset
215 if (fd == -1) perror_exit("xdup");
be4b2d3796eb Feeding -1 to xdup() isn't an error.
Rob Landley <rob@landley.net>
parents: 590
diff changeset
216 }
565
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
217 return fd;
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
218 }
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
219
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
220 // Die unless we can open/create a file, returning FILE *.
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
221 FILE *xfopen(char *path, char *mode)
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
222 {
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
223 FILE *f = fopen(path, mode);
251
d9ddba2c7acf Remove extra newlines on error_paths
Charlie Shepherd <masterdriverz@gentoo.org>
parents: 250
diff changeset
224 if (!f) perror_exit("No file %s", path);
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
225 return f;
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff changeset
226 }
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
227
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
228 // Keep reading until full or EOF
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
229 ssize_t readall(int fd, void *buf, size_t len)
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
230 {
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
231 size_t count = 0;
309
79a61cd58596 Bug spotted by Roberto Foglietta: at EOF readall() should return count, not len.
Rob Landley <rob@landley.net>
parents: 308
diff changeset
232
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
233 while (count<len) {
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
234 int i = read(fd, buf+count, len-count);
309
79a61cd58596 Bug spotted by Roberto Foglietta: at EOF readall() should return count, not len.
Rob Landley <rob@landley.net>
parents: 308
diff changeset
235 if (!i) break;
8
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
236 if (i<0) return i;
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
237 count += i;
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
238 }
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
239
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
240 return count;
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
241 }
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
242
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
243 // Keep writing until done or EOF
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
244 ssize_t writeall(int fd, void *buf, size_t len)
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
245 {
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
246 size_t count = 0;
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
247 while (count<len) {
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
248 int i = write(fd, buf+count, len-count);
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
249 if (i<1) return i;
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
250 count += i;
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
251 }
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
252
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
253 return count;
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
254 }
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
255
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
256 // Die if there's an error other than EOF.
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
257 size_t xread(int fd, void *buf, size_t len)
8
04f66da2bdbf Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents: 7
diff changeset
258 {
399
7a5b70965e0e Bugfix (spotted by Nathan McSween): xread can't detect <0 if the return type is stored in an unsigned variable.
Rob Landley <rob@landley.net>
parents: 397
diff changeset
259 ssize_t ret = read(fd, buf, len);
7a5b70965e0e Bugfix (spotted by Nathan McSween): xread can't detect <0 if the return type is stored in an unsigned variable.
Rob Landley <rob@landley.net>
parents: 397
diff changeset
260 if (ret < 0) perror_exit("xread");
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
261
399
7a5b70965e0e Bugfix (spotted by Nathan McSween): xread can't detect <0 if the return type is stored in an unsigned variable.
Rob Landley <rob@landley.net>
parents: 397
diff changeset
262 return ret;
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
263 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
264
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
265 void xreadall(int fd, void *buf, size_t len)
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
266 {
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
267 if (len != readall(fd, buf, len)) perror_exit("xreadall");
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
268 }
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
269
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
270 // There's no xwriteall(), just xwrite(). When we read, there may or may not
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
271 // be more data waiting. When we write, there is data and it had better go
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
272 // somewhere.
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
273
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
274 void xwrite(int fd, void *buf, size_t len)
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
275 {
63
69efffcacd70 Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents: 53
diff changeset
276 if (len != writeall(fd, buf, len)) perror_exit("xwrite");
50
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
277 }
63c168b65fa6 Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents: 49
diff changeset
278
340
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
279 // Die if lseek fails, probably due to being called on a pipe.
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
280
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
281 off_t xlseek(int fd, off_t offset, int whence)
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
282 {
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
283 offset = lseek(fd, offset, whence);
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
284 if (offset<0) perror_exit("lseek");
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
285
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
286 return offset;
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
287 }
6e03d6a8df23 Add mkswap.
Rob Landley <rob@landley.net>
parents: 337
diff changeset
288
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
289 off_t lskip(int fd, off_t offset)
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
290 {
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
291 off_t and = lseek(fd, offset, SEEK_CUR);
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
292
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
293 if (and != -1 && offset >= lseek(fd, offset, SEEK_END)
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
294 && offset+and == lseek(fd, offset+and, SEEK_SET)) return 0;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
295 else {
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
296 char buf[4096];
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
297 while (offset>0) {
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
298 int try = offset>sizeof(buf) ? sizeof(buf) : offset, or;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
299
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
300 or = readall(fd, buf, try);
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
301 if (or < 0) perror_msg("lskip to %lld", (long long)offset);
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
302 else offset -= try;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
303 if (or < try) break;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
304 }
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
305
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
306 return offset;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
307 }
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
308 }
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
309
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
310 char *xgetcwd(void)
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
311 {
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
312 char *buf = getcwd(NULL, 0);
70
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
313 if (!buf) perror_exit("xgetcwd");
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
314
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
315 return buf;
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
316 }
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
317
95
a636e4d20f13 Add xstat(), read_dirtree(), and read_dirtree_node().
Rob Landley <rob@landley.net>
parents: 77
diff changeset
318 void xstat(char *path, struct stat *st)
a636e4d20f13 Add xstat(), read_dirtree(), and read_dirtree_node().
Rob Landley <rob@landley.net>
parents: 77
diff changeset
319 {
252
8d751063a563 Add spaces after some commas (from Charlie Shepherd).
Rob Landley <rob@landley.net>
parents: 251
diff changeset
320 if(stat(path, st)) perror_exit("Can't stat %s", path);
95
a636e4d20f13 Add xstat(), read_dirtree(), and read_dirtree_node().
Rob Landley <rob@landley.net>
parents: 77
diff changeset
321 }
a636e4d20f13 Add xstat(), read_dirtree(), and read_dirtree_node().
Rob Landley <rob@landley.net>
parents: 77
diff changeset
322
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
323 // Cannonicalizes path by removing ".", "..", and "//" elements. This is not
44
e74aa8b8660a Comment tweak.
Rob Landley <rob@landley.net>
parents: 20
diff changeset
324 // the same as realpath(), where "dir/.." could wind up somewhere else by
e74aa8b8660a Comment tweak.
Rob Landley <rob@landley.net>
parents: 20
diff changeset
325 // following symlinks.
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
326 char *xabspath(char *path)
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
327 {
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
328 char *from, *to;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
329
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
330 // If this isn't an absolute path, make it one with cwd.
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
331 if (path[0]!='/') {
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
332 char *cwd=xgetcwd();
252
8d751063a563 Add spaces after some commas (from Charlie Shepherd).
Rob Landley <rob@landley.net>
parents: 251
diff changeset
333 path = xmsprintf("%s/%s", cwd, path);
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
334 free(cwd);
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
335 } else path = xstrdup(path);
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
336
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
337 // Loop through path elements
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
338 from = to = path;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
339 while (*from) {
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
340
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
341 // Continue any current path component.
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
342 if (*from!='/') {
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
343 *(to++) = *(from++);
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
344 continue;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
345 }
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
346
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
347 // Skip duplicate slashes.
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
348 while (*from=='/') from++;
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
349
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
350 // Start of a new filename. Handle . and ..
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
351 while (*from=='.') {
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
352 // Skip .
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
353 if (from[1]=='/') from += 2;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
354 else if (!from[1]) from++;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
355 // Back up for ..
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
356 else if (from[1]=='.') {
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
357 if (from[2]=='/') from +=3;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
358 else if(!from[2]) from+=2;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
359 else break;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
360 while (to>path && *(--to)!='/');
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
361 } else break;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
362 }
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
363 // Add directory separator slash.
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
364 *(to++) = '/';
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
365 }
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
366 *to = 0;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
367
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
368 return path;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
369 }
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
370
585
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
371 // Resolve all symlinks, returning malloc() memory.
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
372 char *xrealpath(char *path)
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
373 {
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
374 char *new = realpath(path, NULL);
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
375 if (!new) perror_exit("realpath '%s'", path);
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
376 return new;
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
377 }
1dcd7994abea Add xrealpath() at suggestion of Ashish Briggers.
Rob Landley <rob@landley.net>
parents: 578
diff changeset
378
292
b4077be6c746 Update mdev to work around the newest sysfs api breakage in the 2.6.25 kernel.
Rob Landley <rob@landley.net>
parents: 284
diff changeset
379 void xchdir(char *path)
b4077be6c746 Update mdev to work around the newest sysfs api breakage in the 2.6.25 kernel.
Rob Landley <rob@landley.net>
parents: 284
diff changeset
380 {
344
a0c3767f0a82 Fix thinko.
Rob Landley <rob@landley.net>
parents: 340
diff changeset
381 if (chdir(path)) error_exit("chdir '%s'", path);
292
b4077be6c746 Update mdev to work around the newest sysfs api breakage in the 2.6.25 kernel.
Rob Landley <rob@landley.net>
parents: 284
diff changeset
382 }
b4077be6c746 Update mdev to work around the newest sysfs api breakage in the 2.6.25 kernel.
Rob Landley <rob@landley.net>
parents: 284
diff changeset
383
216
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
384 // Ensure entire path exists.
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
385 // If mode != -1 set permissions on newly created dirs.
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
386 // Requires that path string be writable (for temporary null terminators).
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
387 void xmkpath(char *path, int mode)
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
388 {
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
389 char *p, old;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
390 mode_t mask;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
391 int rc;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
392 struct stat st;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
393
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
394 for (p = path; ; p++) {
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
395 if (!*p || *p == '/') {
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
396 old = *p;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
397 *p = rc = 0;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
398 if (stat(path, &st) || !S_ISDIR(st.st_mode)) {
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
399 if (mode != -1) {
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
400 mask=umask(0);
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
401 rc = mkdir(path, mode);
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
402 umask(mask);
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
403 } else rc = mkdir(path, 0777);
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
404 }
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
405 *p = old;
252
8d751063a563 Add spaces after some commas (from Charlie Shepherd).
Rob Landley <rob@landley.net>
parents: 251
diff changeset
406 if(rc) perror_exit("mkpath '%s'", path);
216
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
407 }
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
408 if (!*p) break;
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
409 }
5697a3f7c8cf Make patch's file add actually work, including directory creating and
Rob Landley <rob@landley.net>
parents: 214
diff changeset
410 }
370
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
411
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
412 // setuid() can fail (for example, too many processes belonging to that user),
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
413 // which opens a security hole if the process continues as the original user.
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
414
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
415 void xsetuid(uid_t uid)
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
416 {
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
417 if (setuid(uid)) perror_exit("xsetuid");
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
418 }
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
419
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 369
diff changeset
420
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
421 // Find all file in a colon-separated path with access type "type" (generally
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
422 // X_OK or R_OK). Returns a list of absolute paths to each file found, in
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
423 // order.
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
424
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
425 struct string_list *find_in_path(char *path, char *filename)
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
426 {
295
5a0faa267866 Fix which (the meaning of -a was reversed, and it was finding the _last_ hit).
Rob Landley <rob@landley.net>
parents: 292
diff changeset
427 struct string_list *rlist = NULL, **prlist=&rlist;
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
428 char *cwd = xgetcwd();
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
429
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
430 for (;;) {
535
d51be130fda2 More stabs at getting #includes right, and moving off of deprecated functions.
Rob Landley <rob@landley.net>
parents: 503
diff changeset
431 char *next = path ? strchr(path, ':') : NULL;
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
432 int len = next ? next-path : strlen(path);
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
433 struct string_list *rnext;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
434 struct stat st;
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
435
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
436 rnext = xmalloc(sizeof(void *) + strlen(filename)
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
437 + (len ? len : strlen(cwd)) + 2);
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
438 if (!len) sprintf(rnext->str, "%s/%s", cwd, filename);
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
439 else {
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
440 char *res = rnext->str;
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
441 strncpy(res, path, len);
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
442 res += len;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
443 *(res++) = '/';
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
444 strcpy(res, filename);
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
445 }
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
446
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
447 // Confirm it's not a directory.
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
448 if (!stat(rnext->str, &st) && S_ISREG(st.st_mode)) {
295
5a0faa267866 Fix which (the meaning of -a was reversed, and it was finding the _last_ hit).
Rob Landley <rob@landley.net>
parents: 292
diff changeset
449 *prlist = rnext;
5a0faa267866 Fix which (the meaning of -a was reversed, and it was finding the _last_ hit).
Rob Landley <rob@landley.net>
parents: 292
diff changeset
450 rnext->next = NULL;
5a0faa267866 Fix which (the meaning of -a was reversed, and it was finding the _last_ hit).
Rob Landley <rob@landley.net>
parents: 292
diff changeset
451 prlist = &(rnext->next);
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
452 } else free(rnext);
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
453
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
454 if (!next) break;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
455 path += len;
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
456 path++;
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
457 }
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
458 free(cwd);
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
459
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
460 return rlist;
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
461 }
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
462
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
463 // Convert unsigned int to ascii, writing into supplied buffer. A truncated
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
464 // result contains the first few digits of the result ala strncpy, and is
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
465 // always null terminated (unless buflen is 0).
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
466 void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
467 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
468 int i, out = 0;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
469
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
470 if (buflen) {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
471 for (i=1000000000; i; i/=10) {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
472 int res = n/i;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
473
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
474 if ((res || out || i == 1) && --buflen>0) {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
475 out++;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
476 n -= res*i;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
477 *buf++ = '0' + res;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
478 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
479 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
480 *buf = 0;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
481 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
482 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
483
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
484 // Convert signed integer to ascii, using utoa_to_buf()
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
485 void itoa_to_buf(int n, char *buf, unsigned buflen)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
486 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
487 if (buflen && n<0) {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
488 n = -n;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
489 *buf++ = '-';
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
490 buflen--;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
491 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
492 utoa_to_buf((unsigned)n, buf, buflen);
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
493 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
494
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
495 // This static buffer is used by both utoa() and itoa(), calling either one a
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
496 // second time will overwrite the previous results.
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
497 //
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
498 // The longest 32 bit integer is -2 billion plus a null terminator: 12 bytes.
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
499 // Note that int is always 32 bits on any remotely unix-like system, see
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
500 // http://www.unix.org/whitepapers/64bit.html for details.
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
501
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
502 static char itoa_buf[12];
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
503
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
504 // Convert unsigned integer to ascii, returning a static buffer.
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
505 char *utoa(unsigned n)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
506 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
507 utoa_to_buf(n, itoa_buf, sizeof(itoa_buf));
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
508
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
509 return itoa_buf;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
510 }
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
511
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
512 char *itoa(int n)
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
513 {
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
514 itoa_to_buf(n, itoa_buf, sizeof(itoa_buf));
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
515
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
516 return itoa_buf;
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
517 }
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
518
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
519 // atol() with the kilo/mega/giga/tera/peta/exa extensions.
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
520 // (zetta and yotta don't fit in 64 bits.)
443
41b5ac08208f Make atolx() error_exit() if fed a string that doesn't convert entirely into an integer.
Rob Landley <rob@landley.net>
parents: 419
diff changeset
521 long atolx(char *numstr)
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
522 {
615
43489d673976 Add NOP b (byte) suffix to atolx() since od needs it.
Rob Landley <rob@landley.net>
parents: 604
diff changeset
523 char *c, *suffixes="bkmgtpe", *end;
443
41b5ac08208f Make atolx() error_exit() if fed a string that doesn't convert entirely into an integer.
Rob Landley <rob@landley.net>
parents: 419
diff changeset
524 long val = strtol(numstr, &c, 0);
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
525
149
58554af48c8b Fix from Charlie Shepherd: at end of string, don't match the null terminator
Rob Landley <rob@landley.net>
parents: 148
diff changeset
526 if (*c) {
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
527 if (c != numstr && (end = strchr(suffixes, tolower(*c)))) {
615
43489d673976 Add NOP b (byte) suffix to atolx() since od needs it.
Rob Landley <rob@landley.net>
parents: 604
diff changeset
528 int shift = end-suffixes;
43489d673976 Add NOP b (byte) suffix to atolx() since od needs it.
Rob Landley <rob@landley.net>
parents: 604
diff changeset
529 if (shift--) val *= 1024L<<(shift*10);
43489d673976 Add NOP b (byte) suffix to atolx() since od needs it.
Rob Landley <rob@landley.net>
parents: 604
diff changeset
530 } else {
443
41b5ac08208f Make atolx() error_exit() if fed a string that doesn't convert entirely into an integer.
Rob Landley <rob@landley.net>
parents: 419
diff changeset
531 while (isspace(*c)) c++;
41b5ac08208f Make atolx() error_exit() if fed a string that doesn't convert entirely into an integer.
Rob Landley <rob@landley.net>
parents: 419
diff changeset
532 if (*c) error_exit("not integer: %s", numstr);
41b5ac08208f Make atolx() error_exit() if fed a string that doesn't convert entirely into an integer.
Rob Landley <rob@landley.net>
parents: 419
diff changeset
533 }
149
58554af48c8b Fix from Charlie Shepherd: at end of string, don't match the null terminator
Rob Landley <rob@landley.net>
parents: 148
diff changeset
534 }
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
535
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
536 return val;
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
537 }
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
538
565
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
539 int numlen(long l)
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
540 {
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
541 int len = 0;
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
542 while (l) {
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
543 l /= 10;
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
544 len++;
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
545 }
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
546 return len;
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
547 }
44abf4d901f3 Rewrite dirtree so we don't need readdir, scandir, and fts.h. Rewrite ls (from scratch) to use new dirtree infrastructure. (This breaks everything else that currently uses dirtree.)
Rob Landley <rob@landley.net>
parents: 554
diff changeset
548
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
549 int stridx(char *haystack, char needle)
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
550 {
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
551 char *off;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
552
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
553 if (!needle) return -1;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
554 off = strchr(haystack, needle);
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
555 if (!off) return -1;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
556
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
557 return off-haystack;
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
558 }
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
559
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
560 // Return how long the file at fd is, if there's any way to determine it.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
561 off_t fdlength(int fd)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
562 {
310
8b8116214b1c Roberto Foglietta pointed out that readall() needs fdlength() to restore
Rob Landley <rob@landley.net>
parents: 309
diff changeset
563 off_t bottom = 0, top = 0, pos, old;
75
89ca591a9236 More random progress on mke2fs. Nothing to see yet.
Rob Landley <rob@landley.net>
parents: 70
diff changeset
564 int size;
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
565
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
566 // If the ioctl works for this, return it.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
567
75
89ca591a9236 More random progress on mke2fs. Nothing to see yet.
Rob Landley <rob@landley.net>
parents: 70
diff changeset
568 if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512L;
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
569
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
570 // If not, do a binary search for the last location we can read. (Some
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
571 // block devices don't do BLKGETSIZE right.) This should probably have
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
572 // a CONFIG option...
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
573
310
8b8116214b1c Roberto Foglietta pointed out that readall() needs fdlength() to restore
Rob Landley <rob@landley.net>
parents: 309
diff changeset
574 old = lseek(fd, 0, SEEK_CUR);
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
575 do {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
576 char temp;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
577
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
578 pos = bottom + (top - bottom) / 2;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
579
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
580 // If we can read from the current location, it's bigger.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
581
77
8018c40605d9 The fdlength() ioctl apparently doesn't work on files (and the lseek trick
Rob Landley <rob@landley.net>
parents: 75
diff changeset
582 if (lseek(fd, pos, 0)>=0 && read(fd, &temp, 1)==1) {
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
583 if (bottom == top) bottom = top = (top+1) * 2;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
584 else bottom = pos;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
585
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
586 // If we can't, it's smaller.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
587
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
588 } else {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
589 if (bottom == top) {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
590 if (!top) return 0;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
591 bottom = top/2;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
592 } else top = pos;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
593 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
594 } while (bottom + 1 != top);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
595
310
8b8116214b1c Roberto Foglietta pointed out that readall() needs fdlength() to restore
Rob Landley <rob@landley.net>
parents: 309
diff changeset
596 lseek(fd, old, SEEK_SET);
8b8116214b1c Roberto Foglietta pointed out that readall() needs fdlength() to restore
Rob Landley <rob@landley.net>
parents: 309
diff changeset
597
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
598 return pos + 1;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
599 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
600
115
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
601 // This can return null (meaning file not found). It just won't return null
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
602 // for memory allocation reasons.
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
603 char *xreadlink(char *name)
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
604 {
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
605 int len, size = 0;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
606 char *buf = 0;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
607
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
608 // Grow by 64 byte chunks until it's big enough.
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
609 for(;;) {
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
610 size +=64;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
611 buf = xrealloc(buf, size);
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
612 len = readlink(name, buf, size);
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
613
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
614 if (len<0) {
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
615 free(buf);
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
616 return 0;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
617 }
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
618 if (len<size) {
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
619 buf[len]=0;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
620 return buf;
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
621 }
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
622 }
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
623 }
19b5567f0a1b Add readlink, xreadlink(), and change xrealloc() to not fight the stupid
Rob Landley <rob@landley.net>
parents: 102
diff changeset
624
77
8018c40605d9 The fdlength() ioctl apparently doesn't work on files (and the lseek trick
Rob Landley <rob@landley.net>
parents: 75
diff changeset
625 /*
8018c40605d9 The fdlength() ioctl apparently doesn't work on files (and the lseek trick
Rob Landley <rob@landley.net>
parents: 75
diff changeset
626 This might be of use or might not. Unknown yet...
8018c40605d9 The fdlength() ioctl apparently doesn't work on files (and the lseek trick
Rob Landley <rob@landley.net>
parents: 75
diff changeset
627
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
628 // Read contents of file as a single freshly allocated nul-terminated string.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
629 char *readfile(char *name)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
630 {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
631 off_t len;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
632 int fd;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
633 char *buf;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
634
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
635 fd = open(name, O_RDONLY);
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
636 if (fd == -1) return 0;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
637 len = fdlength(fd);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
638 buf = xmalloc(len+1);
379
74526fc22c25 xreadall() returns void... how does that even compile?
Rob Landley <rob@landley.net>
parents: 370
diff changeset
639 buf[readall(fd, buf, len)] = 0;
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
640
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
641 return buf;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
642 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
643
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
644 char *xreadfile(char *name)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
645 {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
646 char *buf = readfile(name);
70
a1b464bbef08 Add "echo". Has -n and -e (but not \0123 yet).
Rob Landley <rob@landley.net>
parents: 63
diff changeset
647 if (!buf) perror_exit("xreadfile %s", name);
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
648 return buf;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
649 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
650
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
651 */
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
652
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
653 // Open a /var/run/NAME.pid file, dying if we can't write it or if it currently
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
654 // exists and is this executable.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
655 void xpidfile(char *name)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
656 {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
657 char pidfile[256], spid[32];
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
658 int i, fd;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
659 pid_t pid;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
660
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
661 sprintf(pidfile, "/var/run/%s.pid", name);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
662 // Try three times to open the sucker.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
663 for (i=0; i<3; i++) {
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
664 fd = open(pidfile, O_CREAT|O_EXCL, 0644);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
665 if (fd != -1) break;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
666
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
667 // If it already existed, read it. Loop for race condition.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
668 fd = open(pidfile, O_RDONLY);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
669 if (fd == -1) continue;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
670
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
671 // Is the old program still there?
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
672 spid[xread(fd, spid, sizeof(spid)-1)] = 0;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
673 close(fd);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
674 pid = atoi(spid);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
675 if (fd < 1 || kill(pid, 0) == ESRCH) unlink(pidfile);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
676
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
677 // An else with more sanity checking might be nice here.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
678 }
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 153
diff changeset
679
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
680 if (i == 3) error_exit("xpidfile %s", name);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
681
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
682 xwrite(fd, spid, sprintf(spid, "%ld\n", (long)getpid()));
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
683 close(fd);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
684 }
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
685
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
686 // Iterate through an array of files, opening each one and calling a function
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
687 // on that filehandle and name. The special filename "-" means stdin if
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
688 // flags is O_RDONLY, stdout otherwise. An empty argument list calls
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
689 // function() on just stdin/stdout.
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
690 //
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
691 // Note: read only filehandles are automatically closed when function()
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
692 // returns, but writeable filehandles must be close by function()
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
693 void loopfiles_rw(char **argv, int flags, int permissions, int failok,
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
694 void (*function)(int fd, char *name))
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
695 {
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
696 int fd;
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
697
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
698 // If no arguments, read from stdin.
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
699 if (!*argv) function(flags ? 1 : 0, "-");
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
700 else do {
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
701 // Filename "-" means read from stdin.
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
702 // Inability to open a file prints a warning, but doesn't exit.
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
703
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
704 if (!strcmp(*argv,"-")) fd=0;
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
705 else if (0>(fd = open(*argv, flags, permissions)) && !failok) {
252
8d751063a563 Add spaces after some commas (from Charlie Shepherd).
Rob Landley <rob@landley.net>
parents: 251
diff changeset
706 perror_msg("%s", *argv);
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
707 toys.exitval = 1;
220
104792581cc9 Fix loopfiles to not call function() on file not found.
Rob Landley <rob@landley.net>
parents: 216
diff changeset
708 continue;
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
709 }
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
710 function(fd, *argv);
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
711 if (flags == O_RDONLY) close(fd);
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
712 } while (*++argv);
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
713 }
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
714
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
715 // Call loopfiles_rw with O_RDONLY and !failok (common case).
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
716 void loopfiles(char **argv, void (*function)(int fd, char *name))
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
717 {
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
718 loopfiles_rw(argv, O_RDONLY, 0, 0, function);
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
719 }
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
720
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
721 // Slow, but small.
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
722
284
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
723 char *get_rawline(int fd, long *plen, char end)
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
724 {
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
725 char c, *buf = NULL;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
726 long len = 0;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
727
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
728 for (;;) {
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
729 if (1>read(fd, &c, 1)) break;
354
3c9f47f4fd33 Fix bug spotted by Jean-Christphe Dubois: reserve space for null terminator.
Rob Landley <rob@landley.net>
parents: 344
diff changeset
730 if (!(len & 63)) buf=xrealloc(buf, len+65);
284
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
731 if ((buf[len++]=c) == end) break;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
732 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
733 if (buf) buf[len]=0;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
734 if (plen) *plen = len;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
735
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
736 return buf;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
737 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
738
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
739 char *get_line(int fd)
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
740 {
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
741 long len;
284
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
742 char *buf = get_rawline(fd, &len, '\n');
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
743
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
744 if (buf && buf[--len]=='\n') buf[len]=0;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
745
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
746 return buf;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
747 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
748
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
749 // Copy the rest of in to out and close both files.
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
750
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
751 void xsendfile(int in, int out)
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
752 {
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
753 long len;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
754 char buf[4096];
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
755
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
756 if (in<0) return;
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
757 for (;;) {
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
758 len = xread(in, buf, 4096);
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
759 if (len<1) break;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
760 xwrite(out, buf, len);
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
761 }
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
762 }
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
763
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
764 int wfchmodat(int fd, char *name, mode_t mode)
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
765 {
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
766 int rc = fchmodat(fd, name, mode, 0);
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
767
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
768 if (rc) {
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
769 perror_msg("chmod '%s' to %04o", name, mode);
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
770 toys.exitval=1;
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
771 }
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
772 return rc;
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
773 }
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
774
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
775 static char *tempfile2zap;
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
776 static void tempfile_handler(int i)
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
777 {
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
778 if (1 < (long)tempfile2zap) unlink(tempfile2zap);
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
779 _exit(1);
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
780 }
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
781
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
782 // Open a temporary file to copy an existing file into.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
783 int copy_tempfile(int fdin, char *name, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
784 {
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
785 struct stat statbuf;
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
786 int fd;
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
787
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
788 *tempname = xstrndup(name, strlen(name)+6);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
789 strcat(*tempname,"XXXXXX");
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
790 if(-1 == (fd = mkstemp(*tempname))) error_exit("no temp file");
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
791 if (!tempfile2zap) sigatexit(tempfile_handler);
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
792 tempfile2zap = *tempname;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
793
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
794 // Set permissions of output file
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
795
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
796 fstat(fdin, &statbuf);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
797 fchmod(fd, statbuf.st_mode);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
798
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
799 return fd;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
800 }
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
801
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
802 // Abort the copy and delete the temporary file.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
803 void delete_tempfile(int fdin, int fdout, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
804 {
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
805 close(fdin);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
806 close(fdout);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
807 unlink(*tempname);
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
808 tempfile2zap = (char *)1;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
809 free(*tempname);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
810 *tempname = NULL;
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
811 }
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
812
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
813 // Copy the rest of the data and replace the original with the copy.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
814 void replace_tempfile(int fdin, int fdout, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
815 {
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
816 char *temp = xstrdup(*tempname);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
817
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
818 temp[strlen(temp)-6]=0;
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
819 if (fdin != -1) {
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
820 xsendfile(fdin, fdout);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
821 xclose(fdin);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
822 }
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
823 xclose(fdout);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
824 rename(*tempname, temp);
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
825 tempfile2zap = (char *)1;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
826 free(*tempname);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
827 free(temp);
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
828 *tempname = NULL;
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
829 }
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
830
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
831 // Create a 256 entry CRC32 lookup table.
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
832
337
aaafa1ceaa91 Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents: 334
diff changeset
833 void crc_init(unsigned int *crc_table, int little_endian)
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
834 {
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
835 unsigned int i;
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
836
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
837 // Init the CRC32 table (big endian)
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
838 for (i=0; i<256; i++) {
337
aaafa1ceaa91 Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents: 334
diff changeset
839 unsigned int j, c = little_endian ? i : i<<24;
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
840 for (j=8; j; j--)
337
aaafa1ceaa91 Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents: 334
diff changeset
841 if (little_endian) c = (c&1) ? (c>>1)^0xEDB88320 : c>>1;
aaafa1ceaa91 Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents: 334
diff changeset
842 else c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1);
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
843 crc_table[i] = c;
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
844 }
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
845 }
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
846
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
847 // Quick and dirty query size of terminal, doesn't do ANSI probe fallback.
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
848 // set *x=0 and *y=0 before calling to detect failure to set either, or
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
849 // x=80 y=25 to provide defaults
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
850
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
851 void terminal_size(unsigned *x, unsigned *y)
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
852 {
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
853 struct winsize ws;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
854 int i;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
855
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
856 //memset(&ws, 0, sizeof(ws));
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
857 for (i=0; i<3; i++) {
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
858 if (ioctl(i, TIOCGWINSZ, &ws)) continue;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
859 if (x) *x = ws.ws_col;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
860 if (y) *y = ws.ws_row;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
861 }
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
862 if (x) {
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
863 char *s = getenv("COLUMNS");
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
864
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
865 i = s ? atoi(s) : 0;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
866 if (i>0) *x = i;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
867 }
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
868 if (y) {
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
869 char *s = getenv("ROWS");
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
870
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
871 i = s ? atoi(s) : 0;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
872 if (i>0) *y = i;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
873 }
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
874 }
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
875
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
876 // This should use a raw tty, fixit later.
503
3b9dea897dc0 Upgrade yesno() and make cp -i use it.
Rob Landley <rob@landley.net>
parents: 498
diff changeset
877 int yesno(char *prompt, int def)
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
878 {
554
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
879 FILE *fps[] = {stdin, stdout, stderr};
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
880 int i;
503
3b9dea897dc0 Upgrade yesno() and make cp -i use it.
Rob Landley <rob@landley.net>
parents: 498
diff changeset
881 char buf;
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
882
554
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
883 for (i=0; i<3; i++) if (isatty(i)) break;
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
884 if (i == 3) return 1;
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
885
554
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
886 fprintf(fps[i], "%s (%c/%c):", prompt, def ? 'Y' : 'y', def ? 'n' : 'N');
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
887 fflush(fps[i]);
997e016fbdf0 Using /dev/tty for yesno() is wrong because yes 'n' | cp -ial needs to work.
Rob Landley <rob@landley.net>
parents: 553
diff changeset
888 while (fread(&buf, 1, 1, fps[i])) {
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
889 if (tolower(buf) == 'y') def = 1;
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
890 if (tolower(buf) == 'n') def = 0;
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
891 else if (!isspace(buf)) continue;
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
892
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
893 break;
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
894 }
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
895
419
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
896 return def;
af0cca0aba9d Quick and dirty terminal_size() and yesno() functions, both of which need to be improved.
Rob Landley <rob@landley.net>
parents: 399
diff changeset
897 }
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
898
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
899 // Execute a callback for each PID that matches a process name from a list.
477
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
900 void for_each_pid_with_name_in(char **names, void (*callback)(pid_t pid))
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
901 {
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
902 DIR *dp;
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
903 struct dirent *entry;
604
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
904 char cmd[sizeof(toybuf)], path[64];
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
905 char **curname;
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
906
477
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
907 if (!(dp = opendir("/proc"))) perror_exit("opendir");
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
908
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
909 while ((entry = readdir(dp))) {
604
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
910 int fd, n;
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
911
477
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
912 if (!isdigit(*entry->d_name)) continue;
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
913
477
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
914 if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline",
f0b07ce5f125 Cleanups to pidof (including some global infrastructure shared with killall).
Rob Landley <rob@landley.net>
parents: 475
diff changeset
915 entry->d_name)) continue;
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
916
604
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
917 if (-1 == (fd=open(path, O_RDONLY))) continue;
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
918 n = read(fd, cmd, sizeof(cmd));
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
919 close(fd);
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
920 if (n<1) continue;
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
921
604
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
922 for (curname = names; *curname; curname++)
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
923 if (!strcmp(basename(cmd), *curname))
90d6026c36c3 Minor code refactoring.
Rob Landley <rob@landley.net>
parents: 592
diff changeset
924 callback(atol(entry->d_name));
475
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
925 }
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
926
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
927 closedir(dp);
1fb149e75ebf Add killall by Andreas Heck, and factor out common pid code to lib.h.
Rob Landley <rob@landley.net>
parents: 443
diff changeset
928 }
498
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
929
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
930 struct signame {
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
931 int num;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
932 char *name;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
933 };
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
934
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
935 // Signals required by POSIX 2008:
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
936 // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
937
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
938 #define SIGNIFY(x) {SIG##x, #x}
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
939
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
940 static struct signame signames[] = {
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
941 SIGNIFY(ABRT), SIGNIFY(ALRM), SIGNIFY(BUS),
498
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
942 SIGNIFY(FPE), SIGNIFY(HUP), SIGNIFY(ILL), SIGNIFY(INT), SIGNIFY(KILL),
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
943 SIGNIFY(PIPE), SIGNIFY(QUIT), SIGNIFY(SEGV), SIGNIFY(TERM),
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
944 SIGNIFY(USR1), SIGNIFY(USR2), SIGNIFY(SYS), SIGNIFY(TRAP),
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
945 SIGNIFY(VTALRM), SIGNIFY(XCPU), SIGNIFY(XFSZ),
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
946
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
947 // Start of non-terminal signals
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
948
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
949 SIGNIFY(CHLD), SIGNIFY(CONT), SIGNIFY(STOP), SIGNIFY(TSTP),
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
950 SIGNIFY(TTIN), SIGNIFY(TTOU), SIGNIFY(URG)
498
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
951 };
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
952
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
953 // not in posix: SIGNIFY(STKFLT), SIGNIFY(WINCH), SIGNIFY(IO), SIGNIFY(PWR)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
954 // obsolete: SIGNIFY(PROF) SIGNIFY(POLL)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
955
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
956 // Install the same handler on every signal that defaults to killing the process
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
957 void sigatexit(void *handler)
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
958 {
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
959 int i;
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
960 for (i=0; signames[i].num != SIGCHLD; i++)
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
961 signal(signames[i].num, handler);
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
962 }
498
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
963 // Convert name to signal number. If name == NULL print names.
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
964 int sig_to_num(char *pidstr)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
965 {
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
966 int i;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
967
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
968 if (pidstr) {
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
969 char *s;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
970 i = strtol(pidstr, &s, 10);
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
971 if (!*s) return i;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
972
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
973 if (!strncasecmp(pidstr, "sig", 3)) pidstr+=3;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
974 }
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
975 for (i = 0; i < sizeof(signames)/sizeof(struct signame); i++)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
976 if (!pidstr) xputs(signames[i].name);
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
977 else if (!strcasecmp(pidstr, signames[i].name))
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
978 return signames[i].num;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
979
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
980 return -1;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
981 }
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
982
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
983 char *num_to_sig(int sig)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
984 {
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
985 int i;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
986
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
987 for (i=0; i<sizeof(signames)/sizeof(struct signame); i++)
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
988 if (signames[i].num == sig) return signames[i].name;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
989 return NULL;
c9aaceccd6bd Factor out common code between killall/kill and move it to lib/lib.c, plus cleanups on kill.c.
Rob Landley <rob@landley.net>
parents: 480
diff changeset
990 }
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
991
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
992 // premute mode bits based on posix mode strings.
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
993 mode_t string_to_mode(char *modestr, mode_t mode)
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
994 {
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
995 char *whos = "ogua", *hows = "=+-", *whats = "xwrstX", *whys = "ogu";
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
996 char *s, *str = modestr;
553
75da5d793fc8 Unwind gratuitous macros.
Rob Landley <rob@landley.net>
parents: 551
diff changeset
997
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
998 // Handle octal mode
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
999 if (isdigit(*str)) {
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1000 mode = strtol(str, &s, 8);
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1001 if (*s || (mode & ~(07777))) goto barf;
553
75da5d793fc8 Unwind gratuitous macros.
Rob Landley <rob@landley.net>
parents: 551
diff changeset
1002
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1003 return mode;
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
1004 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1005
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1006 // Gaze into the bin of permission...
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1007 for (;;) {
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1008 int i, j, dowho, dohow, dowhat, amask;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1009
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1010 dowho = dohow = dowhat = amask = 0;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1011
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1012 // Find the who, how, and what stanzas, in that order
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1013 while (*str && (s = strchr(whos, *str))) {
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1014 dowho |= 1<<(s-whos);
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1015 str++;
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1016 }
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1017 // If who isn't specified, like "a" but honoring umask.
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1018 if (!dowho) {
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1019 dowho = 8;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1020 umask(amask=umask(0));
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1021 }
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1022 if (!*str || !(s = strchr(hows, *str))) goto barf;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1023 dohow = *(str++);
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1024
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1025 if (!dohow) goto barf;
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1026 while (*str && (s = strchr(whats, *str))) {
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1027 dowhat |= 1<<(s-whats);
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1028 str++;
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1029 }
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1030
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1031 // Convert X to x for directory or if already executable somewhere
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1032 if ((dowhat&32) && (S_ISDIR(mode) || (mode&0111))) dowhat |= 1;
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1033
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1034 // Copy mode from another category?
590
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1035 if (!dowhat && *str && (s = strchr(whys, *str))) {
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
1036 dowhat = (mode>>(3*(s-whys)))&7;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1037 str++;
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
1038 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1039
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1040 // Are we ready to do a thing yet?
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1041 if (*str && *(str++) != ',') goto barf;
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1042
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1043 // Ok, apply the bits to the mode.
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1044 for (i=0; i<4; i++) {
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1045 for (j=0; j<3; j++) {
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1046 mode_t bit = 0;
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1047 int where = 1<<((3*i)+j);
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1048
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1049 if (amask & where) continue;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1050
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1051 // Figure out new value at this location
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1052 if (i == 3) {
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1053 // suid/sticky bit.
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1054 if (j) {
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1055 if ((dowhat & 8) && (dowho&(8|(1<<i)))) bit++;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1056 } else if (dowhat & 16) bit++;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1057 } else {
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1058 if (!(dowho&(8|(1<<i)))) continue;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1059 if (dowhat&(1<<j)) bit++;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1060 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1061
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1062 // When selection active, modify bit
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1063
638
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1064 if (dohow == '=' || (bit && dohow == '-'))
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1065 mode &= ~where;
92200901cfe1 Make chmod +w respect umask, implement +s and +t, fix ls to show suid/sgid/stid without x bit.
Rob Landley <rob@landley.net>
parents: 623
diff changeset
1066 if (bit && dohow != '-') mode |= where;
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1067 }
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1068 }
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1069
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1070 if (!*str) break;
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
1071 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1072 return mode;
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1073 barf:
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
1074 error_exit("bad mode '%s'", modestr);
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
1075 }
658
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1076
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1077
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1078 char* make_human_readable(unsigned long long size, unsigned long unit)
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1079 {
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1080 unsigned int frac = 0;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1081 if(unit) {
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1082 size = (size/(unit)) + (size%(unit)?1:0);
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1083 return xmsprintf("%llu", size);
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1084 }
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1085 else {
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1086 static char units[] = {'\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'};
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1087 int index = 0;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1088 while(size >= 1024) {
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1089 frac = size%1024;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1090 size /= 1024;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1091 index++;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1092 }
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1093 frac = (frac/102) + ((frac%102)?1:0);
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1094 if(frac >= 10) {
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1095 size += 1;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1096 frac = 0;
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1097 }
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1098 if(frac) return xmsprintf("%llu.%u%c", size, frac, units[index]);
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1099 else return xmsprintf("%llu%c", size, units[index]);
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1100 }
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1101 return NULL; //not reached
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
1102 }