Mercurial > hg > toybox
annotate lib/lib.c @ 1226:e1b09affb6db draft
Fix mkdir -p with absolute paths.
Stripping leading / is not the right thing to do there.
Broken when the code moved to lib and was genericized for use elsewhere.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 24 Mar 2014 06:26:49 -0500 |
parents | 468444e5c7c5 |
children | 79e847fec774 |
rev | line source |
---|---|
951
62d59b8aea34
Split lib/xwrap.c from lib/lib.c
Rob Landley <rob@landley.net>
parents:
949
diff
changeset
|
1 /* lib.c - various reusable stuff. |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
2 * |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
3 * 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
|
4 */ |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
5 |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
6 #include "toys.h" |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
7 |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
8 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
|
9 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
10 char *s = ": %s"; |
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
|
11 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
12 fprintf(stderr, "%s: ", toys.which->name); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
13 if (msg) vfprintf(stderr, msg, va); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
14 else s+=2; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
15 if (err) fprintf(stderr, s, strerror(err)); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
16 putc('\n', stderr); |
780
6cc69be43c42
Have error_msg() and friends set TT.exitval to 1 if it's still 0, clean out other places that were setting it that no longer need to.
Rob Landley <rob@landley.net>
parents:
762
diff
changeset
|
17 if (!toys.exitval) toys.exitval++; |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
18 } |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
19 |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
20 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
|
21 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
22 va_list va; |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
23 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
24 va_start(va, msg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
25 verror_msg(msg, 0, va); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
26 va_end(va); |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
27 } |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
28 |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
29 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
|
30 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
31 va_list va; |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
32 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
33 va_start(va, msg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
34 verror_msg(msg, errno, va); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
35 va_end(va); |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
36 } |
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
37 |
2
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
38 // Die with an error message. |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
39 void error_exit(char *msg, ...) |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
40 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
41 va_list va; |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
42 |
858
34ac05521d94
Move guts of help command into show_help() in lib/help.c, with config TOYBOX_HELP controlling infrastructure.
Rob Landley <rob@landley.net>
parents:
798
diff
changeset
|
43 if (CFG_TOYBOX_HELP && toys.exithelp) show_help(); |
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
|
44 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
45 va_start(va, msg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
46 verror_msg(msg, 0, va); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
47 va_end(va); |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
48 |
925
07693eb46e26
Add xexit() and make error_exit() use it.
Rob Landley <rob@landley.net>
parents:
916
diff
changeset
|
49 xexit(); |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
50 } |
2
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
51 |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
52 // 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
|
53 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
|
54 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
55 va_list va; |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
56 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
57 va_start(va, msg); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
58 verror_msg(msg, errno, va); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
59 va_end(va); |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
60 |
925
07693eb46e26
Add xexit() and make error_exit() use it.
Rob Landley <rob@landley.net>
parents:
916
diff
changeset
|
61 xexit(); |
2
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
62 } |
67b517913e56
Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents:
diff
changeset
|
63 |
63
69efffcacd70
Add fdprintf(). Remove reread() and rewrite() which handle -EINTR, which
Rob Landley <rob@landley.net>
parents:
53
diff
changeset
|
64 // 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
|
65 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
|
66 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
67 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
|
68 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
69 while (count<len) { |
1141
37cbbbe547a3
Doing math on void pointers isn't portable, reported by Nathan McSween.
Rob Landley <rob@landley.net>
parents:
1131
diff
changeset
|
70 int i = read(fd, (char *)buf+count, len-count); |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
71 if (!i) break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
72 if (i<0) return i; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
73 count += i; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
74 } |
8
04f66da2bdbf
Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents:
7
diff
changeset
|
75 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
76 return count; |
8
04f66da2bdbf
Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents:
7
diff
changeset
|
77 } |
04f66da2bdbf
Add reread(), readall(), and xread() on the bus ride in to work...
landley@driftwood
parents:
7
diff
changeset
|
78 |
50
63c168b65fa6
Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
79 // 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
|
80 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
|
81 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
82 size_t count = 0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
83 while (count<len) { |
1202
4f080cdb2f6e
Various cleanups found by Tom Sparrow's static analysis.
Rob Landley <rob@landley.net>
parents:
1145
diff
changeset
|
84 int i = write(fd, count+(char *)buf, len-count); |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
85 if (i<1) return i; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
86 count += i; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
87 } |
50
63c168b65fa6
Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
88 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
89 return count; |
50
63c168b65fa6
Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
90 } |
63c168b65fa6
Add rewrite(), writeall(),and xwrite() to match the read versions.
Rob Landley <rob@landley.net>
parents:
49
diff
changeset
|
91 |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
92 // skip this many bytes of input. Return 0 for success, >0 means this much |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
93 // left after input skipped. |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
94 off_t lskip(int fd, off_t offset) |
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
95 { |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
96 off_t cur = lseek(fd, 0, SEEK_CUR); |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
97 |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
98 if (cur != -1) { |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
99 off_t end = lseek(fd, 0, SEEK_END) - cur; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
100 |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
101 if (end > 0 && end < offset) return offset - end; |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
102 end = offset+cur; |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
103 if (end == lseek(fd, end, SEEK_SET)) return 0; |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
104 perror_exit("lseek"); |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
105 } |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
106 |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
107 while (offset>0) { |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
108 int try = offset>sizeof(libbuf) ? sizeof(libbuf) : offset, or; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
109 |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
110 or = readall(fd, libbuf, try); |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
111 if (or < 0) perror_exit("lskip to %lld", (long long)offset); |
1212
86745958cea9
Fix another bug reported by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
1202
diff
changeset
|
112 else offset -= or; |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
113 if (or < try) break; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
114 } |
1070
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
115 |
16167a7c1b5a
Fix -t c0 and -J as reported by heehooman at gmail on the list.
Rob Landley <rob@landley.net>
parents:
1043
diff
changeset
|
116 return offset; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
117 } |
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
118 |
1219
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
119 // flags: 1=make last dir (with mode lastmode, otherwise skips last component) |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
120 // 2=make path (already exists is ok) |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
121 // 4=verbose |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
122 // returns 0 = path ok, 1 = error |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
123 int mkpathat(int atfd, char *dir, mode_t lastmode, int flags) |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
124 { |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
125 struct stat buf; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
126 char *s; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
127 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
128 // mkdir -p one/two/three is not an error if the path already exists, |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
129 // but is if "three" is a file. The others we dereference and catch |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
130 // not-a-directory along the way, but the last one we must explicitly |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
131 // test for. Might as well do it up front. |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
132 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
133 if (!fstatat(atfd, dir, &buf, 0) && !S_ISDIR(buf.st_mode)) { |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
134 errno = EEXIST; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
135 return 1; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
136 } |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
137 |
1226
e1b09affb6db
Fix mkdir -p with absolute paths.
Rob Landley <rob@landley.net>
parents:
1219
diff
changeset
|
138 for (s = dir; ;s++) { |
1219
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
139 char save = 0; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
140 mode_t mode = (0777&~toys.old_umask)|0300; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
141 |
1226
e1b09affb6db
Fix mkdir -p with absolute paths.
Rob Landley <rob@landley.net>
parents:
1219
diff
changeset
|
142 // find next '/', but don't try to mkdir "" at start of absolute path |
e1b09affb6db
Fix mkdir -p with absolute paths.
Rob Landley <rob@landley.net>
parents:
1219
diff
changeset
|
143 if (*s == '/' && (flags&2) && s != dir) { |
1219
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
144 save = *s; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
145 *s = 0; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
146 } else if (*s) continue; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
147 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
148 // Use the mode from the -m option only for the last directory. |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
149 if (!save) { |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
150 if (flags&1) mode = lastmode; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
151 else break; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
152 } |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
153 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
154 if (mkdirat(atfd, dir, mode)) { |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
155 if (!(flags&2) || errno != EEXIST) return 1; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
156 } else if (flags&4) |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
157 fprintf(stderr, "%s: created directory '%s'\n", toys.which->name, dir); |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
158 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
159 if (!(*s = save)) break; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
160 } |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
161 |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
162 return 0; |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
163 } |
468444e5c7c5
Move mkpathat to lib, remove redundant function used by patch.
Rob Landley <rob@landley.net>
parents:
1218
diff
changeset
|
164 |
708
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
165 // Split a path into linked list of components, tracking head and tail of list. |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
166 // Filters out // entries with no contents. |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
167 struct string_list **splitpath(char *path, struct string_list **list) |
4
732b055e17f7
Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents:
3
diff
changeset
|
168 { |
708
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
169 char *new = path; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
170 |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
171 *list = 0; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
172 do { |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
173 int len; |
16
dd10785b6532
Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents:
8
diff
changeset
|
174 |
708
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
175 if (*path && *path != '/') continue; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
176 len = path-new; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
177 if (len > 0) { |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
178 *list = xmalloc(sizeof(struct string_list) + len + 1); |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
179 (*list)->next = 0; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
180 strncpy((*list)->str, new, len); |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
181 (*list)->str[len] = 0; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
182 list = &(*list)->next; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
183 } |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
184 new = path+1; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
185 } while (*path++); |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
186 |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
187 return list; |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
188 } |
50d759f8b371
Remove readlink -m for being poorly defined ("readlink -m /dev/null/and/more" answers what question, exactly?), rewrite xabspath() to work right and not depend on realpath, fix subtle longstanding bug in llist_traverse().
Rob Landley <rob@landley.net>
parents:
707
diff
changeset
|
189 |
20
3981c96f9285
Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
190 // 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
|
191 // 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
|
192 // order. |
16
dd10785b6532
Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents:
8
diff
changeset
|
193 |
20
3981c96f9285
Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents:
16
diff
changeset
|
194 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
|
195 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
196 struct string_list *rlist = NULL, **prlist=&rlist; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
197 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
|
198 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
199 for (;;) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
200 char *next = path ? strchr(path, ':') : NULL; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
201 int len = next ? next-path : strlen(path); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
202 struct string_list *rnext; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
203 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
|
204 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
205 rnext = xmalloc(sizeof(void *) + strlen(filename) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
206 + (len ? len : strlen(cwd)) + 2); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
207 if (!len) sprintf(rnext->str, "%s/%s", cwd, filename); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
208 else { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
209 char *res = rnext->str; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
210 strncpy(res, path, len); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
211 res += len; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
212 *(res++) = '/'; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
213 strcpy(res, filename); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
214 } |
16
dd10785b6532
Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents:
8
diff
changeset
|
215 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
216 // Confirm it's not a directory. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
217 if (!stat(rnext->str, &st) && S_ISREG(st.st_mode)) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
218 *prlist = rnext; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
219 rnext->next = NULL; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
220 prlist = &(rnext->next); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
221 } 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
|
222 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
223 if (!next) break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
224 path += len; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
225 path++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
226 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
227 free(cwd); |
4
732b055e17f7
Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents:
3
diff
changeset
|
228 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
229 return rlist; |
4
732b055e17f7
Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents:
3
diff
changeset
|
230 } |
7
fc9c0503d5e2
Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents:
4
diff
changeset
|
231 |
102
aa4fa2543a65
Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents:
97
diff
changeset
|
232 // 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
|
233 // (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
|
234 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
|
235 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
236 char *c, *suffixes="bkmgtpe", *end; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
237 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
|
238 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
239 if (*c) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
240 if (c != numstr && (end = strchr(suffixes, tolower(*c)))) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
241 int shift = end-suffixes; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
242 if (shift--) val *= 1024L<<(shift*10); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
243 } else { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
244 while (isspace(*c)) c++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
245 if (*c) error_exit("not integer: %s", numstr); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
246 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
247 } |
397
b7afbc6b753a
Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents:
379
diff
changeset
|
248 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
249 return val; |
102
aa4fa2543a65
Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents:
97
diff
changeset
|
250 } |
aa4fa2543a65
Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents:
97
diff
changeset
|
251 |
1131
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
252 long atolx_range(char *numstr, long low, long high) |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
253 { |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
254 long val = atolx(numstr); |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
255 |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
256 if (val < low) error_exit("%ld < %ld", val, low); |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
257 if (val > high) error_exit("%ld > %ld", val, high); |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
258 |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
259 return val; |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
260 } |
f9678ea553c8
Oops, cleaned up ifconfig uses atolx_range() instead of get_int_list(). Check that in.
Rob Landley <rob@landley.net>
parents:
1108
diff
changeset
|
261 |
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
|
262 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
|
263 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
264 int len = 0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
265 while (l) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
266 l /= 10; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
267 len++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
268 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
269 return len; |
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
|
270 } |
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
|
271 |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
272 int stridx(char *haystack, char needle) |
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
273 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
274 char *off; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
275 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
276 if (!needle) return -1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
277 off = strchr(haystack, needle); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
278 if (!off) return -1; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
279 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
280 return off-haystack; |
623
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
281 } |
f51beec92738
New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents:
615
diff
changeset
|
282 |
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
|
283 // 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
|
284 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
|
285 { |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
286 struct stat st; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
287 off_t base = 0, range = 1, expand = 1, old; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
288 |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
289 if (!fstat(fd, &st) && S_ISREG(st.st_mode)) return st.st_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
|
290 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
291 // If the ioctl works for this, return it. |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
292 // TODO: is blocksize still always 512, or do we stat for it? |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
293 // unsigned int size; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
294 // 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
|
295 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
296 // If not, do a binary search for the last location we can read. (Some |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
297 // block devices don't do BLKGETSIZE right.) This should probably have |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
298 // a CONFIG option... |
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
|
299 |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
300 // If not, do a binary search for the last location we can read. |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
301 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
302 old = lseek(fd, 0, SEEK_CUR); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
303 do { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
304 char temp; |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
305 off_t pos = base + range / 2; |
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
|
306 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
307 if (lseek(fd, pos, 0)>=0 && read(fd, &temp, 1)==1) { |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
308 off_t delta = (pos + 1) - base; |
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
|
309 |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
310 base += delta; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
311 if (expand) range = (expand <<= 1) - base; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
312 else range -= delta; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
313 } else { |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
314 expand = 0; |
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
315 range = pos - base; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
316 } |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
317 } while (range > 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
|
318 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
319 lseek(fd, old, SEEK_SET); |
310
8b8116214b1c
Roberto Foglietta pointed out that readall() needs fdlength() to restore
Rob Landley <rob@landley.net>
parents:
309
diff
changeset
|
320 |
992
910f35ff76be
Achille Fouilleul pointed out that fdlength wasn't returning the right length in the binary search case.
Rob Landley <rob@landley.net>
parents:
951
diff
changeset
|
321 return base; |
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
|
322 } |
41d55b5d49fd
Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
52
diff
changeset
|
323 |
1043
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
324 // Read contents of file as a single nul-terminated string. |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
325 // malloc new one if buf=len=0 |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
326 char *readfile(char *name, char *buf, off_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
|
327 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
328 int fd; |
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
|
329 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
330 fd = open(name, O_RDONLY); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
331 if (fd == -1) return 0; |
1043
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
332 |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
333 if (len<1) { |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
334 len = fdlength(fd); |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
335 // proc files don't report a length, so try 1 page minimum. |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
336 if (len<4096) len = 4096; |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
337 } |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
338 if (!buf) buf = xmalloc(len+1); |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
339 |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
340 len = readall(fd, buf, len-1); |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
341 close(fd); |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
342 if (len<0) { |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
343 free(buf); |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
344 buf = 0; |
acf7bb2b99e2
Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents:
1042
diff
changeset
|
345 } else 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
|
346 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
347 return buf; |
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
|
348 } |
41d55b5d49fd
Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
52
diff
changeset
|
349 |
883
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
350 // Sleep for this many thousandths of a second |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
351 void msleep(long miliseconds) |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
352 { |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
353 struct timespec ts; |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
354 |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
355 ts.tv_sec = miliseconds/1000; |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
356 ts.tv_nsec = (miliseconds%1000)*1000000; |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
357 nanosleep(&ts, &ts); |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
358 } |
aca8323e2690
Add posix headers to toynet.h, move xioctl() to lib.c, introduce lib/net.c and move xsocket() to it.
Rob Landley <rob@landley.net>
parents:
870
diff
changeset
|
359 |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
360 int64_t peek(void *ptr, int size) |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
361 { |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
362 if (size & 8) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
363 volatile int64_t *p = (int64_t *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
364 return *p; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
365 } else if (size & 4) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
366 volatile int *p = (int *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
367 return *p; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
368 } else if (size & 2) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
369 volatile short *p = (short *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
370 return *p; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
371 } else { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
372 volatile char *p = (char *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
373 return *p; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
374 } |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
375 } |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
376 |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
377 void poke(void *ptr, uint64_t val, int size) |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
378 { |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
379 if (size & 8) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
380 volatile uint64_t *p = (uint64_t *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
381 *p = val; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
382 } else if (size & 4) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
383 volatile int *p = (int *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
384 *p = val; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
385 } else if (size & 2) { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
386 volatile short *p = (short *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
387 *p = val; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
388 } else { |
1218
fba5d8d3905c
Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents:
1212
diff
changeset
|
389 volatile char *p = (char *)ptr; |
913
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
390 *p = val; |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
391 } |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
392 } |
7fed25030389
Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents:
904
diff
changeset
|
393 |
308 | 394 // Iterate through an array of files, opening each one and calling a function |
395 // on that filehandle and name. The special filename "-" means stdin if | |
396 // flags is O_RDONLY, stdout otherwise. An empty argument list calls | |
397 // function() on just stdin/stdout. | |
398 // | |
399 // Note: read only filehandles are automatically closed when function() | |
400 // 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
|
401 void loopfiles_rw(char **argv, int flags, int permissions, int failok, |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
402 void (*function)(int fd, char *name)) |
185
29e2051296fd
Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents:
167
diff
changeset
|
403 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
404 int fd; |
185
29e2051296fd
Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents:
167
diff
changeset
|
405 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
406 // If no arguments, read from stdin. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
407 if (!*argv) function(flags ? 1 : 0, "-"); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
408 else do { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
409 // Filename "-" means read from stdin. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
410 // Inability to open a file prints a warning, but doesn't exit. |
185
29e2051296fd
Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents:
167
diff
changeset
|
411 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
412 if (!strcmp(*argv,"-")) fd=0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
413 else if (0>(fd = open(*argv, flags, permissions)) && !failok) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
414 perror_msg("%s", *argv); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
415 toys.exitval = 1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
416 continue; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
417 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
418 function(fd, *argv); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
419 if (flags == O_RDONLY) close(fd); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
420 } while (*++argv); |
185
29e2051296fd
Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents:
167
diff
changeset
|
421 } |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
422 |
397
b7afbc6b753a
Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents:
379
diff
changeset
|
423 // Call loopfiles_rw with O_RDONLY and !failok (common case). |
308 | 424 void loopfiles(char **argv, void (*function)(int fd, char *name)) |
425 { | |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
426 loopfiles_rw(argv, O_RDONLY, 0, 0, function); |
308 | 427 } |
428 | |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
429 // Slow, but small. |
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
430 |
284
603275a05524
Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents:
252
diff
changeset
|
431 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
|
432 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
433 char c, *buf = NULL; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
434 long len = 0; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
435 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
436 for (;;) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
437 if (1>read(fd, &c, 1)) break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
438 if (!(len & 63)) buf=xrealloc(buf, len+65); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
439 if ((buf[len++]=c) == end) break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
440 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
441 if (buf) buf[len]=0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
442 if (plen) *plen = len; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
443 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
444 return buf; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
445 } |
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
446 |
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
447 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
|
448 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
449 long len; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
450 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
|
451 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
452 if (buf && buf[--len]=='\n') buf[len]=0; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
453 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
454 return buf; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
455 } |
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
456 |
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
|
457 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
|
458 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
459 int rc = fchmodat(fd, name, mode, 0); |
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
|
460 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
461 if (rc) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
462 perror_msg("chmod '%s' to %04o", name, mode); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
463 toys.exitval=1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
464 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
465 return rc; |
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
|
466 } |
7becb497c3c4
Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents:
585
diff
changeset
|
467 |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
468 static char *tempfile2zap; |
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
469 static void tempfile_handler(int i) |
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
470 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
471 if (1 < (long)tempfile2zap) unlink(tempfile2zap); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
472 _exit(1); |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
473 } |
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
474 |
209 | 475 // Open a temporary file to copy an existing file into. |
476 int copy_tempfile(int fdin, char *name, char **tempname) | |
477 { | |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
478 struct stat statbuf; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
479 int fd; |
209 | 480 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
481 *tempname = xstrndup(name, strlen(name)+6); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
482 strcat(*tempname,"XXXXXX"); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
483 if(-1 == (fd = mkstemp(*tempname))) error_exit("no temp file"); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
484 if (!tempfile2zap) sigatexit(tempfile_handler); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
485 tempfile2zap = *tempname; |
209 | 486 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
487 // Set permissions of output file |
209 | 488 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
489 fstat(fdin, &statbuf); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
490 fchmod(fd, statbuf.st_mode); |
209 | 491 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
492 return fd; |
201
5d523752715a
Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents:
197
diff
changeset
|
493 } |
209 | 494 |
495 // Abort the copy and delete the temporary file. | |
496 void delete_tempfile(int fdin, int fdout, char **tempname) | |
497 { | |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
498 close(fdin); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
499 close(fdout); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
500 unlink(*tempname); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
501 tempfile2zap = (char *)1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
502 free(*tempname); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
503 *tempname = NULL; |
209 | 504 } |
505 | |
506 // Copy the rest of the data and replace the original with the copy. | |
507 void replace_tempfile(int fdin, int fdout, char **tempname) | |
508 { | |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
509 char *temp = xstrdup(*tempname); |
209 | 510 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
511 temp[strlen(temp)-6]=0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
512 if (fdin != -1) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
513 xsendfile(fdin, fdout); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
514 xclose(fdin); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
515 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
516 xclose(fdout); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
517 rename(*tempname, temp); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
518 tempfile2zap = (char *)1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
519 free(*tempname); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
520 free(temp); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
521 *tempname = NULL; |
209 | 522 } |
334
83c461db9df7
Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents:
311
diff
changeset
|
523 |
83c461db9df7
Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents:
311
diff
changeset
|
524 // 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
|
525 |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
334
diff
changeset
|
526 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
|
527 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
528 unsigned int i; |
334
83c461db9df7
Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents:
311
diff
changeset
|
529 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
530 // Init the CRC32 table (big endian) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
531 for (i=0; i<256; i++) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
532 unsigned int j, c = little_endian ? i : i<<24; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
533 for (j=8; j; j--) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
534 if (little_endian) c = (c&1) ? (c>>1)^0xEDB88320 : c>>1; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
535 else c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
536 crc_table[i] = c; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
537 } |
334
83c461db9df7
Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents:
311
diff
changeset
|
538 } |
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
|
539 |
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
|
540 // Quick and dirty query size of terminal, doesn't do ANSI probe fallback. |
1108
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
541 // set x=80 y=25 before calling to provide defaults. Returns 0 if couldn't |
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
542 // determine size. |
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
|
543 |
1108
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
544 int terminal_size(unsigned *xx, unsigned *yy) |
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
|
545 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
546 struct winsize ws; |
1108
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
547 unsigned i, x = 0, y = 0; |
1097 | 548 char *s; |
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
|
549 |
1108
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
550 // stdin, stdout, stderr |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
551 for (i=0; i<3; i++) { |
1097 | 552 memset(&ws, 0, sizeof(ws)); |
553 if (!ioctl(i, TIOCGWINSZ, &ws)) { | |
554 if (ws.ws_col) x = ws.ws_col; | |
555 if (ws.ws_row) y = ws.ws_row; | |
556 | |
557 break; | |
558 } | |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
559 } |
1097 | 560 s = getenv("COLUMNS"); |
561 if (s) sscanf(s, "%u", &x); | |
562 s = getenv("ROWS"); | |
563 if (s) sscanf(s, "%u", &y); | |
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
|
564 |
1108
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
565 // Never return 0 for either value, leave it at default instead. |
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
566 if (xx && x) *xx = x; |
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
567 if (yy && y) *yy = y; |
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
568 |
fb8467436e6a
Tweak terminal_size to never set either to 0, and return true/false whether it could determine at least one coordinate.
Rob Landley <rob@landley.net>
parents:
1097
diff
changeset
|
569 return x || y; |
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
|
570 } |
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
|
571 |
503
3b9dea897dc0
Upgrade yesno() and make cp -i use it.
Rob Landley <rob@landley.net>
parents:
498
diff
changeset
|
572 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
|
573 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
574 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
|
575 |
738
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
576 fprintf(stderr, "%s (%c/%c):", prompt, def ? 'Y' : 'y', def ? 'n' : 'N'); |
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
577 fflush(stderr); |
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
578 while (fread(&buf, 1, 1, stdin)) { |
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
579 int new; |
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
|
580 |
798
16bcabb8cf97
Fix -in behavior: descend into existing directory without prompting, show full path in error messages, actually overwrite when answering yes to -i.
Rob Landley <rob@landley.net>
parents:
791
diff
changeset
|
581 // The letter changes the value, the newline (or space) returns it. |
738
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
582 if (isspace(buf)) break; |
075eaff297f8
Make yesno() always read from stdin and write to stderr. (If we need to find our tty, open /dev/tty, but existing users don't.)
Rob Landley <rob@landley.net>
parents:
715
diff
changeset
|
583 if (-1 != (new = stridx("ny", tolower(buf)))) def = new; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
584 } |
550
b2194045c40e
Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents:
535
diff
changeset
|
585 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
586 return 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
|
587 } |
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
|
588 |
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
|
589 struct signame { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
590 int num; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
591 char *name; |
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
|
592 }; |
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
|
593 |
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
|
594 // 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
|
595 // 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
|
596 |
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
|
597 #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
|
598 |
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
|
599 static struct signame signames[] = { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
600 SIGNIFY(ABRT), SIGNIFY(ALRM), SIGNIFY(BUS), |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
601 SIGNIFY(FPE), SIGNIFY(HUP), SIGNIFY(ILL), SIGNIFY(INT), SIGNIFY(KILL), |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
602 SIGNIFY(PIPE), SIGNIFY(QUIT), SIGNIFY(SEGV), SIGNIFY(TERM), |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
603 SIGNIFY(USR1), SIGNIFY(USR2), SIGNIFY(SYS), SIGNIFY(TRAP), |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
604 SIGNIFY(VTALRM), SIGNIFY(XCPU), SIGNIFY(XFSZ), |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
605 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
606 // Start of non-terminal signals |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
607 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
608 SIGNIFY(CHLD), SIGNIFY(CONT), SIGNIFY(STOP), SIGNIFY(TSTP), |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
609 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
|
610 }; |
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
|
611 |
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
|
612 // 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
|
613 // 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
|
614 |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
615 // 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
|
616 void sigatexit(void *handler) |
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
617 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
618 int i; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
619 for (i=0; signames[i].num != SIGCHLD; i++) signal(signames[i].num, handler); |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
620 } |
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
|
621 // 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
|
622 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
|
623 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
624 int i; |
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
|
625 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
626 if (pidstr) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
627 char *s; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
628 i = strtol(pidstr, &s, 10); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
629 if (!*s) return i; |
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
|
630 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
631 if (!strncasecmp(pidstr, "sig", 3)) pidstr+=3; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
632 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
633 for (i = 0; i < sizeof(signames)/sizeof(struct signame); i++) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
634 if (!pidstr) xputs(signames[i].name); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
635 else if (!strcasecmp(pidstr, signames[i].name)) return signames[i].num; |
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
|
636 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
637 return -1; |
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
|
638 } |
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
|
639 |
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
|
640 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
|
641 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
642 int i; |
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
|
643 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
644 for (i=0; i<sizeof(signames)/sizeof(struct signame); i++) |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
645 if (signames[i].num == sig) return signames[i].name; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
646 return NULL; |
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
|
647 } |
551
2548e6e590b2
Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents:
550
diff
changeset
|
648 |
643
7bdebd2af1d6
Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents:
640
diff
changeset
|
649 // 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
|
650 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
|
651 { |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
652 char *whos = "ogua", *hows = "=+-", *whats = "xwrstX", *whys = "ogu"; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
653 char *s, *str = modestr; |
553 | 654 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
655 // Handle octal mode |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
656 if (isdigit(*str)) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
657 mode = strtol(str, &s, 8); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
658 if (*s || (mode & ~(07777))) goto barf; |
553 | 659 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
660 return mode; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
661 } |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
662 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
663 // Gaze into the bin of permission... |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
664 for (;;) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
665 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
|
666 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
667 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
|
668 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
669 // Find the who, how, and what stanzas, in that order |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
670 while (*str && (s = strchr(whos, *str))) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
671 dowho |= 1<<(s-whos); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
672 str++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
673 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
674 // If who isn't specified, like "a" but honoring umask. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
675 if (!dowho) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
676 dowho = 8; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
677 umask(amask=umask(0)); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
678 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
679 if (!*str || !(s = strchr(hows, *str))) goto barf; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
680 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
|
681 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
682 if (!dohow) goto barf; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
683 while (*str && (s = strchr(whats, *str))) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
684 dowhat |= 1<<(s-whats); |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
685 str++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
686 } |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
687 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
688 // Convert X to x for directory or if already executable somewhere |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
689 if ((dowhat&32) && (S_ISDIR(mode) || (mode&0111))) dowhat |= 1; |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
690 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
691 // Copy mode from another category? |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
692 if (!dowhat && *str && (s = strchr(whys, *str))) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
693 dowhat = (mode>>(3*(s-whys)))&7; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
694 str++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
695 } |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
696 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
697 // Are we ready to do a thing yet? |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
698 if (*str && *(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
|
699 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
700 // Ok, apply the bits to the mode. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
701 for (i=0; i<4; i++) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
702 for (j=0; j<3; j++) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
703 mode_t bit = 0; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
704 int where = 1<<((3*i)+j); |
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
|
705 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
706 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
|
707 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
708 // Figure out new value at this location |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
709 if (i == 3) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
710 // suid/sticky bit. |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
711 if (j) { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
712 if ((dowhat & 8) && (dowho&(8|(1<<i)))) bit++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
713 } else if (dowhat & 16) bit++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
714 } else { |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
715 if (!(dowho&(8|(1<<i)))) continue; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
716 if (dowhat&(1<<j)) bit++; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
717 } |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
718 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
719 // When selection active, modify bit |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
720 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
721 if (dohow == '=' || (bit && dohow == '-')) mode &= ~where; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
722 if (bit && dohow != '-') mode |= where; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
723 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
724 } |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
725 |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
726 if (!*str) break; |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
727 } |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
728 return mode; |
578
5cc8a8fc08b4
First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents:
565
diff
changeset
|
729 barf: |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
671
diff
changeset
|
730 error_exit("bad mode '%s'", modestr); |
551
2548e6e590b2
Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents:
550
diff
changeset
|
731 } |
658 | 732 |
916 | 733 // Format access mode into a drwxrwxrwx string |
734 void mode_to_string(mode_t mode, char *buf) | |
885
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
735 { |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
736 char c, d; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
737 int i, bit; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
738 |
916 | 739 buf[10]=0; |
885
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
740 for (i=0; i<9; i++) { |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
741 bit = mode & (1<<i); |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
742 c = i%3; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
743 if (!c && (mode & (1<<((d=i/3)+9)))) { |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
744 c = "tss"[d]; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
745 if (!bit) c &= ~0x20; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
746 } else c = bit ? "xwr"[c] : '-'; |
916 | 747 buf[9-i] = c; |
885
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
748 } |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
749 |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
750 if (S_ISDIR(mode)) c = 'd'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
751 else if (S_ISBLK(mode)) c = 'b'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
752 else if (S_ISCHR(mode)) c = 'c'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
753 else if (S_ISLNK(mode)) c = 'l'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
754 else if (S_ISFIFO(mode)) c = 'p'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
755 else if (S_ISSOCK(mode)) c = 's'; |
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
756 else c = '-'; |
916 | 757 *buf = c; |
885
beb32d780164
Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents:
883
diff
changeset
|
758 } |
1145
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
759 |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
760 // Execute a callback for each PID that matches a process name from a list. |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
761 void names_to_pid(char **names, int (*callback)(pid_t pid, char *name)) |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
762 { |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
763 DIR *dp; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
764 struct dirent *entry; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
765 |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
766 if (!(dp = opendir("/proc"))) perror_exit("opendir"); |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
767 |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
768 while ((entry = readdir(dp))) { |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
769 unsigned u; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
770 char *cmd, **curname; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
771 |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
772 if (!(u = atoi(entry->d_name))) continue; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
773 sprintf(libbuf, "/proc/%u/cmdline", u); |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
774 if (!(cmd = readfile(libbuf, libbuf, sizeof(libbuf)))) continue; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
775 |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
776 for (curname = names; *curname; curname++) |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
777 if (**curname == '/' ? !strcmp(cmd, *curname) |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
778 : !strcmp(basename(cmd), basename(*curname))) |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
779 if (callback(u, *curname)) break; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
780 if (*curname) break; |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
781 } |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
782 closedir(dp); |
80c9df5145fe
Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents:
1141
diff
changeset
|
783 } |