Commit e5c9f94c authored by Eli Zaretskii's avatar Eli Zaretskii

(system_process_attributes, list_system_processes): New functions.

parent 36a3859f
/* 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)
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment