annotate lib/lib.c @ 1218:fba5d8d3905c draft

Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
author Rob Landley <rob@landley.net>
date Tue, 11 Mar 2014 18:11:12 -0500
parents 86745958cea9
children 468444e5c7c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
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
119 // 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
120 // 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
121 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
122 {
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
123 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
124
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
125 *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
126 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
127 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
128
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
129 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
130 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
131 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
132 *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
133 (*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
134 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
135 (*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
136 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
137 }
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
138 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
139 } 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
140
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
141 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
142 }
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
143
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
144 // 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
145 // 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
146 // order.
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
147
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 16
diff changeset
148 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
149 {
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
150 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
151 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
152
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
153 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
154 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
155 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
156 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
157 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
158
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
159 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
160 + (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
161 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
162 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
163 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
164 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
165 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
166 *(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
167 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
168 }
16
dd10785b6532 Add xabspath(), is_file_type(), which_in_path(), and find_in_path().
Rob Landley <rob@landley.net>
parents: 8
diff changeset
169
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
170 // 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
171 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
172 *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
173 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
174 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
175 } 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
176
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
177 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
178 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
179 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
180 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 671
diff changeset
181 free(cwd);
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
182
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
183 return rlist;
4
732b055e17f7 Add xmsprintf(), xgetcwd(), xgetcwd(), find_in_path().
landley@driftwood
parents: 3
diff changeset
184 }
7
fc9c0503d5e2 Implement df. Add -Wall to build and fix up warnings. Add copyright notices.
landley@driftwood
parents: 4
diff changeset
185
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
186 // 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
187 // (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
188 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
189 {
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
190 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
191 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
192
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
193 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
194 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
195 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
196 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
197 } 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
198 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
199 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
200 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 }
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
202
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
203 return val;
102
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
204 }
aa4fa2543a65 Add atolx() which understands extensions for kilobytes and megabytes and such.
Rob Landley <rob@landley.net>
parents: 97
diff changeset
205
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
206 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
207 {
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
208 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
209
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
210 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
211 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
212
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
213 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
214 }
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
215
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
216 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
217 {
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
218 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
219 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
220 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
221 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
222 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 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
224 }
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
225
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
226 int stridx(char *haystack, char needle)
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
227 {
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
228 char *off;
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
229
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
230 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
231 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
232 if (!off) return -1;
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
233
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
234 return off-haystack;
623
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
235 }
f51beec92738 New infrastructure for od (oops).
Rob Landley <rob@landley.net>
parents: 615
diff changeset
236
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
237 // 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
238 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
239 {
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
240 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
241 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
242
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
243 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
244
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
245 // 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
246 // 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
247 // 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
248 // 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
249
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
250 // 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
251 // 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
252 // 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
253
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
254 // 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
255
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
256 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
257 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
258 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
259 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
260
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
261 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
262 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
263
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
264 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
265 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
266 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
267 } 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
268 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
269 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
270 }
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
271 } 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
272
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
273 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
274
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
275 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
276 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
277
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
278 // 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
279 // 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
280 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
281 {
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
282 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
283
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
284 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
285 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
286
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
287 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
288 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
289 // 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
290 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
291 }
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
292 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
293
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
294 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
295 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
296 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
297 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
298 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
299 } 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
300
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
301 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
302 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents: 52
diff changeset
303
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
304 // 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
305 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
306 {
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
307 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
308
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
309 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
310 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
311 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
312 }
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
313
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
314 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
315 {
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
316 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
317 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
318 return *p;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
319 } 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
320 volatile int *p = (int *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
321 return *p;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
322 } 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
323 volatile short *p = (short *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
324 return *p;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
325 } else {
1218
fba5d8d3905c Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents: 1212
diff changeset
326 volatile char *p = (char *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
327 return *p;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
328 }
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
329 }
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
330
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
331 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
332 {
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
333 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
334 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
335 *p = val;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
336 } 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
337 volatile int *p = (int *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
338 *p = val;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
339 } 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
340 volatile short *p = (short *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
341 *p = val;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
342 } else {
1218
fba5d8d3905c Add "volatile" annotation to peek/poke to stop potential optimizer overreach.
Rob Landley <rob@landley.net>
parents: 1212
diff changeset
343 volatile char *p = (char *)ptr;
913
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
344 *p = val;
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
345 }
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
346 }
7fed25030389 Enable readfile() and add peek() and poke() functions.
Rob Landley <rob@landley.net>
parents: 904
diff changeset
347
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
348 // Iterate through an array of files, opening each one and calling a function
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
349 // on that filehandle and name. The special filename "-" means stdin if
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
350 // flags is O_RDONLY, stdout otherwise. An empty argument list calls
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
351 // function() on just stdin/stdout.
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
352 //
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
353 // Note: read only filehandles are automatically closed when function()
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
354 // 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
355 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
356 void (*function)(int fd, char *name))
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
357 {
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
358 int fd;
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
359
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
360 // 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
361 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
362 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
363 // 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
364 // 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
365
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
366 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
367 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
368 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
369 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
370 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
371 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 671
diff changeset
372 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
373 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
374 } while (*++argv);
185
29e2051296fd Add loopfiles() function, make catv use it.
Rob Landley <rob@landley.net>
parents: 167
diff changeset
375 }
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
376
397
b7afbc6b753a Forgot to check in loopfiles_rw changes needed by truncate.
Rob Landley <rob@landley.net>
parents: 379
diff changeset
377 // Call loopfiles_rw with O_RDONLY and !failok (common case).
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
378 void loopfiles(char **argv, void (*function)(int fd, char *name))
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
379 {
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
380 loopfiles_rw(argv, O_RDONLY, 0, 0, function);
308
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
381 }
52600eee8dd6 Add "tee" command.
Rob Landley <rob@landley.net>
parents: 295
diff changeset
382
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
383 // Slow, but small.
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
384
284
603275a05524 Teach get_rawline() to continue until a configurable char, and xstrndup()
Rob Landley <rob@landley.net>
parents: 252
diff changeset
385 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
386 {
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
387 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
388 long len = 0;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
389
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
390 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
391 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
392 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
393 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
394 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 671
diff changeset
395 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
396 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
397
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
398 return buf;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
399 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
400
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
401 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
402 {
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
403 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
404 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
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 (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
407
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
408 return buf;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
409 }
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
410
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
411 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
412 {
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
413 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
414
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
415 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
416 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
417 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
418 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 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
420 }
7becb497c3c4 Update chmod to work with new dirtree, and fix bugs in string_to_mode().
Rob Landley <rob@landley.net>
parents: 585
diff changeset
421
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
422 static char *tempfile2zap;
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
423 static void tempfile_handler(int i)
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
424 {
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
425 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
426 _exit(1);
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
427 }
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
428
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
429 // Open a temporary file to copy an existing file into.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
430 int copy_tempfile(int fdin, char *name, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
431 {
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
432 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
433 int fd;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
434
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
435 *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
436 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
437 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
438 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
439 tempfile2zap = *tempname;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
440
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
441 // Set permissions of output file
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
442
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
443 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
444 fchmod(fd, statbuf.st_mode);
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
445
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
446 return fd;
201
5d523752715a Start of "patch" support. Writes to stdout at the moment.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
447 }
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
448
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
449 // Abort the copy and delete the temporary file.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
450 void delete_tempfile(int fdin, int fdout, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
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 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
453 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
454 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
455 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
456 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
457 *tempname = NULL;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
458 }
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
459
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
460 // Copy the rest of the data and replace the original with the copy.
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
461 void replace_tempfile(int fdin, int fdout, char **tempname)
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
462 {
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
463 char *temp = xstrdup(*tempname);
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
464
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
465 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
466 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
467 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
468 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
469 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 671
diff changeset
470 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
471 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
472 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
473 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
474 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
475 *tempname = NULL;
209
9a0d4e8a9c61 Patch command.
Rob Landley <rob@landley.net>
parents: 201
diff changeset
476 }
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
477
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
478 // 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
479
337
aaafa1ceaa91 Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents: 334
diff changeset
480 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
481 {
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
482 unsigned int i;
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
483
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
484 // 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
485 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
486 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
487 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
488 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
489 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
490 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
491 }
334
83c461db9df7 Check in crc_init needed by cksum. (Oops.)
Rob Landley <rob@landley.net>
parents: 311
diff changeset
492 }
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
493
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
494 // 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
495 // 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
496 // 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
497
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
498 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
499 {
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
500 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
501 unsigned i, x = 0, y = 0;
1097
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
502 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
503
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
504 // 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
505 for (i=0; i<3; i++) {
1097
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
506 memset(&ws, 0, sizeof(ws));
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
507 if (!ioctl(i, TIOCGWINSZ, &ws)) {
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
508 if (ws.ws_col) x = ws.ws_col;
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
509 if (ws.ws_row) y = ws.ws_row;
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
510
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
511 break;
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
512 }
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
513 }
1097
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
514 s = getenv("COLUMNS");
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
515 if (s) sscanf(s, "%u", &x);
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
516 s = getenv("ROWS");
54b2776de2f4 Refactor terminal querying.
Rob Landley <rob@landley.net>
parents: 1070
diff changeset
517 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
518
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
519 // 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
520 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
521 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
522
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
523 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
524 }
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
525
503
3b9dea897dc0 Upgrade yesno() and make cp -i use it.
Rob Landley <rob@landley.net>
parents: 498
diff changeset
526 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
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 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
529
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
530 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
531 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
532 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
533 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
534
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
535 // 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
536 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
537 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
538 }
550
b2194045c40e Remove "feature test macros", replace non-portable fdprintf() with standard fprintf().
Rob Landley <rob@landley.net>
parents: 535
diff changeset
539
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
540 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
541 }
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
542
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
543 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
544 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
545 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
546 };
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
547
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
548 // 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
549 // 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
550
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
551 #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
552
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
553 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
554 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
555 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
556 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
557 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
558 SIGNIFY(VTALRM), SIGNIFY(XCPU), SIGNIFY(XFSZ),
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
559
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
560 // Start of non-terminal signals
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
561
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
562 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
563 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
564 };
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
565
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
566 // 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
567 // 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
568
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
569 // 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
570 void sigatexit(void *handler)
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
571 {
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
572 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
573 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
574 }
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
575 // 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
576 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
577 {
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
578 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
579
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
580 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
581 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
582 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
583 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
584
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
585 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
586 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 671
diff changeset
587 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
588 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
589 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
590
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
591 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
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 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
595 {
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
596 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
597
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
598 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
599 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
600 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
601 }
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
602
643
7bdebd2af1d6 Add signal handler to clean up tempfile.
Rob Landley <rob@landley.net>
parents: 640
diff changeset
603 // 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
604 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
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 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
607 char *s, *str = modestr;
553
75da5d793fc8 Unwind gratuitous macros.
Rob Landley <rob@landley.net>
parents: 551
diff changeset
608
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
609 // 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
610 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
611 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
612 if (*s || (mode & ~(07777))) goto barf;
553
75da5d793fc8 Unwind gratuitous macros.
Rob Landley <rob@landley.net>
parents: 551
diff changeset
613
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
614 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
615 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
616
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
617 // 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
618 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
619 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
620
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
621 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
622
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
623 // 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
624 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
625 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
626 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
627 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 // 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
629 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
630 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
631 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
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 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
634 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
635
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
636 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
637 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
638 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
639 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
640 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
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 // 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
643 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
644
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
645 // 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
646 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
647 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
648 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
649 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
650
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
651 // 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
652 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
653
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
654 // 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
655 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
656 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
657 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
658 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
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 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
661
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
662 // 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
663 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
664 // 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
665 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
666 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
667 } 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
668 } 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
669 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
670 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
671 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
672
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
673 // 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
674
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
675 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
676 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
677 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 }
578
5cc8a8fc08b4 First pass at a complete rewrite of string_to_mode(). (It compiled!)
Rob Landley <rob@landley.net>
parents: 565
diff changeset
679
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
680 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
681 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing 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 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
683 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
684 error_exit("bad mode '%s'", modestr);
551
2548e6e590b2 Add string to mode_t parser
Daniel Walter <d.walter@0x90.at>
parents: 550
diff changeset
685 }
658
2b957eaa00c7 Add du command.
Ashwini Kumar <ak.ashwini@gmail.com>
parents: 643
diff changeset
686
916
b92cb3cc9696 Stat cleanup.
Rob Landley <rob@landley.net>
parents: 913
diff changeset
687 // Format access mode into a drwxrwxrwx string
b92cb3cc9696 Stat cleanup.
Rob Landley <rob@landley.net>
parents: 913
diff changeset
688 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
689 {
beb32d780164 Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents: 883
diff changeset
690 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
691 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
692
916
b92cb3cc9696 Stat cleanup.
Rob Landley <rob@landley.net>
parents: 913
diff changeset
693 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
694 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
695 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
696 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
697 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
698 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
699 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
700 } else c = bit ? "xwr"[c] : '-';
916
b92cb3cc9696 Stat cleanup.
Rob Landley <rob@landley.net>
parents: 913
diff changeset
701 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
702 }
beb32d780164 Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents: 883
diff changeset
703
beb32d780164 Add library function for the file permission formatting in ls and stat
Felix Janda <felix.janda@posteo.de>
parents: 883
diff changeset
704 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
705 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
706 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
707 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
708 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
709 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
710 else c = '-';
916
b92cb3cc9696 Stat cleanup.
Rob Landley <rob@landley.net>
parents: 913
diff changeset
711 *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
712 }
1145
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
713
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
714 // 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
715 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
716 {
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
717 DIR *dp;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
718 struct dirent *entry;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
719
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
720 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
721
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
722 while ((entry = readdir(dp))) {
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
723 unsigned u;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
724 char *cmd, **curname;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
725
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
726 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
727 sprintf(libbuf, "/proc/%u/cmdline", u);
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
728 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
729
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
730 for (curname = names; *curname; curname++)
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
731 if (**curname == '/' ? !strcmp(cmd, *curname)
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
732 : !strcmp(basename(cmd), basename(*curname)))
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
733 if (callback(u, *curname)) break;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
734 if (*curname) break;
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
735 }
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
736 closedir(dp);
80c9df5145fe Move names_to_pid from pending to lib.
Rob Landley <rob@landley.net>
parents: 1141
diff changeset
737 }