diff options
author | Eli Zaretskii <eliz@gnu.org> | 2009-01-03 15:02:30 +0000 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2009-01-03 15:02:30 +0000 |
commit | e5c9f94c66a899121a3c665f9c312fb09370e9e9 (patch) | |
tree | 31e782e76ffbdc22f7403ac06875ae4f9b2db2bc | |
parent | 36a3859f9bf18c11e5a970b236efd626bba8d4b8 (diff) | |
download | emacs-e5c9f94c66a899121a3c665f9c312fb09370e9e9.tar.gz |
(system_process_attributes, list_system_processes): New functions.
-rw-r--r-- | src/dosfns.c | 128 |
1 files changed, 127 insertions, 1 deletions
diff --git a/src/dosfns.c b/src/dosfns.c index 419a4ef44ee..12c260e1c63 100644 --- a/src/dosfns.c +++ b/src/dosfns.c @@ -1,7 +1,7 @@ /* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991. Major changes May-July 1993 Morten Welinder (only 10% original code left) Copyright (C) 1991, 1993, 1996, 1997, 1998, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -38,10 +38,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "dispextern.h" #include "character.h" #include "coding.h" +#include "process.h" #include <dpmi.h> #include <go32.h> #include <dirent.h> #include <sys/vfs.h> +#include <unistd.h> +#include <grp.h> +#include <crt0.h> #ifndef __DJGPP_MINOR__ # define __tb _go32_info_block.linear_address_of_transfer_buffer; @@ -533,6 +537,128 @@ If the underlying system call fails, value is nil. */) return value; } +/* System depended enumeration of and access to system processes a-la + ps(1). Here, we only return info about the running Emacs process. + (There are no other processes on DOS, right?) */ + +Lisp_Object +list_system_processes () +{ + Lisp_Object proclist = Qnil; + + proclist = Fcons (make_fixnum_or_float (getpid ()), proclist); + + return proclist; +} + +Lisp_Object +system_process_attributes (Lisp_Object pid) +{ + int proc_id; + Lisp_Object attrs = Qnil; + + CHECK_NUMBER_OR_FLOAT (pid); + proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid); + + if (proc_id == getpid ()) + { + EMACS_INT uid, gid; + char *usr; + struct group *gr; + char cmd[FILENAME_MAX]; + char *cmdline = NULL, *p, *q; + size_t cmdline_size = 0; + int i; + Lisp_Object cmd_str, decoded_cmd, tem; + double pmem; + extern unsigned long ret_lim_data (); + + uid = getuid (); + attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (uid)), attrs); + usr = getlogin (); + if (usr) + attrs = Fcons (Fcons (Quser, build_string (usr)), attrs); + gid = getgid (); + attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (gid)), attrs); + gr = getgrgid (gid); + if (gr) + attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs); + strcpy (cmd, basename (__crt0_argv[0])); + /* Command name is encoded in locale-coding-system; decode it. */ + cmd_str = make_unibyte_string (cmd, strlen (cmd)); + decoded_cmd = code_convert_string_norecord (cmd_str, + Vlocale_coding_system, 0); + attrs = Fcons (Fcons (Qcomm, decoded_cmd), attrs); + /* Pretend we have 0 as PPID. */ + attrs = Fcons (Fcons (Qppid, make_number (0)), attrs); + attrs = Fcons (Fcons (Qpgrp, pid), attrs); + attrs = Fcons (Fcons (Qttname, build_string ("/dev/tty")), attrs); + /* We are never idle! */ + tem = Fget_internal_run_time (); + attrs = Fcons (Fcons (Qtime, tem), attrs); + attrs = Fcons (Fcons (Qthcount, make_number (1)), attrs); + attrs = Fcons (Fcons (Qstart, + Fsymbol_value (intern ("before-init-time"))), + attrs); + attrs = Fcons (Fcons (Qvsize, + make_fixnum_or_float ((unsigned long)sbrk(0)/1024)), + attrs); + attrs = Fcons (Fcons (Qetime, tem), attrs); + pmem = (double)((unsigned long) sbrk (0)) / ret_lim_data () * 100.0; + if (pmem > 100) + pmem = 100; + attrs = Fcons (Fcons (Qpmem, make_float (pmem)), attrs); + /* Pass 1: Count how much storage we need. */ + for (i = 0; i < __crt0_argc; i++) + { + cmdline_size += strlen (__crt0_argv[i]) + 1; /* +1 for blank delim */ + if (strpbrk (__crt0_argv[i], " \t\n\r\v\f")) + { + cmdline_size += 2; + for (p = __crt0_argv[i]; *p; p++) + { + if (*p == '"') + cmdline_size++; + } + } + } + /* Pass 2: Allocate storage and concatenate argv[]. */ + cmdline = xmalloc (cmdline_size + 1); + for (i = 0, q = cmdline; i < __crt0_argc; i++) + { + if (strpbrk (__crt0_argv[i], " \t\n\r\v\f")) + { + *q++ = '"'; + for (p = __crt0_argv[i]; *p; p++) + { + if (*p == '\"') + *q++ = '\\'; + *q++ = *p; + } + *q++ = '"'; + } + else + { + strcpy (q, __crt0_argv[i]); + q += strlen (__crt0_argv[i]); + } + *q++ = ' '; + } + /* Remove the trailing blank. */ + if (q > cmdline) + q[-1] = '\0'; + + /* Command line is encoded in locale-coding-system; decode it. */ + cmd_str = make_unibyte_string (cmdline, strlen (cmdline)); + decoded_cmd = code_convert_string_norecord (cmd_str, + Vlocale_coding_system, 0); + xfree (cmdline); + attrs = Fcons (Fcons (Qargs, decoded_cmd), attrs); + } + + return attrs; +} + void dos_cleanup (void) { |