X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/ac3232837188f7e1c4ffe34b76edede0ccb54f5e..986fb647cc1df1edeeaa2c0e7cb34c100eb9efb9:/src/dosfns.c diff --git a/src/dosfns.c b/src/dosfns.c index ac336c9a5d..e8756de21a 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, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -26,11 +26,12 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include #include "lisp.h" #include "buffer.h" #include "termchar.h" -#include "termhooks.h" #include "frame.h" +#include "termhooks.h" #include "blockinput.h" #include "window.h" #include "dosfns.h" @@ -38,17 +39,17 @@ along with GNU Emacs. If not, see . */ #include "dispextern.h" #include "character.h" #include "coding.h" +#include "process.h" #include #include #include #include - -#ifndef __DJGPP_MINOR__ -# define __tb _go32_info_block.linear_address_of_transfer_buffer; -#endif +#include +#include +#include DEFUN ("int86", Fint86, Sint86, 2, 2, 0, - doc: /* Call specific MSDOS interrupt number INTERRUPT with REGISTERS. + doc: /* Call specific MS-DOS interrupt number INTERRUPT with REGISTERS. Return the updated REGISTER vector. INTERRUPT should be an integer in the range 0 to 255. @@ -380,8 +381,6 @@ init_dosfns () } #endif /* !HAVE_X_WINDOWS */ -#if __DJGPP__ >= 2 - /* Without this, we never see hidden files. Don't OR it with the previous value, so the value recorded at dump time, possibly with `preserve-case' flags set, won't get through. */ @@ -393,7 +392,6 @@ init_dosfns () if (!NILP (Fmsdos_long_file_names ())) __opendir_flags |= __OPENDIR_PRESERVE_CASE; #endif /* __DJGPP_MINOR__ == 0 */ -#endif /* __DJGPP__ >= 2 */ } #ifndef HAVE_X_WINDOWS @@ -533,18 +531,158 @@ 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; +#ifndef SYSTEM_MALLOC + extern unsigned long ret_lim_data (); +#endif + + 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); +#ifndef SYSTEM_MALLOC + /* ret_lim_data is on vm-limit.c, which is not compiled in under + SYSTEM_MALLOC. */ + pmem = (double)((unsigned long) sbrk (0)) / ret_lim_data () * 100.0; + if (pmem > 100) +#endif + 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) { + struct tty_display_info *tty; + #ifndef HAVE_X_WINDOWS restore_parent_vm_title (); #endif /* Make sure the termscript file is committed, in case we are crashing and some vital info was written there. */ - if (termscript) + if (FRAMEP (selected_frame)) { - fflush (termscript); - fsync (fileno (termscript)); + struct frame *sf = XFRAME (selected_frame); + + if (FRAME_LIVE_P (sf) + && (FRAME_MSDOS_P (sf) || FRAME_TERMCAP_P (sf))) + { + tty = CURTTY (); + if (tty->termscript) + { + fflush (tty->termscript); + fsync (fileno (tty->termscript)); + } + } } }