diff --git a/sysdeps/linux/ChangeLog b/sysdeps/linux/ChangeLog index bc7c563a..42cac47e 100644 --- a/sysdeps/linux/ChangeLog +++ b/sysdeps/linux/ChangeLog @@ -1,3 +1,9 @@ +2000-04-24 Martin Baulig + + * proc_cwd.c: New file. This feature was requested by Nautilus + hacker Maciej Stachowiak and it returns the current working + directory of a process. + 2000-02-22 Martin Baulig * Makefile.am: Only install the libs in $(LIBGTOP_BACKEND_DIR) diff --git a/sysdeps/linux/Makefile.am b/sysdeps/linux/Makefile.am index ab54e429..1c55d76f 100644 --- a/sysdeps/linux/Makefile.am +++ b/sysdeps/linux/Makefile.am @@ -18,8 +18,8 @@ libgtop_sysdeps_la_SOURCES = open.c close.c cpu.c mem.c swap.c \ uptime.c loadavg.c shm_limits.c msg_limits.c \ sem_limits.c proclist.c procstate.c procuid.c \ proctime.c procmem.c procsignal.c prockernel.c \ - procsegment.c procargs.c procmap.c sysinfo.c \ - interfaces.c netinfo.c netload.c ppp.c + procsegment.c proccwd.c procargs.c procmap.c \ + sysinfo.c interfaces.c netinfo.c netload.c ppp.c libgtop_sysdeps_la_LIBADD = @GLIB_LIBS@ libgtop_sysdeps_la_LDFLAGS = $(LT_VERSION_INFO) $(dynamic_ldflags) diff --git a/sysdeps/linux/proccwd.c b/sysdeps/linux/proccwd.c new file mode 100644 index 00000000..3af93b40 --- /dev/null +++ b/sysdeps/linux/proccwd.c @@ -0,0 +1,88 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig , 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 +#include +#include +#include + +static const unsigned long _glibtop_sysdeps_proc_cwd = +(1L << GLIBTOP_PROC_CWD_SIZE); + +static const unsigned long _glibtop_sysdeps_proc_cwd_stat = +(1L << GLIBTOP_PROC_CWD_DEVICE) + (1L << GLIBTOP_PROC_CWD_INODE); + +/* Init function. */ + +int +glibtop_init_proc_cwd_s (glibtop *server) +{ + server->sysdeps.proc_cwd = _glibtop_sysdeps_proc_cwd | + _glibtop_sysdeps_proc_cwd_stat; + + return 0; +} + +/* Provides detailed information about a process. */ + +char * +glibtop_get_proc_cwd_s (glibtop *server, glibtop_proc_cwd *buf, pid_t pid) +{ + char fn [BUFSIZ], buffer [BUFSIZ], *retval = NULL; + struct stat statb; + int len; + + glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_CWD, 0); + + memset (buf, 0, sizeof (glibtop_proc_cwd)); + + sprintf (fn, "/proc/%d/cwd", pid); + + len = readlink (fn, buffer, BUFSIZ-1); + + if (len < 0) { + glibtop_warn_io_r (server, "readlink (%s)", fn); + return NULL; + } + + buffer [len] = '\0'; + + retval = glibtop_strdup_r (server, buffer); + + buf->size = len+1; + buf->flags = _glibtop_sysdeps_proc_cwd; + + if (lstat (fn, &statb)) { + glibtop_warn_io_r (server, "lstat (%s)", fn); + return retval; + } + + buf->device = statb.st_dev; + buf->inode = statb.st_ino; + + buf->flags |= _glibtop_sysdeps_proc_cwd_stat; + + return retval; +}