xref: /onnv-gate/usr/src/lib/libcmd/common/pids.c (revision 12068:08a39a083754)
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