Blame


1 d1f529f4 2005-10-29 devnull #include "common.h"
2 d1f529f4 2005-10-29 devnull
3 d1f529f4 2005-10-29 devnull /* expand a path relative to some `.' */
4 d1f529f4 2005-10-29 devnull extern String *
5 d1f529f4 2005-10-29 devnull abspath(char *path, char *dot, String *to)
6 d1f529f4 2005-10-29 devnull {
7 d1f529f4 2005-10-29 devnull if (*path == '/') {
8 d1f529f4 2005-10-29 devnull to = s_append(to, path);
9 d1f529f4 2005-10-29 devnull } else {
10 d1f529f4 2005-10-29 devnull to = s_append(to, dot);
11 d1f529f4 2005-10-29 devnull to = s_append(to, "/");
12 d1f529f4 2005-10-29 devnull to = s_append(to, path);
13 d1f529f4 2005-10-29 devnull }
14 d1f529f4 2005-10-29 devnull return to;
15 d1f529f4 2005-10-29 devnull }
16 d1f529f4 2005-10-29 devnull
17 d1f529f4 2005-10-29 devnull /* return a pointer to the base component of a pathname */
18 d1f529f4 2005-10-29 devnull extern char *
19 d1f529f4 2005-10-29 devnull basename(char *path)
20 d1f529f4 2005-10-29 devnull {
21 d1f529f4 2005-10-29 devnull char *cp;
22 d1f529f4 2005-10-29 devnull
23 d1f529f4 2005-10-29 devnull cp = strrchr(path, '/');
24 d1f529f4 2005-10-29 devnull return cp==0 ? path : cp+1;
25 d1f529f4 2005-10-29 devnull }
26 d1f529f4 2005-10-29 devnull
27 d1f529f4 2005-10-29 devnull /* append a sub-expression match onto a String */
28 d1f529f4 2005-10-29 devnull extern void
29 d1f529f4 2005-10-29 devnull append_match(Resub *subexp, String *sp, int se)
30 d1f529f4 2005-10-29 devnull {
31 d1f529f4 2005-10-29 devnull char *cp, *ep;
32 d1f529f4 2005-10-29 devnull
33 605c0ea1 2006-02-08 devnull cp = subexp[se].s.sp;
34 605c0ea1 2006-02-08 devnull ep = subexp[se].e.ep;
35 d1f529f4 2005-10-29 devnull for (; cp < ep; cp++)
36 d1f529f4 2005-10-29 devnull s_putc(sp, *cp);
37 d1f529f4 2005-10-29 devnull s_terminate(sp);
38 d1f529f4 2005-10-29 devnull }
39 d1f529f4 2005-10-29 devnull
40 d1f529f4 2005-10-29 devnull /*
41 d1f529f4 2005-10-29 devnull * check for shell characters in a String
42 d1f529f4 2005-10-29 devnull */
43 d1f529f4 2005-10-29 devnull static char *illegalchars = "\r\n";
44 d1f529f4 2005-10-29 devnull
45 d1f529f4 2005-10-29 devnull extern int
46 d1f529f4 2005-10-29 devnull shellchars(char *cp)
47 d1f529f4 2005-10-29 devnull {
48 d1f529f4 2005-10-29 devnull char *sp;
49 d1f529f4 2005-10-29 devnull
50 d1f529f4 2005-10-29 devnull for(sp=illegalchars; *sp; sp++)
51 d1f529f4 2005-10-29 devnull if(strchr(cp, *sp))
52 d1f529f4 2005-10-29 devnull return 1;
53 d1f529f4 2005-10-29 devnull return 0;
54 d1f529f4 2005-10-29 devnull }
55 d1f529f4 2005-10-29 devnull
56 605c0ea1 2006-02-08 devnull static char *specialchars = " ()<>{};=\\'`^&|";
57 d1f529f4 2005-10-29 devnull static char *escape = "%%";
58 d1f529f4 2005-10-29 devnull
59 d1f529f4 2005-10-29 devnull int
60 d1f529f4 2005-10-29 devnull hexchar(int x)
61 d1f529f4 2005-10-29 devnull {
62 d1f529f4 2005-10-29 devnull x &= 0xf;
63 d1f529f4 2005-10-29 devnull if(x < 10)
64 d1f529f4 2005-10-29 devnull return '0' + x;
65 d1f529f4 2005-10-29 devnull else
66 d1f529f4 2005-10-29 devnull return 'A' + x - 10;
67 d1f529f4 2005-10-29 devnull }
68 d1f529f4 2005-10-29 devnull
69 d1f529f4 2005-10-29 devnull /*
70 d1f529f4 2005-10-29 devnull * rewrite a string to escape shell characters
71 d1f529f4 2005-10-29 devnull */
72 d1f529f4 2005-10-29 devnull extern String*
73 d1f529f4 2005-10-29 devnull escapespecial(String *s)
74 d1f529f4 2005-10-29 devnull {
75 d1f529f4 2005-10-29 devnull String *ns;
76 d1f529f4 2005-10-29 devnull char *sp;
77 d1f529f4 2005-10-29 devnull
78 d1f529f4 2005-10-29 devnull for(sp = specialchars; *sp; sp++)
79 d1f529f4 2005-10-29 devnull if(strchr(s_to_c(s), *sp))
80 d1f529f4 2005-10-29 devnull break;
81 d1f529f4 2005-10-29 devnull if(*sp == 0)
82 d1f529f4 2005-10-29 devnull return s;
83 d1f529f4 2005-10-29 devnull
84 d1f529f4 2005-10-29 devnull ns = s_new();
85 d1f529f4 2005-10-29 devnull for(sp = s_to_c(s); *sp; sp++){
86 d1f529f4 2005-10-29 devnull if(strchr(specialchars, *sp)){
87 d1f529f4 2005-10-29 devnull s_append(ns, escape);
88 d1f529f4 2005-10-29 devnull s_putc(ns, hexchar(*sp>>4));
89 d1f529f4 2005-10-29 devnull s_putc(ns, hexchar(*sp));
90 d1f529f4 2005-10-29 devnull } else
91 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
92 d1f529f4 2005-10-29 devnull }
93 d1f529f4 2005-10-29 devnull s_terminate(ns);
94 d1f529f4 2005-10-29 devnull s_free(s);
95 d1f529f4 2005-10-29 devnull return ns;
96 d1f529f4 2005-10-29 devnull }
97 d1f529f4 2005-10-29 devnull
98 d1f529f4 2005-10-29 devnull uint
99 d1f529f4 2005-10-29 devnull hex2uint(char x)
100 d1f529f4 2005-10-29 devnull {
101 d1f529f4 2005-10-29 devnull if(x >= '0' && x <= '9')
102 d1f529f4 2005-10-29 devnull return x - '0';
103 d1f529f4 2005-10-29 devnull if(x >= 'A' && x <= 'F')
104 d1f529f4 2005-10-29 devnull return (x - 'A') + 10;
105 d1f529f4 2005-10-29 devnull if(x >= 'a' && x <= 'f')
106 d1f529f4 2005-10-29 devnull return (x - 'a') + 10;
107 d1f529f4 2005-10-29 devnull return -512;
108 d1f529f4 2005-10-29 devnull }
109 d1f529f4 2005-10-29 devnull
110 d1f529f4 2005-10-29 devnull /*
111 d1f529f4 2005-10-29 devnull * rewrite a string to remove shell characters escapes
112 d1f529f4 2005-10-29 devnull */
113 d1f529f4 2005-10-29 devnull extern String*
114 d1f529f4 2005-10-29 devnull unescapespecial(String *s)
115 d1f529f4 2005-10-29 devnull {
116 d1f529f4 2005-10-29 devnull String *ns;
117 d1f529f4 2005-10-29 devnull char *sp;
118 d1f529f4 2005-10-29 devnull uint c, n;
119 d1f529f4 2005-10-29 devnull
120 d1f529f4 2005-10-29 devnull if(strstr(s_to_c(s), escape) == 0)
121 d1f529f4 2005-10-29 devnull return s;
122 d1f529f4 2005-10-29 devnull n = strlen(escape);
123 d1f529f4 2005-10-29 devnull
124 d1f529f4 2005-10-29 devnull ns = s_new();
125 d1f529f4 2005-10-29 devnull for(sp = s_to_c(s); *sp; sp++){
126 d1f529f4 2005-10-29 devnull if(strncmp(sp, escape, n) == 0){
127 d1f529f4 2005-10-29 devnull c = (hex2uint(sp[n])<<4) + hex2uint(sp[n+1]);
128 d1f529f4 2005-10-29 devnull if(c < 0)
129 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
130 d1f529f4 2005-10-29 devnull else {
131 d1f529f4 2005-10-29 devnull s_putc(ns, c);
132 d1f529f4 2005-10-29 devnull sp += n+2-1;
133 d1f529f4 2005-10-29 devnull }
134 d1f529f4 2005-10-29 devnull } else
135 d1f529f4 2005-10-29 devnull s_putc(ns, *sp);
136 d1f529f4 2005-10-29 devnull }
137 d1f529f4 2005-10-29 devnull s_terminate(ns);
138 d1f529f4 2005-10-29 devnull s_free(s);
139 d1f529f4 2005-10-29 devnull return ns;
140 d1f529f4 2005-10-29 devnull
141 d1f529f4 2005-10-29 devnull }
142 d1f529f4 2005-10-29 devnull
143 d1f529f4 2005-10-29 devnull int
144 d1f529f4 2005-10-29 devnull returnable(char *path)
145 d1f529f4 2005-10-29 devnull {
146 d1f529f4 2005-10-29 devnull
147 d1f529f4 2005-10-29 devnull return strcmp(path, "/dev/null") != 0;
148 d1f529f4 2005-10-29 devnull }