command.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder/***********************************************************************
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder* This software is part of the ast package *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* Copyright (c) 1990-2011 AT&T Intellectual Property *
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu* and is licensed under the *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* Eclipse Public License, Version 1.0 *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* by AT&T Intellectual Property *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* A copy of the License is available at *
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder* http://www.eclipse.org/org/documents/epl-v10.html *
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* Information and Software Systems Research *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* AT&T Research *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder* Florham Park NJ *
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder* Glenn Fowler <gsf@research.att.com> *
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder***********************************************************************/
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder * Glenn Fowler
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder * AT&T Bell Laboratories
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder * remote coshell server command interface support
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder#define NOARG (((int)1)<<(CHAR_BIT*sizeof(int)-2))
4c7f058cdd19ce67b2b5d4b7f69703d0f8a21e38Christian Maeder * send command message to fd and read ack
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder * 0 returned after the last command
67869d63d1725c79e4c07b51acd466a31932b275Christian Maedercmdsend(int fd, int c, register char* s, register int n, int* code)
65dce48b81f69e11a36bf1051314a845299446e1Christian Maeder error(ERROR_SYSTEM|3, "message write error");
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder if (c == 'Q') return(0);
64e1905404e5135e98a26d2ab4150b6764956576Christian Maeder if (((n = read(fd, s, sizeof(cmd) - 1)) == 4 || n > 6) && s[0] == 'a' && isdigit(s[2]))
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder if (n == 4) n = read(fd, s, sizeof(cmd) - 1);
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder if (code && (n = (int)strtol(s, NiL, 10))) *code = n;
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder fds[n++].events = CS_POLL_READ|CS_POLL_CONNECT;
0d7d8e3dd817450cf792778d9d4e36420f5e8abfChristian Maeder for (m = 0; m < n; m++)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder if (n < elementsof(fds) && csrecv(fds[m].fd, NiL, &x, 1) == 1)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder if ((c = read(fds[m].fd, cmd, sizeof(cmd))) > 0)
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder else if (csread(fds[m].fd, cmd, 7, CS_EXACT) == 7 && cmd[0] == '#')
1bc5dccbf0083a620ae1181c717fea75e4af5e5cChristian Maeder svc.pass[fds[m].fd] = (int)strtol(cmd + 1, NiL, 10);
ecf557c0b4f953106755a239da2c0b168064d3f4Christian Maeder while (--i > n)
bdf2e01977470bedcb4425e2dadabc9e9f6ba149Ewaryst Schulz * send a job control kill message to fd
083a5256468076d5a9bfeb22a6e97076c224252eChristian Maeder n = sfsprintf(buf, sizeof(buf), "#%05d\nk 0 %d\n", 0, sig);
de66af0f4b27f08f81c7ca9c573ef9cdf7ca7a07Christian Maeder * pass job control signals to the server and self
6d4d212092e2edb139e0907a14e87c4df74ff06aChristian Maeder * command loop on server stream fd
6d4d212092e2edb139e0907a14e87c4df74ff06aChristian Maeder * if ap!=0 then it is an argv of commands
int helped = 0;
int code = 0;
int prompt;
char* arg;
char* att;
#ifdef SIGCONT
#ifdef SIGTSTP
#ifdef SIGTTIN
#ifdef SIGTTOU
if (!ap)
while (isspace(*s)) s++;
else if (!(s = *ap++)) break;
while (isspace(*s)) s++;
while (isspace(*s)) s++;
while (isspace(*s)) s++;
if (isdigit(*s))
n = strtol(s, &t, 0);
else n = *s ? *s : NOARG;
att = s;
else if (isspace(*s))
while (isspace(*s)) s++;
NiL,
NiL,
NiL);
if (ap)
while (s = *ap++)
ap--;
if (helped) continue;
helped++;
return(code);
#ifdef S_ISSOCK
int hdr;
hdr = 0;
switch (op)
if (dat)
while (s = tokread(t))
tokclose(t);
if (dat)
while (s = tokread(t))
if (!(sp = search(GET, s, NiL, NiL))) error(ERROR_OUTPUT|2, con[fd].info.user.fds[2], "%s: not found", s);
tokclose(t);
message((error_info.trace, "level=%d output=%s", -arg, dat ? dat : cspath(state.indirect.con ? 2 : con[fd].info.user.fds[2], 0)));
if (dat)
if ((n = open(dat, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) >= 0)
dup(n);
close(n);
case ANON:
case DEST:
case IDENT:
case MESG:
case PASS:
if (jp = con[n].info.pass.job) sfprintf(state.string, "%3d pass %-3d %s %d%s\n", n, con[n].info.pass.fd, jp->shell->name, jp->pid, con[n].info.pass.serialize ? " serialize" : "");
case POLL:
case PUMP:
case SHELL:
case USER:
if (con[n].info.user.fds[0] == n) sfprintf(state.string, "%3d query %-3d %-3d %s\n", n, con[n].info.user.fds[1], con[n].info.user.fds[2], (sp = con[n].info.user.home) ? sp->name : "");
else sfprintf(state.string, "%3d user %-3d %-3d %-3d %s\n", n, con[n].info.user.fds[0], con[n].info.user.fds[1], con[n].info.user.fds[2], (sp = con[n].info.user.home) ? sp->name : "");
case UCMD:
goto path;
case UERR:
goto path;
case UOUT:
goto path;
path:
else if (arg >= state.fdtotal || !con[arg].type) error(ERROR_OUTPUT|2, con[fd].info.user.fds[2], "cannot drop CON %d", arg);
sfprintf(state.string, " access %-7s", state.access < cs.time ? "EXPIRED" : fmtelapsed(state.access - cs.time, 1));
case QUEUE:
case START:
case WARP:
if (!hdr)
sfprintf(state.string, "%3d%4d%4d%6s%7s%c%-16s %s%s%s", jp - state.job, jp->fd, jp->rid, t, fmtelapsed(cs.time - jp->start, 1), jp->ref <= 0 ? '*' : jp->lost ? (jp->lost > cs.time ? '?' : '!') : ' ', jp->shell->name, v, *v ? " " : "", jp->label);
else switch (sub)
#ifdef SIGCONT
#ifdef SIGSTOP
*sv = 0;
if (dat && (attr.global.set & SETPOOL) && attr.global.pool > 0 && attr.global.pool < n) sv[attr.global.pool] = 0;
if (dat)
while (s = tokread(t))
if (!(sp = search(NEW, s, NiL, NiL))) error(ERROR_OUTPUT|2, con[fd].info.user.fds[2], "%s: invalid host name", s);
tokclose(t);
if (sub == 'a' || sub == 'e' || sp->fd || (sub == 'l' || sub == 's') && sp->temp && !(sp->flags & IGN)) *sv++ = sp;
*sv = 0;
strsort((char**)(sv = state.shellv), n, sub == 'a' || sub == 'e' || sub == 'p' ? byname : sub == 't' ? bytemp : byrank);
switch (sub)
sfprintf(state.string, "HOST CONF\n%-12.12s busy=%s grace=%s name=%s percpu=%d perserver=%d peruser=%d pool=%d\n", CS_HOST_LOCAL, fmtelapsed(state.busy, 1), fmtelapsed(state.grace, 1), state.shell->name, state.percpu, state.perserver, state.peruser, state.pool);
switch (sub)
if (sub == 'o' || sub == 's' || sub == 't') sfprintf(state.string, "%3s%c%4d%6d%7s%8s%7s%7s/%d%7s%7s%9s %s\n"
, sp->stat.up < 0 ? '-' : (sp->mode & SHELL_DISABLE) ? '$' : (sp->mode & SHELL_DENIED) ? '!' : sp->idle && sp->stat.idle < sp->idle ? (sp->home ? '~' : '*') : ' '
sfprintf(state.string, "%6s%7s%8s%6d%7s%7s%7s%7s%8s%6s%7s\n", num[0], num[1], num[2], state.cmds, fmtelapsed(cs.time - state.start, 1), fmtelapsed(state.real, 1), fmtelapsed(state.user, CO_QUANT), fmtelapsed(state.sys, CO_QUANT), num[3], fmtfloat(tot.stat.load), fmtfloat(tot.rating));
if (!hdr)