emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/src dosfns.c


From: Eli Zaretskii
Subject: [Emacs-diffs] emacs/src dosfns.c
Date: Sat, 03 Jan 2009 15:02:31 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Eli Zaretskii <eliz>    09/01/03 15:02:31

Modified files:
        src            : dosfns.c 

Log message:
        (system_process_attributes, list_system_processes): New functions.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/dosfns.c?cvsroot=emacs&r1=1.52&r2=1.53

Patches:
Index: dosfns.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/dosfns.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -b -r1.52 -r1.53
--- dosfns.c    14 Nov 2008 13:05:35 -0000      1.52
+++ dosfns.c    3 Jan 2009 15:02:30 -0000       1.53
@@ -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 @@
 #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 @@
   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)
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]