7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/***********************************************************************
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* and is licensed under the *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* A copy of the License is available at *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* http://www.opensource.org/licenses/cpl1.0.txt *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Information and Software Systems Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* AT&T Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Florham Park NJ *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Glenn Fowler <gsf@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* David Korn <dgk@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin***********************************************************************/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#pragma prototyped
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define FORMAT "PID=%(pid)d PPID=%(ppid)d PGID=%(pgid)d TID=%(tid)d SID=%(sid)d"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const char usage[] =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[-?\n@(#)$Id: pids (AT&T Research) 2008-04-01 $\n]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinUSAGE_LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+NAME?pids - list calling shell process ids]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+DESCRIPTION?When invoked as a shell builtin, \bpids\b lists one or "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "more of the calling process ids determined by \bgetpid\b(2), "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "\bgetppid\b(2), \bgetpgrp\b(2), \btcgetpgrp\b(2) and \bgetsid\b(2). "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "Unknown or invalid ids have the value \b-1\b.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[f:format?List the ids specified by \aformat\a. \aformat\a follows "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "\bprintf\b(3) conventions, except that \bsfio\b(3) inline ids are used "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "instead of arguments: "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "%[-+]][\awidth\a[.\aprecis\a[.\abase\a]]]]]](\aid\a)\achar\a. The "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "supported \aid\as are:]:[format:=" FORMAT "]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "{"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+pid?The process id.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+pgid?The process group id.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+ppid?The parent process id.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+tid|tty?The controlling terminal id.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+sid?The session id.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+SEE ALSO?\bgetpid\b(2), \bgetppid\b(2), \bgetpgrp\b(2), "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "\btcgetpgrp\b(2), \bgetsid\b(2)]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <cmd.h>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <ast_tty.h>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <sfdisc.h>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * sfkeyprintf() lookup
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * handle==0 for heading
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinkey(void* handle, Sffmt_t* fp, const char* arg, char** ps, Sflong_t* pn)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register char* s;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int fd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin long tid;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!(s = fp->t_str) || streq(s, "pid"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *pn = getpid();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (streq(s, "pgid"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *pn = getpgid(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (streq(s, "ppid"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *pn = getppid();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (streq(s, "tid") || streq(s, "tty"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (fd = 0; fd < 3; fd++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((tid = tcgetpgrp(fd)) >= 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *pn = tid;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (streq(s, "sid"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *pn = getsid(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (streq(s, "format"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *ps = (char*)handle;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error(2, "%s: unknown format identifier", s);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinint
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinb_pids(int argc, char** argv, void* context)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char* format = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (;;)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (optget(argv, usage))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case 'f':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin format = opt_info.arg;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case '?':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error(ERROR_USAGE|4, "%s", opt_info.arg);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case ':':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error(2, "%s", opt_info.arg);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin argv += opt_info.index;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (error_info.errors || *argv)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error(ERROR_USAGE|4, "%s", optusage(NiL));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!format)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin format = FORMAT;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfkeyprintf(sfstdout, format, format, key, NiL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstdout, "\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}