18462SApril.Chin@Sun.COM /***********************************************************************
28462SApril.Chin@Sun.COM * *
38462SApril.Chin@Sun.COM * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1992-2010 AT&T Intellectual Property *
58462SApril.Chin@Sun.COM * and is licensed under the *
68462SApril.Chin@Sun.COM * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
88462SApril.Chin@Sun.COM * *
98462SApril.Chin@Sun.COM * A copy of the License is available at *
108462SApril.Chin@Sun.COM * http://www.opensource.org/licenses/cpl1.0.txt *
118462SApril.Chin@Sun.COM * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
128462SApril.Chin@Sun.COM * *
138462SApril.Chin@Sun.COM * Information and Software Systems Research *
148462SApril.Chin@Sun.COM * AT&T Research *
158462SApril.Chin@Sun.COM * Florham Park NJ *
168462SApril.Chin@Sun.COM * *
178462SApril.Chin@Sun.COM * Glenn Fowler <gsf@research.att.com> *
188462SApril.Chin@Sun.COM * David Korn <dgk@research.att.com> *
198462SApril.Chin@Sun.COM * *
208462SApril.Chin@Sun.COM ***********************************************************************/
218462SApril.Chin@Sun.COM #pragma prototyped
228462SApril.Chin@Sun.COM
238462SApril.Chin@Sun.COM #define FORMAT "PID=%(pid)d PPID=%(ppid)d PGID=%(pgid)d TID=%(tid)d SID=%(sid)d"
248462SApril.Chin@Sun.COM
258462SApril.Chin@Sun.COM static const char usage[] =
268462SApril.Chin@Sun.COM "[-?\n@(#)$Id: pids (AT&T Research) 2008-04-01 $\n]"
278462SApril.Chin@Sun.COM USAGE_LICENSE
288462SApril.Chin@Sun.COM "[+NAME?pids - list calling shell process ids]"
298462SApril.Chin@Sun.COM "[+DESCRIPTION?When invoked as a shell builtin, \bpids\b lists one or "
308462SApril.Chin@Sun.COM "more of the calling process ids determined by \bgetpid\b(2), "
318462SApril.Chin@Sun.COM "\bgetppid\b(2), \bgetpgrp\b(2), \btcgetpgrp\b(2) and \bgetsid\b(2). "
328462SApril.Chin@Sun.COM "Unknown or invalid ids have the value \b-1\b.]"
338462SApril.Chin@Sun.COM "[f:format?List the ids specified by \aformat\a. \aformat\a follows "
348462SApril.Chin@Sun.COM "\bprintf\b(3) conventions, except that \bsfio\b(3) inline ids are used "
358462SApril.Chin@Sun.COM "instead of arguments: "
368462SApril.Chin@Sun.COM "%[-+]][\awidth\a[.\aprecis\a[.\abase\a]]]]]](\aid\a)\achar\a. The "
378462SApril.Chin@Sun.COM "supported \aid\as are:]:[format:=" FORMAT "]"
388462SApril.Chin@Sun.COM "{"
398462SApril.Chin@Sun.COM "[+pid?The process id.]"
408462SApril.Chin@Sun.COM "[+pgid?The process group id.]"
418462SApril.Chin@Sun.COM "[+ppid?The parent process id.]"
428462SApril.Chin@Sun.COM "[+tid|tty?The controlling terminal id.]"
438462SApril.Chin@Sun.COM "[+sid?The session id.]"
448462SApril.Chin@Sun.COM "}"
458462SApril.Chin@Sun.COM "[+SEE ALSO?\bgetpid\b(2), \bgetppid\b(2), \bgetpgrp\b(2), "
468462SApril.Chin@Sun.COM "\btcgetpgrp\b(2), \bgetsid\b(2)]"
478462SApril.Chin@Sun.COM ;
488462SApril.Chin@Sun.COM
498462SApril.Chin@Sun.COM #include <cmd.h>
508462SApril.Chin@Sun.COM #include <ast_tty.h>
518462SApril.Chin@Sun.COM #include <sfdisc.h>
528462SApril.Chin@Sun.COM
538462SApril.Chin@Sun.COM /*
548462SApril.Chin@Sun.COM * sfkeyprintf() lookup
558462SApril.Chin@Sun.COM * handle==0 for heading
568462SApril.Chin@Sun.COM */
578462SApril.Chin@Sun.COM
588462SApril.Chin@Sun.COM static int
key(void * handle,Sffmt_t * fp,const char * arg,char ** ps,Sflong_t * pn)598462SApril.Chin@Sun.COM key(void* handle, Sffmt_t* fp, const char* arg, char** ps, Sflong_t* pn)
608462SApril.Chin@Sun.COM {
618462SApril.Chin@Sun.COM register char* s;
628462SApril.Chin@Sun.COM int fd;
638462SApril.Chin@Sun.COM long tid;
648462SApril.Chin@Sun.COM
658462SApril.Chin@Sun.COM if (!(s = fp->t_str) || streq(s, "pid"))
668462SApril.Chin@Sun.COM *pn = getpid();
678462SApril.Chin@Sun.COM else if (streq(s, "pgid"))
688462SApril.Chin@Sun.COM *pn = getpgid(0);
698462SApril.Chin@Sun.COM else if (streq(s, "ppid"))
708462SApril.Chin@Sun.COM *pn = getppid();
718462SApril.Chin@Sun.COM else if (streq(s, "tid") || streq(s, "tty"))
728462SApril.Chin@Sun.COM {
738462SApril.Chin@Sun.COM for (fd = 0; fd < 3; fd++)
748462SApril.Chin@Sun.COM if ((tid = tcgetpgrp(fd)) >= 0)
758462SApril.Chin@Sun.COM break;
768462SApril.Chin@Sun.COM *pn = tid;
778462SApril.Chin@Sun.COM }
788462SApril.Chin@Sun.COM else if (streq(s, "sid"))
798462SApril.Chin@Sun.COM *pn = getsid(0);
808462SApril.Chin@Sun.COM else if (streq(s, "format"))
818462SApril.Chin@Sun.COM *ps = (char*)handle;
828462SApril.Chin@Sun.COM else
838462SApril.Chin@Sun.COM {
848462SApril.Chin@Sun.COM error(2, "%s: unknown format identifier", s);
858462SApril.Chin@Sun.COM return 0;
868462SApril.Chin@Sun.COM }
878462SApril.Chin@Sun.COM return 1;
888462SApril.Chin@Sun.COM }
898462SApril.Chin@Sun.COM
908462SApril.Chin@Sun.COM int
b_pids(int argc,char ** argv,void * context)918462SApril.Chin@Sun.COM b_pids(int argc, char** argv, void* context)
928462SApril.Chin@Sun.COM {
938462SApril.Chin@Sun.COM char* format = 0;
948462SApril.Chin@Sun.COM
958462SApril.Chin@Sun.COM cmdinit(argc, argv, context, ERROR_CATALOG, 0);
968462SApril.Chin@Sun.COM for (;;)
978462SApril.Chin@Sun.COM {
988462SApril.Chin@Sun.COM switch (optget(argv, usage))
998462SApril.Chin@Sun.COM {
1008462SApril.Chin@Sun.COM case 'f':
1018462SApril.Chin@Sun.COM format = opt_info.arg;
1028462SApril.Chin@Sun.COM continue;
1038462SApril.Chin@Sun.COM case '?':
1048462SApril.Chin@Sun.COM error(ERROR_USAGE|4, "%s", opt_info.arg);
1058462SApril.Chin@Sun.COM continue;
1068462SApril.Chin@Sun.COM case ':':
1078462SApril.Chin@Sun.COM error(2, "%s", opt_info.arg);
1088462SApril.Chin@Sun.COM continue;
1098462SApril.Chin@Sun.COM }
1108462SApril.Chin@Sun.COM break;
1118462SApril.Chin@Sun.COM }
1128462SApril.Chin@Sun.COM argv += opt_info.index;
1138462SApril.Chin@Sun.COM if (error_info.errors || *argv)
1148462SApril.Chin@Sun.COM error(ERROR_USAGE|4, "%s", optusage(NiL));
1158462SApril.Chin@Sun.COM if (!format)
1168462SApril.Chin@Sun.COM format = FORMAT;
1178462SApril.Chin@Sun.COM sfkeyprintf(sfstdout, format, format, key, NiL);
1188462SApril.Chin@Sun.COM sfprintf(sfstdout, "\n");
1198462SApril.Chin@Sun.COM return 0;
1208462SApril.Chin@Sun.COM }
121