aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/upas/common/aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/upas/common/aux.c')
-rw-r--r--src/cmd/upas/common/aux.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/cmd/upas/common/aux.c b/src/cmd/upas/common/aux.c
new file mode 100644
index 00000000..7577acae
--- /dev/null
+++ b/src/cmd/upas/common/aux.c
@@ -0,0 +1,148 @@
+#include "common.h"
+
+/* expand a path relative to some `.' */
+extern String *
+abspath(char *path, char *dot, String *to)
+{
+ if (*path == '/') {
+ to = s_append(to, path);
+ } else {
+ to = s_append(to, dot);
+ to = s_append(to, "/");
+ to = s_append(to, path);
+ }
+ return to;
+}
+
+/* return a pointer to the base component of a pathname */
+extern char *
+basename(char *path)
+{
+ char *cp;
+
+ cp = strrchr(path, '/');
+ return cp==0 ? path : cp+1;
+}
+
+/* append a sub-expression match onto a String */
+extern void
+append_match(Resub *subexp, String *sp, int se)
+{
+ char *cp, *ep;
+
+ cp = subexp[se].s.sp; /* jpc .sp -> .s.sp */
+ ep = subexp[se].e.ep; /* jpc .ep -> .e.ep */
+ for (; cp < ep; cp++)
+ s_putc(sp, *cp);
+ s_terminate(sp);
+}
+
+/*
+ * check for shell characters in a String
+ */
+static char *illegalchars = "\r\n";
+
+extern int
+shellchars(char *cp)
+{
+ char *sp;
+
+ for(sp=illegalchars; *sp; sp++)
+ if(strchr(cp, *sp))
+ return 1;
+ return 0;
+}
+
+static char *specialchars = " ()<>{};=\\'\`^&|";
+static char *escape = "%%";
+
+int
+hexchar(int x)
+{
+ x &= 0xf;
+ if(x < 10)
+ return '0' + x;
+ else
+ return 'A' + x - 10;
+}
+
+/*
+ * rewrite a string to escape shell characters
+ */
+extern String*
+escapespecial(String *s)
+{
+ String *ns;
+ char *sp;
+
+ for(sp = specialchars; *sp; sp++)
+ if(strchr(s_to_c(s), *sp))
+ break;
+ if(*sp == 0)
+ return s;
+
+ ns = s_new();
+ for(sp = s_to_c(s); *sp; sp++){
+ if(strchr(specialchars, *sp)){
+ s_append(ns, escape);
+ s_putc(ns, hexchar(*sp>>4));
+ s_putc(ns, hexchar(*sp));
+ } else
+ s_putc(ns, *sp);
+ }
+ s_terminate(ns);
+ s_free(s);
+ return ns;
+}
+
+uint
+hex2uint(char x)
+{
+ if(x >= '0' && x <= '9')
+ return x - '0';
+ if(x >= 'A' && x <= 'F')
+ return (x - 'A') + 10;
+ if(x >= 'a' && x <= 'f')
+ return (x - 'a') + 10;
+ return -512;
+}
+
+/*
+ * rewrite a string to remove shell characters escapes
+ */
+extern String*
+unescapespecial(String *s)
+{
+ String *ns;
+ char *sp;
+ uint c, n;
+
+ if(strstr(s_to_c(s), escape) == 0)
+ return s;
+ n = strlen(escape);
+
+ ns = s_new();
+ for(sp = s_to_c(s); *sp; sp++){
+ if(strncmp(sp, escape, n) == 0){
+ c = (hex2uint(sp[n])<<4) + hex2uint(sp[n+1]);
+ if(c < 0)
+ s_putc(ns, *sp);
+ else {
+ s_putc(ns, c);
+ sp += n+2-1;
+ }
+ } else
+ s_putc(ns, *sp);
+ }
+ s_terminate(ns);
+ s_free(s);
+ return ns;
+
+}
+
+int
+returnable(char *path)
+{
+
+ return strcmp(path, "/dev/null") != 0;
+}