summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/misc/cmdarg.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libast/common/misc/cmdarg.c')
-rw-r--r--usr/src/lib/libast/common/misc/cmdarg.c353
1 files changed, 0 insertions, 353 deletions
diff --git a/usr/src/lib/libast/common/misc/cmdarg.c b/usr/src/lib/libast/common/misc/cmdarg.c
deleted file mode 100644
index ae2810aaa3..0000000000
--- a/usr/src/lib/libast/common/misc/cmdarg.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1985-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* Glenn Fowler <gsf@research.att.com> *
-* David Korn <dgk@research.att.com> *
-* Phong Vo <kpv@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-/*
- * Glenn Fowler
- * AT&T Research
- *
- * xargs/tw command arg list support
- */
-
-#include <ast.h>
-#include <ctype.h>
-#include <error.h>
-#include <proc.h>
-
-#include "cmdarg.h"
-
-#ifndef ARG_MAX
-#define ARG_MAX (64*1024)
-#endif
-#ifndef EXIT_QUIT
-#define EXIT_QUIT 255
-#endif
-
-static const char* echo[] = { "echo", 0 };
-
-/*
- * open a cmdarg stream
- * initialize the command for execution
- * argv[-1] is reserved for procrun(PROC_ARGMOD)
- */
-
-Cmdarg_t*
-cmdopen(char** argv, int argmax, int size, const char* argpat, int flags)
-{
- register Cmdarg_t* cmd;
- register int n;
- register char** p;
- register char* s;
- char* sh;
- int c;
- int m;
- int argc;
- long x;
-
- char** post = 0;
-
- n = sizeof(char**);
- if (*argv)
- {
- for (p = argv + 1; *p; p++)
- {
- if ((flags & CMD_POST) && argpat && streq(*p, argpat))
- {
- *p = 0;
- post = p + 1;
- argpat = 0;
- }
- else
- n += strlen(*p) + 1;
- }
- argc = p - argv;
- }
- else
- argc = 0;
- for (p = environ; *p; p++)
- n += sizeof(char**) + strlen(*p) + 1;
- if ((x = strtol(astconf("ARG_MAX", NiL, NiL), NiL, 0)) <= 0)
- x = ARG_MAX;
- if (size <= 0 || size > x)
- size = x;
- sh = pathshell();
- m = n + (argc + 4) * sizeof(char**) + strlen(sh) + 1;
- m = roundof(m, sizeof(char**));
- if (size < m)
- {
- error(2, "size must be at least %d", m);
- return 0;
- }
- if ((m = x / 10) > 2048)
- m = 2048;
- if (size > (x - m))
- size = x - m;
- n = size - n;
- m = ((flags & CMD_INSERT) && argpat) ? (strlen(argpat) + 1) : 0;
- if (!(cmd = newof(0, Cmdarg_t, 1, n + m)))
- {
- error(ERROR_SYSTEM|2, "out of space");
- return 0;
- }
- c = n / sizeof(char**);
- if (argmax <= 0 || argmax > c)
- argmax = c;
- s = cmd->buf;
- if (!argv[0])
- {
- argv = (char**)echo;
- cmd->echo = 1;
- }
- else if (streq(argv[0], echo[0]))
- {
- cmd->echo = 1;
- flags &= ~CMD_NEWLINE;
- }
- else if (!(flags & CMD_CHECKED))
- {
- if (!pathpath(s, argv[0], NiL, PATH_REGULAR|PATH_EXECUTE))
- {
- if (!(flags & CMD_SILENT))
- {
- error(ERROR_SYSTEM|2, "%s: command not found", argv[0]);
- exit(EXIT_NOTFOUND);
- }
- free(cmd);
- return 0;
- }
- argv[0] = s;
- }
- s += strlen(s) + 1;
- if (m)
- {
- cmd->insert = strcpy(s, argpat);
- cmd->insertlen = m - 1;
- s += m;
- }
- s += sizeof(char**) - (s - cmd->buf) % sizeof(char**);
- p = (char**)s;
- n -= strlen(*p++ = sh) + 1;
- cmd->argv = p;
- while (*p = *argv++)
- p++;
- if (m)
- {
- argmax = 1;
- *p++ = 0;
- cmd->insertarg = p;
- argv = cmd->argv;
- c = *cmd->insert;
- while (s = *argv)
- {
- while ((s = strchr(s, c)) && strncmp(cmd->insert, s, cmd->insertlen))
- s++;
- *p++ = s ? *argv : (char*)0;
- argv++;
- }
- *p++ = 0;
- }
- cmd->firstarg = cmd->nextarg = p;
- cmd->laststr = cmd->nextstr = cmd->buf + n;
- cmd->argmax = argmax;
- cmd->flags = flags;
- cmd->offset = ((cmd->postarg = post) ? (argc - (post - argv)) : 0) + 3;
- return cmd;
-}
-
-/*
- * flush outstanding command file args
- */
-
-int
-cmdflush(register Cmdarg_t* cmd)
-{
- register char* s;
- register char** p;
- register int n;
-
- if (cmd->flags & CMD_EMPTY)
- cmd->flags &= ~CMD_EMPTY;
- else if (cmd->nextarg <= cmd->firstarg)
- return 0;
- if ((cmd->flags & CMD_MINIMUM) && cmd->argcount < cmd->argmax)
- {
- if (!(cmd->flags & CMD_SILENT))
- error(2, "%d arg command would be too long", cmd->argcount);
- return -1;
- }
- cmd->total.args += cmd->argcount;
- cmd->total.commands++;
- cmd->argcount = 0;
- if (p = cmd->postarg)
- while (*cmd->nextarg++ = *p++);
- else
- *cmd->nextarg = 0;
- if (s = cmd->insert)
- {
- char* a;
- char* b;
- char* e;
- char* t;
- char* u;
- int c;
- int m;
-
- a = cmd->firstarg[0];
- b = (char*)&cmd->nextarg[1];
- e = cmd->nextstr;
- c = *s;
- m = cmd->insertlen;
- for (n = 1; cmd->argv[n]; n++)
- if (t = cmd->insertarg[n])
- {
- cmd->argv[n] = b;
- for (;;)
- {
- if (!(u = strchr(t, c)))
- {
- b += sfsprintf(b, e - b, "%s", t);
- break;
- }
- if (!strncmp(s, u, m))
- {
- b += sfsprintf(b, e - b, "%-.*s%s", u - t, t, a);
- t = u + m;
- }
- else if (b >= e)
- break;
- else
- {
- *b++ = *u++;
- t = u;
- }
- }
- if (b < e)
- *b++ = 0;
- }
- if (b >= e)
- {
- if (!(cmd->flags & CMD_SILENT))
- error(2, "%s: command too large after insert", a);
- return -1;
- }
- }
- cmd->nextarg = cmd->firstarg;
- cmd->nextstr = cmd->laststr;
- if (cmd->flags & (CMD_QUERY|CMD_TRACE))
- {
- p = cmd->argv;
- sfprintf(sfstderr, "+ %s", *p);
- while (s = *++p)
- sfprintf(sfstderr, " %s", s);
- if (!(cmd->flags & CMD_QUERY))
- sfprintf(sfstderr, "\n");
- else if (astquery(1, "? "))
- return 0;
- }
- if (cmd->echo)
- {
- n = (cmd->flags & CMD_NEWLINE) ? '\n' : ' ';
- for (p = cmd->argv + 1; s = *p++;)
- sfputr(sfstdout, s, *p ? n : '\n');
- n = 0;
- }
- else if ((n = procrun(*cmd->argv, cmd->argv, PROC_ARGMOD|PROC_IGNOREPATH)) == -1)
- {
- if (!(cmd->flags & CMD_SILENT))
- {
- error(ERROR_SYSTEM|2, "%s: command exec error", *cmd->argv);
- exit(EXIT_NOTFOUND - 1);
- }
- return -1;
- }
- else if (n >= EXIT_NOTFOUND - 1)
- {
- if (!(cmd->flags & CMD_SILENT))
- exit(n);
- }
- else if (!(cmd->flags & CMD_IGNORE))
- {
- if (n == EXIT_QUIT && !(cmd->flags & CMD_SILENT))
- exit(2);
- if (n)
- error_info.errors++;
- }
- return n;
-}
-
-/*
- * add file to the command arg list
- */
-
-int
-cmdarg(register Cmdarg_t* cmd, const char* file, register int len)
-{
- int i;
- int r;
-
- r = 0;
- if (len)
- {
- while ((cmd->nextstr -= len + 1) < (char*)(cmd->nextarg + cmd->offset))
- {
- if (cmd->nextarg == cmd->firstarg)
- {
- error(2, "%s: path too long for exec args", file);
- return -1;
- }
- if (i = cmdflush(cmd))
- {
- if (r < i)
- r = i;
- if (!(cmd->flags & CMD_IGNORE))
- return r;
- }
- }
- *cmd->nextarg++ = cmd->nextstr;
- memcpy(cmd->nextstr, file, len);
- cmd->nextstr[len] = 0;
- cmd->argcount++;
- if (cmd->argcount >= cmd->argmax && (i = cmdflush(cmd)) > r)
- r = i;
- }
- return r;
-}
-
-/*
- * close a cmdarg stream
- */
-
-int
-cmdclose(Cmdarg_t* cmd)
-{
- int n;
-
- if ((cmd->flags & CMD_EXACT) && cmd->argcount < cmd->argmax)
- {
- if (!(cmd->flags & CMD_SILENT))
- error(2, "only %d arguments for last command", cmd->argcount);
- return -1;
- }
- cmd->flags &= ~CMD_MINIMUM;
- n = cmdflush(cmd);
- free(cmd);
- return n;
-}