📄 utils.c
字号:
/* $Id: utils.c,v 1.3 2003/10/20 15:19:46 hadess Exp $ *//* Copyright (C) 1998-99 Martin Baulig This file is part of LibGTop 1.0. Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. LibGTop is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. LibGTop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with LibGTop; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/#include <nlist.h>#include <procinfo.h>#include <sys/proc.h>#include <sys/vminfo.h>#include <glibtop.h>#include <glibtop/error.h>#include "glibtop_suid.h"#include "utils.h"#ifndef HAVE_VMGETINFO#include <dlfcn.h>typedef int (*vmgetinfo_proto)(void *out, int command, int arg);#endifoff_t_glibtop_get_kmem_offset(glibtop* server, char* kname){ int result; struct nlist kernelnames[] = { {NULL, 0, 0, 0, 0, 0}, {NULL, 0, 0, 0, 0, 0}, }; kernelnames[0]._n._n_name = kname; glibtop_suid_enter(server); result = knlist(kernelnames, 1, sizeof(struct nlist)); glibtop_suid_leave(server); if (result == -1) { return -1; } return kernelnames[0].n_value;}int_glibtop_get_kmem_info(glibtop* server, off_t offset, void* buf, size_t len){ int result; glibtop_suid_enter(server); lseek(server->machine.kmem_fd, offset, SEEK_SET); result = read(server->machine.kmem_fd, buf, len); glibtop_suid_leave(server); return result;}struct procsinfo*_glibtop_get_procinfo (glibtop *server, pid_t pid){ int result; pid_t current; static int first_time = 1; /* test if procsinfo already found */ if ((server->machine.last_pinfo.pi_pid == pid) && (!first_time)) { return &server->machine.last_pinfo; } /* seek procsinfo if given pid */ first_time = 0; current = 0; while ((result = getprocs( &server->machine.last_pinfo , sizeof(struct procsinfo) , NULL, 0, ¤t, 1)) == 1) { if (pid == server->machine.last_pinfo.pi_pid) { return &server->machine.last_pinfo; } } return NULL;}#ifndef HAVE_VMGETINFOint_glibtop_vmgetinfo (void *out, int command, int arg){ void* handle; static vmgetinfo_proto kern_vmgetinfo = NULL; if (kern_vmgetinfo == NULL) { handle = dlopen("/unix", RTLD_NOW | RTLD_GLOBAL); if (handle == NULL) { return -1; } kern_vmgetinfo = dlsym( handle, "vmgetinfo"); dlclose(handle); if (kern_vmgetinfo == NULL) { return -1; } } return kern_vmgetinfo(out, command, arg);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -