Mercurial > hg > toybox
annotate lib/lib.c @ 643:7bdebd2af1d6
Add signal handler to clean up tempfile.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 30 Jul 2012 01:01:33 -0500 |
parents | 85fc06bd63c4 |
children | 2b957eaa00c7 |
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 | 181 void xaccess(char *path, int flags) |
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 | 184 } |
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 | 279 // Die if lseek fails, probably due to being called on a pipe. |
280 | |
281 off_t xlseek(int fd, off_t offset, int whence) | |
282 { | |
283 offset = lseek(fd, offset, whence); | |
284 if (offset<0) perror_exit("lseek"); | |
285 | |
286 return offset; | |
287 } | |
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 | 324 // the same as realpath(), where "dir/.." could wind up somewhere else by |
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 | 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 | 411 |
412 // setuid() can fail (for example, too many processes belonging to that user), | |
413 // which opens a security hole if the process continues as the original user. | |
414 | |
415 void xsetuid(uid_t uid) | |
416 { | |
417 if (setuid(uid)) perror_exit("xsetuid"); | |
418 } | |
419 | |
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 | 686 // Iterate through an array of files, opening each one and calling a function |
687 // on that filehandle and name. The special filename "-" means stdin if | |
688 // flags is O_RDONLY, stdout otherwise. An empty argument list calls | |
689 // function() on just stdin/stdout. | |
690 // | |
691 // Note: read only filehandles are automatically closed when function() | |
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 | 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 | 716 void loopfiles(char **argv, void (*function)(int fd, char *name)) |
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 | 719 } |
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 | 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 | 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 | 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 | 762 } |
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 | 782 // Open a temporary file to copy an existing file into. |
783 int copy_tempfile(int fdin, char *name, char **tempname) | |
784 { | |
785 struct stat statbuf; | |
786 int fd; | |
787 | |
788 *tempname = xstrndup(name, strlen(name)+6); | |
789 strcat(*tempname,"XXXXXX"); | |
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 | 793 |
794 // Set permissions of output file | |
795 | |
796 fstat(fdin, &statbuf); | |
797 fchmod(fd, statbuf.st_mode); | |
798 | |
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 | 801 |
802 // Abort the copy and delete the temporary file. | |
803 void delete_tempfile(int fdin, int fdout, char **tempname) | |
804 { | |
805 close(fdin); | |
806 close(fdout); | |
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 | 809 free(*tempname); |
810 *tempname = NULL; | |
811 } | |
812 | |
813 // Copy the rest of the data and replace the original with the copy. | |
814 void replace_tempfile(int fdin, int fdout, char **tempname) | |
815 { | |
816 char *temp = xstrdup(*tempname); | |
817 | |
818 temp[strlen(temp)-6]=0; | |
819 if (fdin != -1) { | |
820 xsendfile(fdin, fdout); | |
821 xclose(fdin); | |
822 } | |
823 xclose(fdout); | |
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 | 826 free(*tempname); |
827 free(temp); | |
828 *tempname = NULL; | |
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 | 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 | 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 | 917 if (-1 == (fd=open(path, O_RDONLY))) continue; |
918 n = read(fd, cmd, sizeof(cmd)); | |
919 close(fd); | |
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 | 922 for (curname = names; *curname; curname++) |
923 if (!strcmp(basename(cmd), *curname)) | |
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 | 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 | 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 } |