comparison src/dosfns.c @ 100859:bb7058ae1991

(system_process_attributes, list_system_processes): New functions.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 03 Jan 2009 15:02:30 +0000
parents c5c8f07bc47c
children a722c792ebd7
comparison
equal deleted inserted replaced
100858:676cda349ee9 100859:bb7058ae1991
1 /* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991. 1 /* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991.
2 Major changes May-July 1993 Morten Welinder (only 10% original code left) 2 Major changes May-July 1993 Morten Welinder (only 10% original code left)
3 Copyright (C) 1991, 1993, 1996, 1997, 1998, 2001, 2002, 2003, 2004, 3 Copyright (C) 1991, 1993, 1996, 1997, 1998, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 4 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5 5
6 This file is part of GNU Emacs. 6 This file is part of GNU Emacs.
7 7
8 GNU Emacs is free software: you can redistribute it and/or modify 8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
36 #include "dosfns.h" 36 #include "dosfns.h"
37 #include "msdos.h" 37 #include "msdos.h"
38 #include "dispextern.h" 38 #include "dispextern.h"
39 #include "character.h" 39 #include "character.h"
40 #include "coding.h" 40 #include "coding.h"
41 #include "process.h"
41 #include <dpmi.h> 42 #include <dpmi.h>
42 #include <go32.h> 43 #include <go32.h>
43 #include <dirent.h> 44 #include <dirent.h>
44 #include <sys/vfs.h> 45 #include <sys/vfs.h>
46 #include <unistd.h>
47 #include <grp.h>
48 #include <crt0.h>
45 49
46 #ifndef __DJGPP_MINOR__ 50 #ifndef __DJGPP_MINOR__
47 # define __tb _go32_info_block.linear_address_of_transfer_buffer; 51 # define __tb _go32_info_block.linear_address_of_transfer_buffer;
48 #endif 52 #endif
49 53
531 make_float ((double) stfs.f_bsize * stfs.f_bavail)); 535 make_float ((double) stfs.f_bsize * stfs.f_bavail));
532 536
533 return value; 537 return value;
534 } 538 }
535 539
540 /* System depended enumeration of and access to system processes a-la
541 ps(1). Here, we only return info about the running Emacs process.
542 (There are no other processes on DOS, right?) */
543
544 Lisp_Object
545 list_system_processes ()
546 {
547 Lisp_Object proclist = Qnil;
548
549 proclist = Fcons (make_fixnum_or_float (getpid ()), proclist);
550
551 return proclist;
552 }
553
554 Lisp_Object
555 system_process_attributes (Lisp_Object pid)
556 {
557 int proc_id;
558 Lisp_Object attrs = Qnil;
559
560 CHECK_NUMBER_OR_FLOAT (pid);
561 proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid);
562
563 if (proc_id == getpid ())
564 {
565 EMACS_INT uid, gid;
566 char *usr;
567 struct group *gr;
568 char cmd[FILENAME_MAX];
569 char *cmdline = NULL, *p, *q;
570 size_t cmdline_size = 0;
571 int i;
572 Lisp_Object cmd_str, decoded_cmd, tem;
573 double pmem;
574 extern unsigned long ret_lim_data ();
575
576 uid = getuid ();
577 attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (uid)), attrs);
578 usr = getlogin ();
579 if (usr)
580 attrs = Fcons (Fcons (Quser, build_string (usr)), attrs);
581 gid = getgid ();
582 attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (gid)), attrs);
583 gr = getgrgid (gid);
584 if (gr)
585 attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs);
586 strcpy (cmd, basename (__crt0_argv[0]));
587 /* Command name is encoded in locale-coding-system; decode it. */
588 cmd_str = make_unibyte_string (cmd, strlen (cmd));
589 decoded_cmd = code_convert_string_norecord (cmd_str,
590 Vlocale_coding_system, 0);
591 attrs = Fcons (Fcons (Qcomm, decoded_cmd), attrs);
592 /* Pretend we have 0 as PPID. */
593 attrs = Fcons (Fcons (Qppid, make_number (0)), attrs);
594 attrs = Fcons (Fcons (Qpgrp, pid), attrs);
595 attrs = Fcons (Fcons (Qttname, build_string ("/dev/tty")), attrs);
596 /* We are never idle! */
597 tem = Fget_internal_run_time ();
598 attrs = Fcons (Fcons (Qtime, tem), attrs);
599 attrs = Fcons (Fcons (Qthcount, make_number (1)), attrs);
600 attrs = Fcons (Fcons (Qstart,
601 Fsymbol_value (intern ("before-init-time"))),
602 attrs);
603 attrs = Fcons (Fcons (Qvsize,
604 make_fixnum_or_float ((unsigned long)sbrk(0)/1024)),
605 attrs);
606 attrs = Fcons (Fcons (Qetime, tem), attrs);
607 pmem = (double)((unsigned long) sbrk (0)) / ret_lim_data () * 100.0;
608 if (pmem > 100)
609 pmem = 100;
610 attrs = Fcons (Fcons (Qpmem, make_float (pmem)), attrs);
611 /* Pass 1: Count how much storage we need. */
612 for (i = 0; i < __crt0_argc; i++)
613 {
614 cmdline_size += strlen (__crt0_argv[i]) + 1; /* +1 for blank delim */
615 if (strpbrk (__crt0_argv[i], " \t\n\r\v\f"))
616 {
617 cmdline_size += 2;
618 for (p = __crt0_argv[i]; *p; p++)
619 {
620 if (*p == '"')
621 cmdline_size++;
622 }
623 }
624 }
625 /* Pass 2: Allocate storage and concatenate argv[]. */
626 cmdline = xmalloc (cmdline_size + 1);
627 for (i = 0, q = cmdline; i < __crt0_argc; i++)
628 {
629 if (strpbrk (__crt0_argv[i], " \t\n\r\v\f"))
630 {
631 *q++ = '"';
632 for (p = __crt0_argv[i]; *p; p++)
633 {
634 if (*p == '\"')
635 *q++ = '\\';
636 *q++ = *p;
637 }
638 *q++ = '"';
639 }
640 else
641 {
642 strcpy (q, __crt0_argv[i]);
643 q += strlen (__crt0_argv[i]);
644 }
645 *q++ = ' ';
646 }
647 /* Remove the trailing blank. */
648 if (q > cmdline)
649 q[-1] = '\0';
650
651 /* Command line is encoded in locale-coding-system; decode it. */
652 cmd_str = make_unibyte_string (cmdline, strlen (cmdline));
653 decoded_cmd = code_convert_string_norecord (cmd_str,
654 Vlocale_coding_system, 0);
655 xfree (cmdline);
656 attrs = Fcons (Fcons (Qargs, decoded_cmd), attrs);
657 }
658
659 return attrs;
660 }
661
536 void 662 void
537 dos_cleanup (void) 663 dos_cleanup (void)
538 { 664 {
539 struct tty_display_info *tty; 665 struct tty_display_info *tty;
540 666