Mercurial > hg > aboriginal
annotate sources/toys/wrappy.c @ 365:f9ec1fd54034
Correct log message, check last $PATH element properly, and set argv[0] to path
being run and not just command name.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sun, 13 Jul 2008 07:57:49 -0500 |
parents | 1782b77fae15 |
children | 850da666acc6 |
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 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 // export WRAPPY_REALPATH="$PATH" |
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 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 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
|
27 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 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
|
29 { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 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
|
31 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 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
|
33 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 // 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
|
35 // 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
|
36 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 logpath = getenv("WRAPPY_LOGPATH"); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 realpath = getenv("WRAPPY_REALPATH"); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 if (!logpath || !realpath) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 fprintf(stderr, "No WRAPPY_%s\n", logpath ? "REALPATH" : "LOGPATH"); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 exit(1); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 } |
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 // 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
|
45 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 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
|
47 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
|
48 else p2++; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 // Write command line to a buffer. (We need the whole command line in one |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 //buffer so we can do one write.) |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 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
|
54 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
|
55 *(p++)='"'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 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
|
57 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
|
58 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 if (ss) { |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 *(p++)='\\'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 *(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
|
62 } 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
|
63 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 *(p++)='"'; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 *(p++)=' '; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 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
|
68 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 // 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
|
70 // 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
|
71 // 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
|
72 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 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
|
74 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
|
75 close(fd); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 // Touch the file that got used. |
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 // sprintf(blah, ROOTPATH "/used/%s", p2); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 // close(open(blah, O_WRONLY|O_CREAT, 0777)); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 // 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
|
83 |
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 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
|
85 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
|
86 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
|
87 |
352
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 *p3 = 0; |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 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
|
90 *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
|
91 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
|
92 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
|
93 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
|
94 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
|
95 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 } |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 // 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
|
99 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
|
100 exit(1); |
1782b77fae15
Add command logging. Set RECORD_COMMANDS=1 to log every command line run
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 } |