2008-01-28 21:37:16 +00:00
|
|
|
/* source: procan.c */
|
2016-07-22 06:54:31 +00:00
|
|
|
/* Copyright Gerhard Rieger and contributors (see file CHANGES) */
|
2008-01-27 12:00:08 +00:00
|
|
|
/* Published under the GNU General Public License V.2, see file COPYING */
|
|
|
|
|
|
|
|
/* the subroutine procan makes a "PROCess ANalysis". It gathers information
|
|
|
|
about the process environment it is running in without modifying its state
|
|
|
|
(almost).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "xiosysincludes.h"
|
|
|
|
#include "mytypes.h"
|
|
|
|
#include "compat.h"
|
|
|
|
#include "error.h"
|
|
|
|
#include "sycls.h"
|
|
|
|
#include "sysutils.h"
|
2023-07-21 05:10:38 +00:00
|
|
|
#include "sched.h"
|
2008-01-27 12:00:08 +00:00
|
|
|
#include "filan.h"
|
|
|
|
|
|
|
|
#include <sys/resource.h>
|
|
|
|
|
|
|
|
#include "procan.h"
|
|
|
|
|
|
|
|
|
|
|
|
int procan(FILE *outfile) {
|
|
|
|
|
|
|
|
/*filan(0, outfile);*/
|
|
|
|
|
|
|
|
/* controlling terminal */
|
|
|
|
fprintf(outfile, "process id = "F_pid"\n", Getpid());
|
|
|
|
fprintf(outfile, "process parent id = "F_pid"\n", Getppid());
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
if ((fd = Open("/dev/tty", O_NOCTTY, 0)) < 0) {
|
|
|
|
fprintf(outfile, "controlling terminal: -\n");
|
|
|
|
} else {
|
|
|
|
#if 1
|
|
|
|
fprintf(outfile, "controlling terminal: \"%s\"\n", Ttyname(fd));
|
|
|
|
#else
|
|
|
|
char procpath[PATH_MAX], devpath[PATH_MAX+1];
|
|
|
|
int devlen;
|
|
|
|
sprintf(procpath, "/proc/"F_pid"/fd/%d", Getpid(), 0 /*! fd*/);
|
|
|
|
if ((devlen = Readlink(procpath, devpath, sizeof(devpath))) < 0) {
|
|
|
|
;
|
|
|
|
} else {
|
|
|
|
devpath[devlen] = '\0';
|
|
|
|
fprintf(outfile, "controlling terminal: \"%s\"\n", devpath);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(outfile, "process group id = "F_pid"\n", Getpgrp());
|
|
|
|
#if HAVE_GETSID
|
|
|
|
fprintf(outfile, "process session id = "F_pid"\n", Getsid(0));
|
|
|
|
#endif
|
|
|
|
fprintf(outfile, "process group id if fg process / stdin = "F_pid"\n", Tcgetpgrp(0));
|
|
|
|
fprintf(outfile, "process group id if fg process / stdout = "F_pid"\n", Tcgetpgrp(1));
|
|
|
|
fprintf(outfile, "process group id if fg process / stderr = "F_pid"\n", Tcgetpgrp(2));
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
if ((fd = Open("/dev/tty", O_RDWR, 0600)) >= 0) {
|
|
|
|
fprintf(outfile, "process has a controlling terminal\n");
|
|
|
|
Close(fd);
|
|
|
|
} else {
|
|
|
|
fprintf(outfile, "process does not have a controlling terminal\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* process owner, groups */
|
|
|
|
fprintf(outfile, "user id = "F_uid"\n", Getuid());
|
|
|
|
fprintf(outfile, "effective user id = "F_uid"\n", Geteuid());
|
|
|
|
fprintf(outfile, "group id = "F_gid"\n", Getgid());
|
|
|
|
fprintf(outfile, "effective group id = "F_gid"\n", Getegid());
|
|
|
|
|
2023-11-11 16:40:52 +00:00
|
|
|
/* Simple process features */
|
|
|
|
fprintf(outfile, "\n");
|
|
|
|
{
|
|
|
|
mode_t mask;
|
|
|
|
#if LATER
|
|
|
|
char procpath[PATH_MAX];
|
|
|
|
sprintf(procpath, "/proc/"F_pid"/status", Getpid());
|
|
|
|
if (Stat()) {
|
|
|
|
|
|
|
|
} else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
mask = Umask(0066);
|
|
|
|
Umask(mask);
|
|
|
|
}
|
|
|
|
fprintf(outfile, "umask = "F_mode"\n", mask);
|
|
|
|
}
|
|
|
|
|
2008-01-27 12:00:08 +00:00
|
|
|
{
|
|
|
|
struct rlimit rlim;
|
|
|
|
|
2023-11-11 16:40:52 +00:00
|
|
|
fprintf(outfile, "\n/* Resource limits */\n");
|
2014-02-03 10:04:09 +00:00
|
|
|
fprintf(outfile, "resource current maximum\n");
|
2008-01-27 12:00:08 +00:00
|
|
|
if (getrlimit(RLIMIT_CPU, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_CPU, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"cpu time (seconds) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
if (getrlimit(RLIMIT_FSIZE, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_FSIZE, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"file size (blocks) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
if (getrlimit(RLIMIT_DATA, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_DATA, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"data seg size (kbytes) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
if (getrlimit(RLIMIT_STACK, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_STACK, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"stack size (blocks) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
if (getrlimit(RLIMIT_CORE, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_CORE, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"core file size (blocks) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
#ifdef RLIMIT_RSS /* Linux, AIX; not Cygwin */
|
|
|
|
if (getrlimit(RLIMIT_RSS, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_RSS, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"max resident set size %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef RLIMIT_NPROC /* Linux, not AIX, Cygwin */
|
|
|
|
if (getrlimit(RLIMIT_NPROC, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_NPROC, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"max user processes %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef RLIMIT_NOFILE /* not AIX 4.1 */
|
|
|
|
if (getrlimit(RLIMIT_NOFILE, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_NOFILE, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"open files %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef RLIMIT_MEMLOCK /* Linux, not AIX, Cygwin */
|
|
|
|
if (getrlimit(RLIMIT_MEMLOCK, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_MEMLOCK, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"max locked-in-memory\n address space %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef RLIMIT_AS
|
|
|
|
if (getrlimit(RLIMIT_AS, &rlim) < 0) {
|
|
|
|
Warn2("getrlimit(RLIMIT_AS, %p): %s", &rlim, strerror(errno));
|
|
|
|
} else {
|
|
|
|
fprintf(outfile,
|
2014-02-03 10:04:09 +00:00
|
|
|
"virtual memory (kbytes) %24"F_rlim_max"%24"F_rlim_max"\n",
|
2008-01-27 12:00:08 +00:00
|
|
|
rlim.rlim_cur, rlim.rlim_max);
|
|
|
|
}
|
2020-10-13 18:08:04 +00:00
|
|
|
#endif
|
2023-11-11 16:40:52 +00:00
|
|
|
fputc('\n', outfile);
|
|
|
|
|
2023-10-03 19:02:13 +00:00
|
|
|
}
|
|
|
|
|
2023-11-11 16:40:52 +00:00
|
|
|
#ifdef CC
|
|
|
|
fprintf(outfile, "// CC: "CC"\n");
|
|
|
|
#endif
|
|
|
|
#ifdef __STDC_VERSION__
|
|
|
|
fprintf(outfile, "#define __STDC_VERSION__ %ld\n", __STDC_VERSION__);
|
|
|
|
#endif
|
2020-10-13 18:08:04 +00:00
|
|
|
#ifdef SIZE_MAX
|
2023-11-11 16:40:52 +00:00
|
|
|
fprintf(outfile, "SIZE_MAX = "F_Zu" /* maximum value of size_t */\n", SIZE_MAX);
|
2023-10-03 19:02:13 +00:00
|
|
|
#endif
|
|
|
|
#ifdef P_tmpdir
|
|
|
|
fprintf(outfile, "P_tmpdir = \"%s\"\n", P_tmpdir);
|
|
|
|
#endif
|
|
|
|
#ifdef L_tmpnam
|
|
|
|
fprintf(outfile, "L_tmpnam = %u\n", L_tmpnam);
|
|
|
|
#endif
|
|
|
|
#ifdef TMP_MAX
|
|
|
|
fprintf(outfile, "TMP_MAX = %d\n", TMP_MAX);
|
2023-10-26 16:42:41 +00:00
|
|
|
#endif
|
2023-11-11 16:40:52 +00:00
|
|
|
#ifdef FD_SETSIZE
|
|
|
|
fprintf(outfile, "FD_SETSIZE = %d /* maximum number of FDs for select() */\n", FD_SETSIZE);
|
|
|
|
#endif
|
2023-10-26 16:42:41 +00:00
|
|
|
#ifdef PIPE_BUF
|
2023-10-03 19:02:13 +00:00
|
|
|
fprintf(outfile, "PIPE_BUF = %-24d\n", PIPE_BUF);
|
2008-01-27 12:00:08 +00:00
|
|
|
#endif
|
|
|
|
|
2023-07-21 05:10:38 +00:00
|
|
|
/* Name spaces */
|
|
|
|
{
|
|
|
|
char path[PATH_MAX];
|
|
|
|
char link[PATH_MAX];
|
|
|
|
snprintf(path, sizeof(path)-1, "/proc/"F_pid"/ns/net", getpid());
|
|
|
|
if (readlink(path, link, sizeof(link)-1) >= 0) {
|
|
|
|
fprintf(outfile, "Network namespace: %s", link);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-27 12:00:08 +00:00
|
|
|
/* file descriptors */
|
|
|
|
|
|
|
|
/* what was this for?? */
|
|
|
|
/*Sleep(1);*/
|
|
|
|
return 0;
|
|
|
|
}
|