SCCS-vsn: usr.sbin/kgmon/kgmon.c 5.16
#endif /* not lint */
#ifndef lint
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)kgmon.c 5.15 (Berkeley) %G%";
+static char sccsid[] = "@(#)kgmon.c 5.16 (Berkeley) %G%";
#endif /* not lint */
#include <sys/param.h>
#include <sys/file.h>
#endif /* not lint */
#include <sys/param.h>
#include <sys/file.h>
#include <sys/gmon.h>
#include <errno.h>
#include <kvm.h>
#include <sys/gmon.h>
#include <errno.h>
#include <kvm.h>
setprof(int state)
{
struct gmonparam *p = (struct gmonparam *)nl[N_GMONPARAM].n_value;
setprof(int state)
{
struct gmonparam *p = (struct gmonparam *)nl[N_GMONPARAM].n_value;
-
- if (kvm_write(kd, (u_long)&p->state, (void *)&state, sizeof(state)) !=
- sizeof(state))
- (void)fprintf(stderr,
- "kgmon: warning: can't turn profiling %s\n",
- state == GMON_PROF_OFF ? "off" : "on");
+ int mib[3], sz;
+
+ sz = sizeof(state);
+ if (!kflag) {
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROF;
+ mib[2] = GPROF_STATE;
+ if (sysctl(mib, 3, NULL, NULL, &state, sz) >= 0)
+ return;
+ } else if (kvm_write(kd, (u_long)&p->state, (void *)&state, sz) == sz)
+ return;
+ (void)fprintf(stderr, "kgmon: warning: cannot turn profiling %s\n",
+ state == GMON_PROF_OFF ? "off" : "on");
#endif
if (system == NULL)
system = _PATH_UNIX;
#endif
if (system == NULL)
system = _PATH_UNIX;
- openmode = (bflag || hflag || pflag || rflag) ? O_RDWR : O_RDONLY;
+ if (!kflag)
+ openmode = rflag ? O_RDWR : O_RDONLY;
+ else
+ openmode =
+ (bflag || hflag || pflag || rflag) ? O_RDWR : O_RDONLY;
kd = kvm_openfiles(system, kmemf, NULL, openmode, errbuf);
if (kd == NULL) {
if (openmode == O_RDWR) {
kd = kvm_openfiles(system, kmemf, NULL, openmode, errbuf);
if (kd == NULL) {
if (openmode == O_RDWR) {
(void)fprintf(stderr, "kgmon: kernel opened read-only\n");
if (rflag)
(void)fprintf(stderr, "-r supressed\n");
(void)fprintf(stderr, "kgmon: kernel opened read-only\n");
if (rflag)
(void)fprintf(stderr, "-r supressed\n");
- if (bflag)
- (void)fprintf(stderr, "-b supressed\n");
- if (hflag)
- (void)fprintf(stderr, "-h supressed\n");
- rflag = bflag = hflag = 0;
}
if (kvm_nlist(kd, nl) < 0) {
(void)fprintf(stderr, "kgmon: %s: no namelist\n", system);
}
if (kvm_nlist(kd, nl) < 0) {
(void)fprintf(stderr, "kgmon: %s: no namelist\n", system);
else
disp = mode;
if (pflag) {
else
disp = mode;
if (pflag) {
- if (openmode == O_RDONLY && mode == GMON_PROF_ON)
+ if (kflag && openmode == O_RDONLY && mode == GMON_PROF_ON)
(void)fprintf(stderr, "data may be inconsistent\n");
dumpstate(&gmonparam);
}
if (rflag)
reset(&gmonparam);
(void)fprintf(stderr, "data may be inconsistent\n");
dumpstate(&gmonparam);
}
if (rflag)
reset(&gmonparam);
- if (openmode == O_RDWR)
+ if (!kflag || openmode == O_RDWR)
setprof(disp);
(void)fprintf(stdout, "kernel profiling is %s.\n",
disp == GMON_PROF_OFF ? "off" : "running");
setprof(disp);
(void)fprintf(stdout, "kernel profiling is %s.\n",
disp == GMON_PROF_OFF ? "off" : "running");