summaryrefslogtreecommitdiffstats
path: root/lib/libprocstat
diff options
context:
space:
mode:
authortrociny <trociny@FreeBSD.org>2013-04-20 07:57:08 +0000
committertrociny <trociny@FreeBSD.org>2013-04-20 07:57:08 +0000
commit4ca5694006e8d330e2b4a960e40fa851768f4958 (patch)
tree0cecf502d9036f5b11e7fbc3f7e4455aac98fb0e /lib/libprocstat
parent44dc17713a425853bcdfa8815bd033794c69185d (diff)
downloadFreeBSD-src-4ca5694006e8d330e2b4a960e40fa851768f4958.zip
FreeBSD-src-4ca5694006e8d330e2b4a960e40fa851768f4958.tar.gz
Add procstat_getumask function to retrieve a process umask.
MFC after: 1 month
Diffstat (limited to 'lib/libprocstat')
-rw-r--r--lib/libprocstat/Symbol.map1
-rw-r--r--lib/libprocstat/core.c4
-rw-r--r--lib/libprocstat/core.h1
-rw-r--r--lib/libprocstat/libprocstat.315
-rw-r--r--lib/libprocstat/libprocstat.c57
-rw-r--r--lib/libprocstat/libprocstat.h2
6 files changed, 80 insertions, 0 deletions
diff --git a/lib/libprocstat/Symbol.map b/lib/libprocstat/Symbol.map
index 5ac5ee1..1970a7a 100644
--- a/lib/libprocstat/Symbol.map
+++ b/lib/libprocstat/Symbol.map
@@ -20,6 +20,7 @@ FBSD_1.3 {
procstat_freevmmap;
procstat_get_shm_info;
procstat_getgroups;
+ procstat_getumask;
procstat_getvmmap;
procstat_open_core;
};
diff --git a/lib/libprocstat/core.c b/lib/libprocstat/core.c
index afaa76c..5732f40 100644
--- a/lib/libprocstat/core.c
+++ b/lib/libprocstat/core.c
@@ -171,6 +171,10 @@ procstat_core_get(struct procstat_core *core, enum psc_type type, void *buf,
n_type = NT_PROCSTAT_GROUPS;
structsize = sizeof(gid_t);
break;
+ case PSC_TYPE_UMASK:
+ n_type = NT_PROCSTAT_UMASK;
+ structsize = sizeof(u_short);
+ break;
default:
warnx("unknown core stat type: %d", type);
return (NULL);
diff --git a/lib/libprocstat/core.h b/lib/libprocstat/core.h
index 54efa29..6e7ed02 100644
--- a/lib/libprocstat/core.h
+++ b/lib/libprocstat/core.h
@@ -34,6 +34,7 @@ enum psc_type {
PSC_TYPE_FILES,
PSC_TYPE_VMMAP,
PSC_TYPE_GROUPS,
+ PSC_TYPE_UMASK,
};
struct procstat_core;
diff --git a/lib/libprocstat/libprocstat.3 b/lib/libprocstat/libprocstat.3
index b38ce1c..06a66a0 100644
--- a/lib/libprocstat/libprocstat.3
+++ b/lib/libprocstat/libprocstat.3
@@ -35,6 +35,7 @@
.Nm procstat_getfiles ,
.Nm procstat_getgroups ,
.Nm procstat_getprocs ,
+.Nm procstat_getumask ,
.Nm procstat_getvmmap ,
.Nm procstat_freefiles ,
.Nm procstat_freegroups ,
@@ -126,6 +127,12 @@
.Fa "int arg"
.Fa "unsigned int *count"
.Fc
+.Ft "int"
+.Fo procstat_getumask
+.Fa "struct procstat *procstat"
+.Fa "struct kinfo_proc *kp"
+.Fa "unsigned short *maskp"
+.Fc
.Ft "struct kinfo_vmentry *"
.Fo procstat_getvmmap
.Fa "struct procstat *procstat"
@@ -254,6 +261,14 @@ The caller is responsible to free the allocated memory with a subsequent
function call.
.Pp
The
+.Fn procstat_getumask
+function gets a pointer to the
+.Vt procstat
+structure, a pointer to
+.Vt kinfo_proc
+structure, and returns the process umask in the 3rd reference parameter.
+.Pp
+The
.Fn procstat_getvmmap
function gets a pointer to the
.Vt procstat
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c
index b300b1f..1ee0f97 100644
--- a/lib/libprocstat/libprocstat.c
+++ b/lib/libprocstat/libprocstat.c
@@ -135,6 +135,9 @@ static int procstat_get_vnode_info_sysctl(struct filestat *fst,
static gid_t *procstat_getgroups_core(struct procstat_core *core,
unsigned int *count);
static gid_t *procstat_getgroups_sysctl(pid_t pid, unsigned int *count);
+static int procstat_getumask_core(struct procstat_core *core,
+ unsigned short *maskp);
+static int procstat_getumask_sysctl(pid_t pid, unsigned short *maskp);
static int vntype2psfsttype(int type);
void
@@ -1655,3 +1658,57 @@ procstat_freegroups(struct procstat *procstat __unused, gid_t *groups)
free(groups);
}
+
+static int
+procstat_getumask_sysctl(pid_t pid, unsigned short *maskp)
+{
+ int error;
+ int mib[4];
+ size_t len;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_UMASK;
+ mib[3] = pid;
+ len = sizeof(*maskp);
+ error = sysctl(mib, 4, maskp, &len, NULL, 0);
+ if (error != 0 && errno != ESRCH)
+ warn("sysctl: kern.proc.umask: %d", pid);
+ return (error);
+}
+
+static int
+procstat_getumask_core(struct procstat_core *core, unsigned short *maskp)
+{
+ size_t len;
+ unsigned short *buf;
+
+ buf = procstat_core_get(core, PSC_TYPE_UMASK, NULL, &len);
+ if (buf == NULL)
+ return (-1);
+ if (len < sizeof(*maskp)) {
+ free(buf);
+ return (-1);
+ }
+ *maskp = *buf;
+ free(buf);
+ return (0);
+}
+
+int
+procstat_getumask(struct procstat *procstat, struct kinfo_proc *kp,
+ unsigned short *maskp)
+{
+ switch(procstat->type) {
+ case PROCSTAT_KVM:
+ warnx("kvm method is not supported");
+ return (-1);
+ case PROCSTAT_SYSCTL:
+ return (procstat_getumask_sysctl(kp->ki_pid, maskp));
+ case PROCSTAT_CORE:
+ return (procstat_getumask_core(procstat->core, maskp));
+ default:
+ warnx("unknown access method: %d", procstat->type);
+ return (-1);
+ }
+}
diff --git a/lib/libprocstat/libprocstat.h b/lib/libprocstat/libprocstat.h
index 0c4e77a..8d14d0f 100644
--- a/lib/libprocstat/libprocstat.h
+++ b/lib/libprocstat/libprocstat.h
@@ -168,6 +168,8 @@ int procstat_get_vnode_info(struct procstat *procstat, struct filestat *fst,
struct vnstat *vn, char *errbuf);
gid_t *procstat_getgroups(struct procstat *procstat, struct kinfo_proc *kp,
unsigned int *count);
+int procstat_getumask(struct procstat *procstat, struct kinfo_proc *kp,
+ unsigned short* umask);
struct kinfo_vmentry *procstat_getvmmap(struct procstat *procstat,
struct kinfo_proc *kp, unsigned int *count);
struct procstat *procstat_open_core(const char *filename);
OpenPOWER on IntegriCloud