X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/847c048ea345e1fed2d7e4e2301bbfaba751e9c6..5c629bf654b2d1c137f1e503b9a58cd75af9199b:/src/process.c diff --git a/src/process.c b/src/process.c index 3c6fdbb168..aaadedb541 100644 --- a/src/process.c +++ b/src/process.c @@ -1221,7 +1221,7 @@ a socket connection. */) return XPROCESS (process)->type; } #endif - + DEFUN ("process-type", Fprocess_type, Sprocess_type, 1, 1, 0, doc: /* Return the connection type of PROCESS. The value is either the symbol `real', `network', or `serial'. @@ -4137,9 +4137,9 @@ It is read into the process' buffers or given to their filter functions. Non-nil arg PROCESS means do not return until some output has been received from PROCESS. -Non-nil second arg SECONDS and third arg MILLISEC are number of -seconds and milliseconds to wait; return after that much time whether -or not there is input. If SECONDS is a floating point number, +Non-nil second arg SECONDS and third arg MILLISEC are number of seconds +and milliseconds to wait; return after that much time whether or not +there is any subprocess output. If SECONDS is a floating point number, it specifies a fractional number of seconds to wait. The MILLISEC argument is obsolete and should be avoided. @@ -7136,7 +7136,7 @@ static void get_up_time (time_t *sec, unsigned *usec) { FILE *fup; - + *sec = *usec = 0; BLOCK_INPUT; @@ -7246,10 +7246,10 @@ procfs_system_process_attributes (pid) char procbuf[1025], *p, *q; int fd; ssize_t nread; - char cmd[PATH_MAX]; + const char *cmd = NULL; char *cmdline = NULL; - size_t cmdsize; - int c; + size_t cmdsize = 0, cmdline_size; + unsigned char c; int proc_id, ppid, uid, gid, pgrp, sess, tty, tpgid, thcount; unsigned long long utime, stime, cutime, cstime, start; long priority, nice, rss; @@ -7277,7 +7277,7 @@ procfs_system_process_attributes (pid) uid_eint = uid; attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (uid_eint)), attrs); BLOCK_INPUT; - pw = (struct passwd *) getpwuid (uid); + pw = getpwuid (uid); UNBLOCK_INPUT; if (pw) attrs = Fcons (Fcons (Quser, build_string (pw->pw_name)), attrs); @@ -7286,7 +7286,7 @@ procfs_system_process_attributes (pid) gid_eint = gid; attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (gid_eint)), attrs); BLOCK_INPUT; - gr = (struct group *) getgrgid (gid); + gr = getgrgid (gid); UNBLOCK_INPUT; if (gr) attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs); @@ -7300,18 +7300,26 @@ procfs_system_process_attributes (pid) procbuf[nread] = '\0'; p = procbuf; - p = strchr (p, '(') + 1; - q = strchr (p, ')'); - /* comm */ - if (q > p) + p = strchr (p, '('); + if (p != NULL) { - memcpy (cmd, p, q - p); - cmd[q - p] = '\0'; + q = strrchr (p + 1, ')'); + /* comm */ + if (q != NULL) + { + cmd = p + 1; + cmdsize = q - cmd; + } } else - strcpy (cmd, "???"); + q = NULL; + if (cmd == NULL) + { + cmd = "???"; + cmdsize = 3; + } /* Command name is encoded in locale-coding-system; decode it. */ - cmd_str = make_unibyte_string (cmd, q ? q - p : 3); + cmd_str = make_unibyte_string (cmd, cmdsize); decoded_cmd = code_convert_string_norecord (cmd_str, Vlocale_coding_system, 0); attrs = Fcons (Fcons (Qcomm, decoded_cmd), attrs); @@ -7397,7 +7405,9 @@ procfs_system_process_attributes (pid) attrs); time_from_jiffies (utime + stime, clocks_per_sec, &sec, &usec); pcpu = (sec + usec / 1000000.0) / (EMACS_SECS (telapsed) + EMACS_USECS (telapsed) / 1000000.0); - attrs = Fcons (Fcons (Qpcpu, make_float (pcpu)), attrs); + if (pcpu > 1.0) + pcpu = 1.0; + attrs = Fcons (Fcons (Qpcpu, make_float (100 * pcpu)), attrs); pmem = 4.0 * 100 * rss / procfs_get_total_memory (); if (pmem > 100) pmem = 100; @@ -7412,18 +7422,26 @@ procfs_system_process_attributes (pid) fd = emacs_open (fn, O_RDONLY, 0); if (fd >= 0) { - for (cmdsize = 0; emacs_read (fd, (char *)&c, 1) == 1; cmdsize++) + for (cmdline_size = 0; emacs_read (fd, &c, 1) == 1; cmdline_size++) { if (isspace (c) || c == '\\') - cmdsize++; /* for later quoting, see below */ + cmdline_size++; /* for later quoting, see below */ } - if (cmdsize) + if (cmdline_size) { - cmdline = xmalloc (cmdsize + 1); + cmdline = xmalloc (cmdline_size + 1); lseek (fd, 0L, SEEK_SET); cmdline[0] = '\0'; - if ((nread = read (fd, cmdline, cmdsize)) >= 0) + if ((nread = read (fd, cmdline, cmdline_size)) >= 0) cmdline[nread++] = '\0'; + else + { + /* Assigning zero to `nread' makes us skip the following + two loops, assign zero to cmdline_size, and enter the + following `if' clause that handles unknown command + lines. */ + nread = 0; + } /* We don't want trailing null characters. */ for (p = cmdline + nread - 1; p > cmdline && !*p; p--) nread--; @@ -7439,18 +7457,22 @@ procfs_system_process_attributes (pid) else if (*p == '\0') *p = ' '; } - cmdsize = nread; + cmdline_size = nread; } - else + if (!cmdline_size) { - cmdsize = strlen (cmd) + 2; - cmdline = xmalloc (cmdsize + 1); + if (!cmd) + cmd = "???"; + if (!cmdsize) + cmdsize = strlen (cmd); + cmdline_size = cmdsize + 2; + cmdline = xmalloc (cmdline_size + 1); strcpy (cmdline, "["); - strcat (strcat (cmdline, cmd), "]"); + strcat (strncat (cmdline, cmd, cmdsize), "]"); } emacs_close (fd); /* Command line is encoded in locale-coding-system; decode it. */ - cmd_str = make_unibyte_string (cmdline, cmdsize); + cmd_str = make_unibyte_string (cmdline, cmdline_size); decoded_cmd = code_convert_string_norecord (cmd_str, Vlocale_coding_system, 0); xfree (cmdline); @@ -7480,19 +7502,19 @@ given its ID. */) } DEFUN ("system-process-attributes", Fsystem_process_attributes, - Ssystem_process_attributeses, 1, 1, 0, + Ssystem_process_attributes, 1, 1, 0, doc: /* Return attributes of the process given by its PID, a number. Value is an alist where each element is a cons cell of the form - \(ATTR . VALUE) + \(KEY . VALUE) If this functionality is unsupported, the value is nil. See `list-system-processes' for getting a list of all process IDs. -The attributes that this function may return are listed below, -together with the type of the associated value (in parentheses). +The KEYs of the attributes that this function may return are listed +below, together with the type of the associated VALUE (in parentheses). Not all platforms support all of these attributes; unsupported attributes will not appear in the returned alist. Unless explicitly indicated otherwise, numbers can have either @@ -7906,7 +7928,7 @@ The variable takes effect when `start-process' is called. */); defsubr (&Sset_process_filter_multibyte); defsubr (&Sprocess_filter_multibyte_p); defsubr (&Slist_system_processes); - defsubr (&Ssystem_process_attributeses); + defsubr (&Ssystem_process_attributes); } @@ -7933,7 +7955,7 @@ extern int frame_garbaged; extern EMACS_TIME timer_check (); extern int timers_run; -Lisp_Object QCtype; +Lisp_Object QCtype, QCname; /* As described above, except assuming that there are no subprocesses: @@ -8208,19 +8230,19 @@ given its ID. */) } DEFUN ("system-process-attributes", Fsystem_process_attributes, - Ssystem_process_attributeses, 1, 1, 0, + Ssystem_process_attributes, 1, 1, 0, doc: /* Return attributes of the process given by its PID, a number. Value is an alist where each element is a cons cell of the form - \(ATTR . VALUE) + \(KEY . VALUE) If this functionality is unsupported, the value is nil. See `list-system-processes' for getting a list of all process IDs. -The attributes that this function may return are listed below, -together with the type of the associated value (in parentheses). +The KEYs of the attributes that this function may return are listed +below, together with the type of the associated VALUE (in parentheses). Not all platforms support all of these attributes; unsupported attributes will not appear in the returned alist. Unless explicitly indicated otherwise, numbers can have either @@ -8273,11 +8295,13 @@ syms_of_process () { QCtype = intern (":type"); staticpro (&QCtype); + QCname = intern (":name"); + staticpro (&QCname); defsubr (&Sget_buffer_process); defsubr (&Sprocess_inherit_coding_system_flag); defsubr (&Slist_system_processes); - defsubr (&Ssystem_process_attributeses); + defsubr (&Ssystem_process_attributes); }