Mercurial > hg > aboriginal
annotate sources/toys/wrappy.c @ 1021:ae5861222322
Link to mirror sites from each other.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 29 Mar 2010 08:17:24 -0500 |
parents | 850da666acc6 |
children |
rev | line source |
---|---|
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 // A little wrapper to figure out what commands you're actually using. |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 // To use it, you'll need to make a directory of symlinks and set up two |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 // environment variables. Something like: |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 // |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 // export WRAPPY_LOGPATH=/path/to/wrappy.log |
897
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
7 // export OLDPATH="$PATH" |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 // |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 // WRAPPYDIR=/path/to/wrappy |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 // cp wrappy $WRAPPYDIR |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 // for i in `echo $PATH | sed 's/:/ /g'` |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 // do |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 // for j in `ls $i` |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 // do |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 // ln -s wrappy $WRAPPYDIR/$j |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 // done |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 // done |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 // |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 // PATH="$WRAPPYDIR" make thingy |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 #include <fcntl.h> |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 #include <stdio.h> |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 #include <string.h> |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 #include <stdlib.h> |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 |
897
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
26 // No, I'm not doing any bounds checking. It's a debug wrapper. |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 char blah[65536]; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 int main(int argc, char *argv[], char *env[]) |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 char *logpath, *realpath, *p, *p2, *p3; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 int i, fd; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 // If these environment variables didn't propogate down to our build, how |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 // did $PATH make it there? (Faily noisily if they are missing...) |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 logpath = getenv("WRAPPY_LOGPATH"); |
897
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
39 realpath = getenv("OLDPATH"); |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 if (!logpath || !realpath) { |
897
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
41 fprintf(stderr, "No %s\n", logpath ? "OLDPATH" : "WRAPPY_LOGPATH"); |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 exit(1); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 // Figure out name of command being run. |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 p2 = strrchr(*argv, '/'); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 if (!p2) p2=*argv; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 else p2++; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 // Write command line to a buffer. (We need the whole command line in one |
897
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
52 // buffer so we can do a single atomic write, so commands don't get |
850da666acc6
Redo command recording: no longer RECORD_COMMMANDS config entry, now sources/more/record-commands.sh run to set up the wrapper (either before or after host-tools.sh). General cleanup and simplification of code this interacted with, plus clean up bit rot in the reporting.
Rob Landley <rob@landley.net>
parents:
365
diff
changeset
|
53 // interleaved via make -j.) |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 p=blah + sprintf(blah, "%s ",p2); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 for (i=1; i<argc && (p-blah)<sizeof(blah); i++) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 *(p++)='"'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 for (p3 = argv[i]; *p3 && (p-blah)<sizeof(blah); p3++) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 char *s = "\n\\\"", *ss = strchr(s, *p3); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 if (ss) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 *(p++)='\\'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 *(p++)="n\\\""[ss-s]; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 } else *(p++) = *p3; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 *(p++)='"'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 *(p++)=' '; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 p[-1]='\n'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 // Log the command line, using O_APPEND and an atomic write so this entry |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 // always goes at the end no matter what other processes are writing |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 // into the file. |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 fd=open(logpath, O_WRONLY|O_CREAT|O_APPEND, 0777); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 write(fd, blah, p-blah); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 close(fd); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 // Hand off control to the real executable |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 |
365
f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
Rob Landley <rob@landley.net>
parents:
352
diff
changeset
|
81 for (p = p3 = realpath; ; p3++) { |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 if (*p3==':' || !*p3) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 char snapshot = *p3; |
365
f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
Rob Landley <rob@landley.net>
parents:
352
diff
changeset
|
84 |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 *p3 = 0; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 snprintf(blah, sizeof(blah)-1, "%s/%s", p, p2); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 *p3 = snapshot; |
365
f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
Rob Landley <rob@landley.net>
parents:
352
diff
changeset
|
88 argv[0]=blah; |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 execve(blah, argv, env); |
365
f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
Rob Landley <rob@landley.net>
parents:
352
diff
changeset
|
90 if (!*p3) break; |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 p = p3+1; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 // Should never happen, means environment setup is wrong. |
365
f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
Rob Landley <rob@landley.net>
parents:
352
diff
changeset
|
96 fprintf(stderr, "Didn't find %s\n", p2); |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 exit(1); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 } |