diff options
Diffstat (limited to 'src/procenv.h')
-rw-r--r-- | src/procenv.h | 513 |
1 files changed, 513 insertions, 0 deletions
diff --git a/src/procenv.h b/src/procenv.h new file mode 100644 index 0000000..c6d8c74 --- /dev/null +++ b/src/procenv.h @@ -0,0 +1,513 @@ +#ifndef PROCENV_H +#define PROCENV_H + +/* for dl_iterate_phdr(3) */ +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif /* HAVE_CONFIG_H */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <syslog.h> +#include <stdarg.h> +#include <stddef.h> +#include <stdint.h> +#include <float.h> +#include <wchar.h> +#include <unistd.h> +#include <limits.h> +#include <libgen.h> +#include <time.h> +#include <signal.h> +#include <ctype.h> +#include <errno.h> +#include <paths.h> +#include <dirent.h> +#include <pwd.h> +#include <grp.h> +#include <sched.h> +#include <termios.h> +#include <getopt.h> +#include <assert.h> +#include <sys/types.h> +#include <inttypes.h> +#include <sys/ioctl.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <link.h> +#include <fenv.h> +#include <sys/utsname.h> +#include <locale.h> +#include <pthread.h> + +#if defined (__FreeBSD__) \ + || defined (__NetBSD__) \ + || defined (__OpenBSD__) +#define PROCENV_BSD +#endif + +#ifdef __linux__ +#define PROCENV_LINUX +#endif + +#ifdef __GNU__ +#define PROCENV_HURD +#endif + +#if defined (__i386__) || defined (__x86_64__) +#define PROCENV_ARCH_X86 +#endif + +#if defined (PROCENV_LINUX) +#include <mntent.h> +#include <execinfo.h> +#include <sys/inotify.h> +#include <sys/prctl.h> + +#include <linux/prctl.h> +#include <linux/version.h> + +/* Lucid provides prctl.h, but not securebits.h */ +#if defined (PR_GET_SECUREBITS) && defined (HAVE_LINUX_SECUREBITS_H) +#include <linux/securebits.h> +#endif + +#include <linux/capability.h> +#include <linux/vt.h> +#ifdef HAVE_APPARMOR +#include <sys/apparmor.h> +#endif +#ifdef HAVE_SELINUX +#include <selinux/selinux.h> +#endif + +/** + * show_capability: + * @cap: capability. + * + * Display specified capability, or NOT_DEFINED_STR if value is + * unknown. + **/ +#ifdef PR_CAPBSET_READ +#define show_capability(cap) \ +{ \ + ret = prctl (PR_CAPBSET_READ, cap, 0, 0, 0); \ + \ + show (#cap "=%s", ret < 0 \ + ? NOT_DEFINED_STR \ + : ret \ + ? YES_STR \ + : NO_STR); \ +} +#else +#define show_capability(cap) +#endif + +/** + * LINUX_KERNEL_M: + * @major: Linux major kernel version number. + * + * Returns: TRUE if running Linux kernel is atleast at version + * specified by @major else FALSE. + **/ +#define LINUX_KERNEL_M(major) \ + (linux_kernel_version (major, -1, -1)) + +/** + * LINUX_KERNEL_MM: + * @major: Linux major kernel version number, + * @minor: Linux minor kernel version number. + * + * Returns: TRUE if running Linux kernel is atleast at version + * specified by (@major, @minor) else FALSE. + **/ +#define LINUX_KERNEL_MM(major, minor) \ + (linux_kernel_version (major, minor, -1)) + +/** + * LINUX_KERNEL_MMR: + * @major: Linux major kernel version number, + * @minor: Linux minor kernel version number, + * @revision: kernel revision version. + * + * Returns: TRUE if running Linux kernel is atleast at version + * specified by (@major, @minor, @revision) else FALSE. + **/ +#define LINUX_KERNEL_MMR(major, minor, revision) \ + (linux_kernel_version (major, minor, revision)) + +#endif + +#include <sys/ioctl.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/resource.h> + +#if defined (PROCENV_BSD) || defined (__FreeBSD_kernel__) +#include <kvm.h> +#include <sys/sysctl.h> +#include <sys/user.h> +#include <sys/ucred.h> +#endif + +#if defined (PROCENV_BSD) || defined (__FreeBSD_kernel__) +#include <sys/mount.h> +#endif + +/* Horrid hack for Hurd... :-( */ +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + +#define PROCENV_OUTPUT_ENV "PROCENV_OUTPUT" +#define PROCENV_FILE_ENV "PROCENV_FILE" +#define PROCENV_EXEC_ENV "PROCENV_EXEC" + +#define PROCENV_BUFFER 1024 +#define MOUNTS "/proc/mounts" + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE (!TRUE) +#endif + +/* FIXME: gettext */ +#define _(str) str + +#define YES_STR _("yes") +#define NO_STR _("no") +#define NON_STR _("non") +#define NA_STR _("n/a") +#define UNKNOWN_STR _("unknown") +#define MAX_STR _(" (max)") +#define DEFINED_STR _("defined") +#define NOT_DEFINED_STR _("not defined") +#define BIG_STR _("big") +#define LITTLE_STR _("little") +#define PRIVILEGED_STR _("privileged") + +#if defined (PROCENV_BSD) + /* SIGTHL is hidden by default */ +#define NUM_SIGNALS 31 +#else +#define NUM_SIGNALS 32 +#endif + +/* If an indent is required, use this many spaces */ +#define INDENT 2 + +#define PROGRAM_AUTHORS "James Hunt <james.hunt@ubuntu.com>" + +#define show(...) _show ("", indent, __VA_ARGS__) +#define showi(_indent, ...) _show ("", indent+_indent, __VA_ARGS__) + +#define warn(...) \ +{ \ + _show ("WARNING", 0, __VA_ARGS__); \ +} + +#define die(...) \ +{ \ + _show ("ERROR", 0, __VA_ARGS__); \ + exit (EXIT_FAILURE); \ +} + +#define type_hex_width(type) \ + (sizeof (type) * 2) + +#define get_group_name(gid) \ +({struct group *g = getgrgid (gid); \ + g ? g->gr_name : NULL;}) + +#define get_user_name(uid) \ +({struct passwd *p = getpwuid (uid); \ + p ? p->pw_name : NULL;}) + +#define show_clock_res(clock) \ +{ \ + struct timespec res; \ + if (clock_getres (clock, &res) < 0) \ + show ("%s: resolution: %s", #clock, UNKNOWN_STR); \ + else \ + show ("%s: resolution: %ld.%09lds", #clock, res.tv_sec, res.tv_nsec); \ +} + +#define show_const(t, flag, constant) \ + show ("%s:%s=%d", #flag, #constant, !!(t.flag & constant)) + +/** + * Show a terminal special characters attribute. + * + * t: struct termios, + * elem: element of c_cc array, + * lock_status: struct termios representing lock status of @t. + **/ +#define show_cc_tty(t, elem, lock_status) \ + show (" c_cc[%s]:0x%x%s", \ + #elem, \ + t.c_cc[elem], \ + lock_status.c_cc[elem] ? " (locked)" : ""); + +/** + * Show a terminal attribute constant value. + * + * t: struct termios, + * flag: name of attribute, + * constant: value of @flag, + * lock_status: struct termios representing lock status of @t. + **/ +#define show_const_tty(t, flag, constant, lock_status) \ + show ("%s:%s=%d%s", \ + #flag, \ + #constant, \ + !!(t.flag & constant), \ + !!(lock_status.flag) ? " (locked)" : "") + +#define show_pathconf(what, path, name) \ +{ \ + long conf; \ + errno = 0; \ + conf = pathconf (path, name); \ + if (conf == -1 && errno == 0) { \ + die ("unable to query pathconf value for '%s'", #name); \ + } \ + showi ((what == SHOW_ALL ? (indent * 2) : INDENT), "%s=%d", #name, conf); \ +} + +#define SPEED(s) \ + {s, #s } + +#define mk_map_entry(s) \ + {s, #s } + +#define show_confstr(s) \ +{ \ + size_t len; \ + char *buffer; \ + \ + errno = 0; \ + len = confstr(s, NULL, 0); \ + assert (len && errno == 0); \ + \ + buffer = calloc (1, len); \ + if (! buffer) { \ + die ("failed to allocate space for confstr"); \ + } \ + assert (confstr (s, buffer, len) == len); \ + show ("%s: '%s'", #s, buffer); \ + free (buffer); \ +} + +#define is_limit_max(l) \ + ((unsigned long int)l == ((unsigned long int)-1) ? MAX_STR : "") + +#define show_limit(limit) \ +{ \ + struct rlimit tmp; \ + if (getrlimit (limit, &tmp) < 0) { \ + die ("failed to query rlimit '%s'", #limit); \ + } \ + show (#limit " (soft=%lu%s, hard=%lu%s)", \ + (unsigned long int)tmp.rlim_cur, \ + is_limit_max (tmp.rlim_cur), \ + (unsigned long int)tmp.rlim_max, \ + is_limit_max (tmp.rlim_max)); \ +} + +#define show_usage(rusage, name) \ + show ("%s=%lu", #name, rusage.name) + +#define get_sysconf(s) \ + sysconf (s) + +#define show_sysconf(s) \ +{ \ + long value = get_sysconf (s); \ + show (#s "=%ld", value); \ +} + +#define mk_posix_sysconf_map_entry(name) \ + {_SC_ ## name, #name "(_SC_" #name ")" } + +#define mk_posixopt_sysconf_map_entry(name) \ + {_SC_ ## name, "_POSIX_" #name "(_SC_" #name ")" } + +#define mk_sysconf_map_entry(name) \ + {name, #name } + +typedef char bool; + +typedef enum { + SHOW_ALL, + SHOW_MOUNTS, + SHOW_PATHCONF +} ShowMountType; + +struct procenv_map { + int num; + char *name; +}; + +typedef enum procenv_output { + OUTPUT_FILE, + OUTPUT_STDERR, + OUTPUT_STDOUT, + OUTPUT_SYSLOG, + OUTPUT_TERM +} Output; + +struct baud_speed +{ + speed_t speed; + char *name; +}; + +struct procenv_user { + pid_t pid; + pid_t ppid; + pid_t sid; + +#if defined (PROCENV_LINUX) || defined (PROCENV_HURD) + char proc_name[16]; +#endif +#if defined (PROCENV_BSD) || defined (__FreeBSD_kernel__) + char proc_name[COMMLEN+1]; +#endif + + pid_t pgroup; + pid_t fg_pgroup; + pid_t pgid_sid; + char ctrl_terminal[L_ctermid]; + int tty_fd; + + uid_t uid; + uid_t euid; + uid_t suid; + + char *login; + + gid_t gid; + gid_t egid; + gid_t sgid; + + struct passwd passwd; +}; + +struct procenv_misc { + char cwd[PATH_MAX]; + char root[PATH_MAX]; + mode_t umask_value; + int cpu; +#if defined (PROCENV_BSD) || defined (__FreeBSD_kernel__) + int in_jail; +#endif +}; + +struct procenv_priority { + int process; + int pgrp; + int user; +}; + +void _show (const char *prefix, int indent, const char *fmt, ...); + +void init (void); +void cleanup (void); +bool in_chroot (void); +const char *container_type (void); +bool is_process_group_leader (void); +bool is_session_leader (void); +void assert_cwd (void); +void assert_chroot (void); +void assert_user (void); +void dump_options (void); +void dump_user (void); +void dump_misc (void); +void show_env (void); +void show_rlimits (void); +void show_rusage (void); +void dump_sysconf (void); +void show_confstrs (void); +void dump_priorities (void); +void show_mounts (ShowMountType what); +void get_user_info (void); +void get_priorities (void); +void get_config (void); +void get_config_from_env (void); +void check_config (void); +void show_proc_branch (void); +void show_tty_attrs (void); +const char * get_speed (speed_t speed); +const char * get_signal_name (int signum); +void dump_meta (void); +char *get_os (void); +char *get_arch (void); +void dump_platform (void); +int libs_callback (struct dl_phdr_info *info, size_t size, void *data); +void show_libs (void); +int get_indent (void); +void show_clocks (void); +void show_timezone (void); +void show_time (void); +void show_signals (void); +void show_pathconfs (ShowMountType what, const char *dir); +void show_sizeof (void); +void show_ranges (void); +void show_compiler (void); +void get_uname (void); +void dump_uname (void); +void show_all_groups (void); +int is_console (int fd); +long get_kernel_bits (void); +bool has_ctty (void); +void show_cpu (void); +void show_threads (void); +void append (char **str, const char *new); +void appendf (char **str, const char *fmt, ...); +void appendva (char **str, const char *fmt, va_list ap); +void check_envvars (void); +int get_output_value (const char *name); +void set_indent (void); +void show_stat (void); +void show_locale (void); +void get_major_minor (const char *path, int *major, int *minor); +bool uid_match (uid_t uid); +char * get_path (const char *argv0); +bool is_big_endian (void); +char * get_thread_scheduler_name (int sched); +int qsort_compar (const void *a, const void *b); +void show_data_model (void); + +#if defined (PROCENV_LINUX) +void get_root (char *root, size_t len); +void get_tty_locked_status (struct termios *lock_status); +void dump_linux_proc_fds (void); +void show_linux_cgroups (void); +void show_oom (void); +void show_capabilities (void); +void show_linux_security_module (void); +void show_linux_security_module_context (void); +void show_linux_mounts (ShowMountType what); +void show_linux_proc_branch (void); +void show_linux_prctl (void); +void show_linux_cpu (void); +char * get_scheduler_name (int sched); +void show_linux_scheduler (void); +bool linux_kernel_version (int major, int minor, int revision); +#endif /* PROCENV_LINUX */ + +#if defined (PROCENV_BSD) || defined (__FreeBSD_kernel__) +char * get_bsd_mount_opts (uint64_t flags); +void show_bsd_mounts (ShowMountType what); +void get_bsd_misc (void); +void show_bsd_proc_branch (void); +void show_bsd_cpu (void); +#endif /* PROCENV_BSD + __FreeBSD_kernel__ */ + +#endif /* PROCENV_H */ |