svn commit: r196015 - projects/libprocstat/usr.bin/fstat
Stanislav Sedov
stas at FreeBSD.org
Sat Aug 1 12:51:17 UTC 2009
Author: stas
Date: Sat Aug 1 12:51:16 2009
New Revision: 196015
URL: http://svn.freebsd.org/changeset/base/196015
Log:
- Fix resource deallocation routines.
Modified:
projects/libprocstat/usr.bin/fstat/fstat.c
projects/libprocstat/usr.bin/fstat/fuser.c
projects/libprocstat/usr.bin/fstat/libprocstat.c
projects/libprocstat/usr.bin/fstat/libprocstat.h
Modified: projects/libprocstat/usr.bin/fstat/fstat.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/fstat.c Sat Aug 1 12:50:07 2009 (r196014)
+++ projects/libprocstat/usr.bin/fstat/fstat.c Sat Aug 1 12:51:16 2009 (r196015)
@@ -71,8 +71,8 @@ int vflg; /* be verbose */
typedef struct devs {
struct devs *next;
- long fsid;
- long ino;
+ uint32_t fsid;
+ uint64_t ino;
const char *name;
} DEVS;
@@ -194,7 +194,6 @@ do_fstat(int argc, char **argv)
continue;
dofiles(procstat, &p[i]);
}
- free(p);
procstat_freeprocs(procstat, p);
procstat_close(procstat);
return (0);
@@ -452,7 +451,7 @@ print_vnode_info(struct procstat *procst
else {
strmode(vn.vn_mode, mode);
}
- (void)printf(" %6ld %10s", vn.vn_fileid, mode);
+ (void)printf(" %6lld %10s", vn.vn_fileid, mode);
if (vn.vn_type == PS_FST_VTYPE_VBLK || vn.vn_type == PS_FST_VTYPE_VCHR) {
if (nflg || !*vn.vn_devname)
@@ -461,7 +460,7 @@ print_vnode_info(struct procstat *procst
printf(" %6s", vn.vn_devname);
}
} else
- printf(" %6lu", vn.vn_size);
+ printf(" %6llu", vn.vn_size);
print_access_flags(fst->fs_fflags);
}
Modified: projects/libprocstat/usr.bin/fstat/fuser.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/fuser.c Sat Aug 1 12:50:07 2009 (r196014)
+++ projects/libprocstat/usr.bin/fstat/fuser.c Sat Aug 1 12:51:16 2009 (r196015)
@@ -162,7 +162,7 @@ int
do_fuser(int argc, char *argv[])
{
struct consumer *consumer;
- struct kinfo_proc *p;
+ struct kinfo_proc *p, *procs;
struct procstat *procstat;
struct reqfile *reqfiles;
char *ep, *nlistf, *memf;
@@ -242,13 +242,14 @@ do_fuser(int argc, char *argv[])
procstat = procstat_open(nlistf, memf);
if (procstat == NULL)
errx(1, "procstat_open()");
- p = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt);
- if (p == NULL)
+ procs = procstat_getprocs(procstat, KERN_PROC_PROC, 0, &cnt);
+ if (procs == NULL)
errx(1, "procstat_getprocs()");
/*
* Walk through process table and look for matching files.
*/
+ p = procs;
while(cnt--)
if (p->ki_stat != SZOMB)
dofiles(procstat, p++, reqfiles, nfiles);
@@ -271,7 +272,7 @@ do_fuser(int argc, char *argv[])
}
(void)fprintf(stderr, "\n");
}
- procstat_freeprocs(procstat, p);
+ procstat_freeprocs(procstat, procs);
procstat_close(procstat);
free(reqfiles);
return (0);
Modified: projects/libprocstat/usr.bin/fstat/libprocstat.c
==============================================================================
--- projects/libprocstat/usr.bin/fstat/libprocstat.c Sat Aug 1 12:50:07 2009 (r196014)
+++ projects/libprocstat/usr.bin/fstat/libprocstat.c Sat Aug 1 12:51:16 2009 (r196015)
@@ -101,10 +101,10 @@ int statfs(const char *, struct stat
#define PROCSTAT_SYSCTL 2
static char *getmnton(kvm_t *kd, struct mount *m);
-static struct filestat_list *procstat_getfiles_kvm(kvm_t *kd,
- struct kinfo_proc *kp, int mmapped);
+static struct filestat_list *procstat_getfiles_kvm(
+ struct procstat *procstat, struct kinfo_proc *kp, int mmapped);
static struct filestat_list *procstat_getfiles_sysctl(
- struct kinfo_proc *kp, int mmapped);
+ struct procstat *procstat, struct kinfo_proc *kp, int mmapped);
static int procstat_get_pipe_info_sysctl(struct filestat *fst,
struct pipestat *pipe, char *errbuf);
static int procstat_get_pipe_info_kvm(kvm_t *kd, struct filestat *fst,
@@ -239,9 +239,9 @@ procstat_getfiles(struct procstat *procs
{
if (procstat->type == PROCSTAT_SYSCTL)
- return (procstat_getfiles_sysctl(kp, mmapped));
+ return (procstat_getfiles_sysctl(procstat, kp, mmapped));
else if (procstat->type == PROCSTAT_KVM)
- return (procstat_getfiles_kvm(procstat->kd, kp, mmapped));
+ return (procstat_getfiles_kvm(procstat, kp, mmapped));
else
return (NULL);
}
@@ -251,13 +251,13 @@ procstat_freefiles(struct procstat *proc
{
struct filestat *fst, *tmp;
- STAILQ_FOREACH_SAFE(fst, head, next, tmp) {
- if (procstat->type == PROCSTAT_SYSCTL &&
- fst->fs_typedep != NULL)
- free(fst->fs_typedep);
+ STAILQ_FOREACH_SAFE(fst, head, next, tmp)
free(fst);
- }
free(head);
+ if (procstat->vmentries != NULL)
+ free (procstat->vmentries);
+ if (procstat->files != NULL)
+ free (procstat->files);
}
static struct filestat *
@@ -314,26 +314,30 @@ getctty(kvm_t *kd, struct kinfo_proc *kp
}
static struct filestat_list *
-procstat_getfiles_kvm(kvm_t *kd, struct kinfo_proc *kp, int mmapped)
+procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmapped)
{
struct file file;
struct filedesc filed;
struct vm_map_entry vmentry;
struct vm_object object;
struct vmspace vmspace;
- struct vnode *vp;
vm_map_entry_t entryp;
vm_map_t map;
vm_object_t objp;
+ struct vnode *vp;
struct file **ofiles;
struct filestat *entry;
struct filestat_list *head;
+ kvm_t *kd;
void *data;
int i, fflags;
int prot, type;
unsigned int nfiles;
- assert(kd);
+ assert(procstat);
+ kd = procstat->kd;
+ if (kd == NULL)
+ return (NULL);
if (kp->ki_fd == NULL)
return (NULL);
if (!kvm_read_all(kd, (unsigned long)kp->ki_fd, &filed,
@@ -601,7 +605,7 @@ kinfo_uflags2fst(int fd)
}
static struct filestat_list *
-procstat_getfiles_sysctl(struct kinfo_proc *kp, int mmapped)
+procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int mmapped)
{
struct kinfo_file *kif, *files;
struct kinfo_vmentry *kve, *vmentries;
@@ -619,6 +623,7 @@ procstat_getfiles_sysctl(struct kinfo_pr
warn("kinfo_getfile()");
return (NULL);
}
+ procstat->files = files;
/*
* Allocate list head.
@@ -644,6 +649,7 @@ procstat_getfiles_sysctl(struct kinfo_pr
}
if (mmapped != 0) {
vmentries = kinfo_getvmmap(kp->ki_pid, &cnt);
+ procstat->vmentries = vmentries;
if (vmentries == NULL || cnt == 0)
goto fail;
for (i = 0; i < cnt; i++) {
Modified: projects/libprocstat/usr.bin/fstat/libprocstat.h
==============================================================================
--- projects/libprocstat/usr.bin/fstat/libprocstat.h Sat Aug 1 12:50:07 2009 (r196014)
+++ projects/libprocstat/usr.bin/fstat/libprocstat.h Sat Aug 1 12:51:16 2009 (r196015)
@@ -90,8 +90,10 @@
#define PS_FST_FFLAG_HASLOCK 0x4000
struct procstat {
- int type;
- kvm_t *kd;
+ int type;
+ kvm_t *kd;
+ void *vmentries;
+ void *files;
};
struct filestat {
int fs_type; /* Descriptor type. */
More information about the svn-src-projects
mailing list