Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/fs/procfs/procfs_status.c
39536 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1993 Jan-Simon Pendry
5
* Copyright (c) 1993
6
* The Regents of the University of California. All rights reserved.
7
*
8
* This code is derived from software contributed to Berkeley by
9
* Jan-Simon Pendry.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. Neither the name of the University nor the names of its contributors
20
* may be used to endorse or promote products derived from this software
21
* without specific prior written permission.
22
*
23
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33
* SUCH DAMAGE.
34
*
35
* From:
36
* $Id: procfs_status.c,v 3.1 1993/12/15 09:40:17 jsp Exp $
37
*/
38
39
#include <sys/param.h>
40
#include <sys/kernel.h>
41
#include <sys/systm.h>
42
#include <sys/exec.h>
43
#include <sys/lock.h>
44
#include <sys/mutex.h>
45
#include <sys/jail.h>
46
#include <sys/malloc.h>
47
#include <sys/mutex.h>
48
#include <sys/sx.h>
49
#include <sys/proc.h>
50
#include <sys/resourcevar.h>
51
#include <sys/sbuf.h>
52
#include <sys/tty.h>
53
54
#include <vm/vm.h>
55
#include <vm/pmap.h>
56
#include <vm/vm_param.h>
57
58
#include <fs/pseudofs/pseudofs.h>
59
#include <fs/procfs/procfs.h>
60
61
int
62
procfs_doprocstatus(PFS_FILL_ARGS)
63
{
64
struct timeval start, ut, st;
65
struct session *sess;
66
struct thread *tdfirst;
67
struct tty *tp;
68
struct ucred *cr;
69
const char *wmesg;
70
char *pc;
71
char *sep;
72
struct timeval boottime;
73
int pid, ppid, pgid, sid;
74
int i;
75
76
pid = p->p_pid;
77
PROC_LOCK(p);
78
ppid = p->p_pptr ? p->p_pptr->p_pid : 0;
79
pgid = p->p_pgrp->pg_id;
80
sess = p->p_pgrp->pg_session;
81
SESS_LOCK(sess);
82
sid = sess->s_leader ? sess->s_leader->p_pid : 0;
83
84
/* comm pid ppid pgid sid tty ctty,sldr start ut st wmsg
85
euid ruid rgid,egid,groups[1 .. ngroups]
86
*/
87
88
pc = p->p_comm;
89
do {
90
if (*pc < 33 || *pc > 126 || *pc == '\\')
91
sbuf_printf(sb, "\\%03o", *pc);
92
else
93
sbuf_putc(sb, *pc);
94
} while (*++pc);
95
sbuf_printf(sb, " %d %d %d %d ", pid, ppid, pgid, sid);
96
if ((p->p_flag & P_CONTROLT) && (tp = sess->s_ttyp))
97
sbuf_printf(sb, "%s ", devtoname(tp->t_dev));
98
else
99
sbuf_printf(sb, "- ");
100
101
sep = "";
102
if (sess->s_ttyvp) {
103
sbuf_printf(sb, "%sctty", sep);
104
sep = ",";
105
}
106
if (SESS_LEADER(p)) {
107
sbuf_printf(sb, "%ssldr", sep);
108
sep = ",";
109
}
110
SESS_UNLOCK(sess);
111
if (*sep != ',') {
112
sbuf_printf(sb, "noflags");
113
}
114
115
tdfirst = FIRST_THREAD_IN_PROC(p);
116
thread_lock(tdfirst);
117
if (tdfirst->td_wchan != NULL) {
118
KASSERT(tdfirst->td_wmesg != NULL,
119
("wchan %p has no wmesg", tdfirst->td_wchan));
120
wmesg = tdfirst->td_wmesg;
121
} else
122
wmesg = "nochan";
123
thread_unlock(tdfirst);
124
125
PROC_STATLOCK(p);
126
calcru(p, &ut, &st);
127
PROC_STATUNLOCK(p);
128
start = p->p_stats->p_start;
129
getboottime(&boottime);
130
timevaladd(&start, &boottime);
131
sbuf_printf(sb, " %jd,%ld %jd,%ld %jd,%ld",
132
(intmax_t)start.tv_sec, start.tv_usec,
133
(intmax_t)ut.tv_sec, ut.tv_usec,
134
(intmax_t)st.tv_sec, st.tv_usec);
135
136
sbuf_printf(sb, " %s", wmesg);
137
138
cr = p->p_ucred;
139
140
sbuf_printf(sb, " %lu %lu %lu",
141
(u_long)cr->cr_uid,
142
(u_long)cr->cr_ruid,
143
(u_long)cr->cr_rgid);
144
sbuf_printf(sb, ",%lu", (u_long)cr->cr_gid);
145
for (i = 0; i < cr->cr_ngroups; i++)
146
sbuf_printf(sb, ",%lu", (u_long)cr->cr_groups[i]);
147
148
if (jailed(cr)) {
149
mtx_lock(&cr->cr_prison->pr_mtx);
150
sbuf_printf(sb, " %s",
151
prison_name(td->td_ucred->cr_prison, cr->cr_prison));
152
mtx_unlock(&cr->cr_prison->pr_mtx);
153
} else {
154
sbuf_printf(sb, " -");
155
}
156
PROC_UNLOCK(p);
157
sbuf_printf(sb, "\n");
158
159
return (0);
160
}
161
162
int
163
procfs_doproccmdline(PFS_FILL_ARGS)
164
{
165
166
/*
167
* If we are using the ps/cmdline caching, use that. Otherwise
168
* read argv from the process space.
169
* Note that if the argv is no longer available, we deliberately
170
* don't fall back on p->p_comm or return an error: the authentic
171
* Linux behaviour is to return zero-length in this case.
172
*/
173
174
PROC_LOCK(p);
175
if (p->p_args && p_cansee(td, p) == 0) {
176
sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
177
PROC_UNLOCK(p);
178
return (0);
179
}
180
181
if ((p->p_flag & P_SYSTEM) != 0) {
182
PROC_UNLOCK(p);
183
return (0);
184
}
185
186
PROC_UNLOCK(p);
187
188
return (proc_getargv(td, p, sb));
189
}
190
191