Compare commits
No commits in common. 'c9' and 'c8' have entirely different histories.
@ -1,11 +1,15 @@
|
||||
SOURCES/iceauth-1.0.8.tar.bz2
|
||||
SOURCES/rgb-1.0.6.tar.bz2
|
||||
SOURCES/sessreg-1.1.0.tar.bz2
|
||||
SOURCES/xgamma-1.0.6.tar.bz2
|
||||
SOURCES/xhost-1.0.7.tar.bz2
|
||||
SOURCES/xinput-1.6.3.tar.bz2
|
||||
SOURCES/xisxwayland-1.tar.xz
|
||||
SOURCES/xinput-1.6.2.tar.bz2
|
||||
SOURCES/xkill-1.0.5.tar.bz2
|
||||
SOURCES/xmodmap-1.0.9.tar.bz2
|
||||
SOURCES/xrandr-1.5.0.tar.bz2
|
||||
SOURCES/xrdb-1.1.1.tar.bz2
|
||||
SOURCES/xrefresh-1.0.6.tar.bz2
|
||||
SOURCES/xset-1.2.4.tar.bz2
|
||||
SOURCES/xsetpointer-1.0.1.tar.bz2
|
||||
SOURCES/xsetroot-1.1.2.tar.bz2
|
||||
SOURCES/xstdcmap-1.0.3.tar.bz2
|
||||
|
@ -1,11 +1,15 @@
|
||||
2ce23c40a17d98badeb8ce70d26e81a5ac0e178c SOURCES/iceauth-1.0.8.tar.bz2
|
||||
542fade81a74f8a6beaea8cb517bdf1033fc6b71 SOURCES/rgb-1.0.6.tar.bz2
|
||||
a27a476f7f39ae30a16dfa25ca07c12378cff7f0 SOURCES/sessreg-1.1.0.tar.bz2
|
||||
af1484d0d70bc71dc9d3b7b95645881b7165c41b SOURCES/xgamma-1.0.6.tar.bz2
|
||||
8abfb0554e14a074f0dbfdda4919880e088545cb SOURCES/xhost-1.0.7.tar.bz2
|
||||
92ea7dfb3d8465921b0dca85da7d5b01cedae6c8 SOURCES/xinput-1.6.3.tar.bz2
|
||||
bc8e1cfc92f6d7de1f30f44a7105e811486893eb SOURCES/xisxwayland-1.tar.xz
|
||||
68367ae6cb4753eeb5fd209afe033d7c4a817748 SOURCES/xinput-1.6.2.tar.bz2
|
||||
c5ee06b33adb252a41e4f737be6bd47651ff582a SOURCES/xkill-1.0.5.tar.bz2
|
||||
fe735c8bbba68d7eb50f82d4e092fdcadf161314 SOURCES/xmodmap-1.0.9.tar.bz2
|
||||
f402b2ed85817c2e111afafd6f5d0657328be2fa SOURCES/xrandr-1.5.0.tar.bz2
|
||||
0d6b1cae357574d565d6e6bc10f6ccf073e1b9dd SOURCES/xrdb-1.1.1.tar.bz2
|
||||
11eb5b3f905631281d2cedd86a0b666bab0d9bdc SOURCES/xrefresh-1.0.6.tar.bz2
|
||||
41a857f30ff5bb0dfbda1549bb703984344ea228 SOURCES/xset-1.2.4.tar.bz2
|
||||
a8b01c6f27625a6f6943f9be17b1e5511f69d710 SOURCES/xsetpointer-1.0.1.tar.bz2
|
||||
42ab81761823b44974feab86477007c49dbace50 SOURCES/xsetroot-1.1.2.tar.bz2
|
||||
b7fcc50ae6100d2ba91d6847969fd9d2b6784a90 SOURCES/xstdcmap-1.0.3.tar.bz2
|
||||
|
@ -0,0 +1,104 @@
|
||||
From eb22398e59ae2d17bfc444400cb688c82448cb92 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Wed, 12 Sep 2018 14:46:05 +1000
|
||||
Subject: [PATCH app/sessreg] Replace strncpy calls with a sane version that
|
||||
always terminates
|
||||
|
||||
Fixes coverity complaints about potentially unterminated strings
|
||||
---
|
||||
sessreg.c | 26 +++++++++++++++++---------
|
||||
1 file changed, 17 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/sessreg.c b/sessreg.c
|
||||
index 0a8fdb2..53b30b0 100644
|
||||
--- a/sessreg.c
|
||||
+++ b/sessreg.c
|
||||
@@ -192,6 +192,14 @@ sysnerr (int x, const char *s)
|
||||
return x;
|
||||
}
|
||||
|
||||
+static void
|
||||
+safe_strncpy(char *dest, const char *src, size_t n)
|
||||
+{
|
||||
+ (void)strncpy(dest, src, n);
|
||||
+ if (n > 0)
|
||||
+ dest[n - 1] = '\0';
|
||||
+}
|
||||
+
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
@@ -406,9 +414,9 @@ main (int argc, char **argv)
|
||||
memset(&ll, 0, sizeof(ll));
|
||||
ll.ll_time = current_time;
|
||||
if (line)
|
||||
- (void) strncpy (ll.ll_line, line, sizeof (ll.ll_line));
|
||||
+ safe_strncpy (ll.ll_line, line, sizeof (ll.ll_line));
|
||||
if (host_name)
|
||||
- (void) strncpy (ll.ll_host, host_name, sizeof (ll.ll_host));
|
||||
+ safe_strncpy (ll.ll_host, host_name, sizeof (ll.ll_host));
|
||||
|
||||
sysnerr (write (llog, (char *) &ll, sizeof (ll))
|
||||
== sizeof (ll), "write lastlog entry");
|
||||
@@ -429,11 +437,11 @@ set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int a
|
||||
{
|
||||
memset (u, 0, sizeof (*u));
|
||||
if (line)
|
||||
- (void) strncpy (u->ut_line, line, sizeof (u->ut_line));
|
||||
+ safe_strncpy (u->ut_line, line, sizeof (u->ut_line));
|
||||
else
|
||||
memset (u->ut_line, 0, sizeof (u->ut_line));
|
||||
if (addp && user)
|
||||
- (void) strncpy (u->ut_name, user, sizeof (u->ut_name));
|
||||
+ safe_strncpy (u->ut_name, user, sizeof (u->ut_name));
|
||||
else
|
||||
memset (u->ut_name, 0, sizeof (u->ut_name));
|
||||
#ifdef HAVE_STRUCT_UTMP_UT_ID
|
||||
@@ -451,7 +459,7 @@ set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int a
|
||||
i -= sizeof (u->ut_id);
|
||||
else
|
||||
i = 0;
|
||||
- (void) strncpy (u->ut_id, line + i, sizeof (u->ut_id));
|
||||
+ safe_strncpy (u->ut_id, line + i, sizeof (u->ut_id));
|
||||
} else
|
||||
memset (u->ut_id, 0, sizeof (u->ut_id));
|
||||
#endif
|
||||
@@ -469,7 +477,7 @@ set_utmp (struct utmp *u, char *line, char *user, char *host, time_t date, int a
|
||||
#endif
|
||||
#ifdef HAVE_STRUCT_UTMP_UT_HOST
|
||||
if (addp && host)
|
||||
- (void) strncpy (u->ut_host, host, sizeof (u->ut_host));
|
||||
+ safe_strncpy (u->ut_host, host, sizeof (u->ut_host));
|
||||
else
|
||||
memset (u->ut_host, 0, sizeof (u->ut_host));
|
||||
#endif
|
||||
@@ -513,7 +521,7 @@ set_utmpx (struct utmpx *u, const char *line, const char *user,
|
||||
if(strcmp(line, ":0") == 0)
|
||||
(void) strcpy(u->ut_line, "console");
|
||||
else
|
||||
- (void) strncpy (u->ut_line, line, sizeof (u->ut_line));
|
||||
+ safe_strncpy (u->ut_line, line, sizeof (u->ut_line));
|
||||
|
||||
strncpy(u->ut_host, line, sizeof(u->ut_host));
|
||||
#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN
|
||||
@@ -523,7 +531,7 @@ set_utmpx (struct utmpx *u, const char *line, const char *user,
|
||||
else
|
||||
memset (u->ut_line, 0, sizeof (u->ut_line));
|
||||
if (addp && user)
|
||||
- (void) strncpy (u->ut_user, user, sizeof (u->ut_user));
|
||||
+ safe_strncpy (u->ut_user, user, sizeof (u->ut_user));
|
||||
else
|
||||
memset (u->ut_user, 0, sizeof (u->ut_user));
|
||||
|
||||
@@ -541,7 +549,7 @@ set_utmpx (struct utmpx *u, const char *line, const char *user,
|
||||
i -= sizeof (u->ut_id);
|
||||
else
|
||||
i = 0;
|
||||
- (void) strncpy (u->ut_id, line + i, sizeof (u->ut_id));
|
||||
+ safe_strncpy (u->ut_id, line + i, sizeof (u->ut_id));
|
||||
|
||||
/* make sure there is no entry using identical ut_id */
|
||||
if (!UtmpxIdOpen(u->ut_id) && addp) {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,116 @@
|
||||
From 3ea8f02027b18cf06774c8f26a719e321e9a78f2 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Wed, 12 Sep 2018 14:49:21 +1000
|
||||
Subject: [PATCH xinput] property: plug a memory leak
|
||||
|
||||
Not that it matters since we'll exit after this call anyway, but coverity is
|
||||
unhappy and that makes us all unhappy, doesn't it?
|
||||
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
---
|
||||
src/property.c | 27 +++++++++++++++------------
|
||||
1 file changed, 15 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/property.c b/src/property.c
|
||||
index e4a46f8..071f80f 100644
|
||||
--- a/src/property.c
|
||||
+++ b/src/property.c
|
||||
@@ -610,19 +610,20 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char
|
||||
unsigned char *c;
|
||||
int16_t *s;
|
||||
int32_t *l;
|
||||
- } data;
|
||||
+ } data = { NULL };
|
||||
+ int rc = EXIT_FAILURE;
|
||||
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf(stderr, "Usage: xinput %s %s\n", n, desc);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
info = xi2_find_device_info(dpy, argv[0]);
|
||||
if (!info)
|
||||
{
|
||||
fprintf(stderr, "unable to find device %s\n", argv[0]);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
name = argv[1];
|
||||
@@ -631,7 +632,7 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char
|
||||
|
||||
if (prop == None) {
|
||||
fprintf(stderr, "invalid property '%s'\n", name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
float_atom = XInternAtom(dpy, "FLOAT", False);
|
||||
@@ -643,7 +644,7 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char
|
||||
&bytes_after, &data.c) != Success) {
|
||||
fprintf(stderr, "failed to get property type and format for '%s'\n",
|
||||
name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
} else {
|
||||
if (type == None)
|
||||
type = old_type;
|
||||
@@ -657,7 +658,7 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char
|
||||
if (type == None) {
|
||||
fprintf(stderr, "property '%s' doesn't exist, you need to specify "
|
||||
"its type and format\n", name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
data.c = calloc(nelements, sizeof(int32_t));
|
||||
@@ -678,36 +679,38 @@ do_set_prop_xi2(Display *dpy, Atom type, int format, int argc, char **argv, char
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "unexpected size for property %s", name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
} else if (type == float_atom) {
|
||||
if (format != 32) {
|
||||
fprintf(stderr, "unexpected format %d for property '%s'\n",
|
||||
format, name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
*(float *)(data.l + i) = strtod(argv[2 + i], &endptr);
|
||||
if (endptr == argv[2 + i]) {
|
||||
fprintf(stderr, "argument %s could not be parsed\n", argv[2 + i]);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
} else if (type == XA_ATOM) {
|
||||
if (format != 32) {
|
||||
fprintf(stderr, "unexpected format %d for property '%s'\n",
|
||||
format, name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
data.l[i] = parse_atom(dpy, argv[2 + i]);
|
||||
} else {
|
||||
fprintf(stderr, "unexpected type for property '%s'\n", name);
|
||||
- return EXIT_FAILURE;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
|
||||
XIChangeProperty(dpy, info->deviceid, prop, type, format, PropModeReplace,
|
||||
data.c, nelements);
|
||||
+ rc = EXIT_SUCCESS;
|
||||
+out:
|
||||
free(data.c);
|
||||
- return EXIT_SUCCESS;
|
||||
+ return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,168 @@
|
||||
diff -Naur sessreg-1.1.0.old/man/filenames.sed.c sessreg-1.1.0/man/filenames.sed.c
|
||||
--- sessreg-1.1.0.old/man/filenames.sed.c 2015-04-30 13:58:47.780569645 +0200
|
||||
+++ sessreg-1.1.0/man/filenames.sed.c 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,36 +0,0 @@
|
||||
-#include "sessreg.h"
|
||||
-
|
||||
-#ifdef UTMPX_FILE
|
||||
-# define UTF UTMPX_FILE
|
||||
-# define UTM utmpx
|
||||
-/* delete utmp-only content */
|
||||
-/__BEGIN_UTMP_ONLY__/,/__END_UTMP_ONLY__/ d
|
||||
-#else
|
||||
-# define UTF UTMP_FILE
|
||||
-# define UTM utmp
|
||||
-/* delete utmpx-only content */
|
||||
-/__BEGIN_UTMPX_ONLY__/,/__END_UTMPX_ONLY__/ d
|
||||
-#endif
|
||||
-
|
||||
-#ifdef WTMPX_FILE
|
||||
-# define WTF WTMPX_FILE
|
||||
-# define WTM wtmpx
|
||||
-#else
|
||||
-# define WTF WTMP_FILE
|
||||
-# define WTM wtmp
|
||||
-#endif
|
||||
-
|
||||
-#ifndef TTYS_FILE
|
||||
-# define TTYS_FILE "/etc/ttys"
|
||||
-#endif
|
||||
-
|
||||
-#ifndef LLOG_FILE
|
||||
-# define LLOG_FILE "/var/log/lastlog"
|
||||
-#endif
|
||||
-
|
||||
-s|__utmp_manpage__|UTM|g
|
||||
-s|__utmp_file__|UTF|g
|
||||
-s|__wtmp_manpage__|WTM|g
|
||||
-s|__wtmp_file__|WTF|g
|
||||
-s|__ttys_file__|TTYS_FILE|g
|
||||
-s|__lastlog_file__|LLOG_FILE|g
|
||||
diff -Naur sessreg-1.1.0.old/man/Makefile.am sessreg-1.1.0/man/Makefile.am
|
||||
--- sessreg-1.1.0.old/man/Makefile.am 2015-04-30 13:58:47.780569645 +0200
|
||||
+++ sessreg-1.1.0/man/Makefile.am 2015-04-30 14:10:41.420249238 +0200
|
||||
@@ -3,20 +3,11 @@
|
||||
appman_PRE = sessreg.man
|
||||
appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX))
|
||||
|
||||
-EXTRA_DIST = $(appman_PRE) filenames.sed.c
|
||||
-CLEANFILES = $(appman_DATA) filenames.sed
|
||||
+EXTRA_DIST = $(appman_PRE)
|
||||
+CLEANFILES = $(appman_DATA)
|
||||
SUFFIXES = .$(APP_MAN_SUFFIX) .man
|
||||
|
||||
AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)
|
||||
-filenames.sed: filenames.sed.c
|
||||
- $(AM_V_GEN)$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
- $(AM_CPPFLAGS) $(CPPFLAGS) $(srcdir)/filenames.sed.c | \
|
||||
- $(SED) -n -e '/s|__/ p' -e '/^\/__/ p' > $@
|
||||
-
|
||||
-# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
|
||||
-MAN_SUBSTS += -f filenames.sed
|
||||
-
|
||||
-sessreg.$(APP_MAN_SUFFIX): filenames.sed
|
||||
|
||||
.man.$(APP_MAN_SUFFIX):
|
||||
$(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
|
||||
diff -Naur sessreg-1.1.0.old/man/sessreg.man sessreg-1.1.0/man/sessreg.man
|
||||
--- sessreg-1.1.0.old/man/sessreg.man 2015-04-30 13:58:47.780569645 +0200
|
||||
+++ sessreg-1.1.0/man/sessreg.man 2015-04-30 14:11:47.134127555 +0200
|
||||
@@ -24,11 +24,11 @@
|
||||
.\"
|
||||
.TH SESSREG __appmansuffix__ __xorgversion__
|
||||
.SH NAME
|
||||
-sessreg \- manage __utmp_manpage__/__wtmp_manpage__ entries for non-init clients
|
||||
+sessreg \- manage utmp (__filemansuffix__)/wtmp (__filemansuffix__) entries for non-init clients
|
||||
.SH SYNOPSIS
|
||||
.B sessreg
|
||||
-[-w \fI__wtmp_manpage__-file\fP]
|
||||
-[-u \fI__utmp_manpage__-file\fP]
|
||||
+[-w \fIwtmp (__filemansuffix__)-file\fP]
|
||||
+[-u \fIutmp (__filemansuffix__)-file\fP]
|
||||
[-L \fIlastlog-file\fP]
|
||||
[-l \fIline-name\fP]
|
||||
[-h \fIhost-name\fP]
|
||||
@@ -41,25 +41,25 @@
|
||||
\fIuser-name\fP
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
-\fISessreg\fP is a simple program for managing __utmp_manpage__/__wtmp_manpage__ and lastlog
|
||||
+\fISessreg\fP is a simple program for managing utmp (__filemansuffix__)/wtmp (__filemansuffix__) and lastlog
|
||||
entries for xdm sessions.
|
||||
.\" __BEGIN_UTMP_ONLY__
|
||||
.PP
|
||||
System V has a better interface to utmp than BSD; it
|
||||
dynamically allocates entries in the file, instead of writing them at fixed
|
||||
positions indexed by position in
|
||||
-.BR __ttys_file__ .
|
||||
+.BR /etc/ttys .
|
||||
.PP
|
||||
To manage BSD-style utmp files, \fIsessreg\fP has two strategies. In
|
||||
conjunction with xdm, the -x option counts the number of lines in
|
||||
-.B __ttys_file__
|
||||
+.B /etc/ttys
|
||||
and then adds to that the number of the line in the Xservers file which
|
||||
specifies the display. The display name must be specified as the
|
||||
"line-name" using the -l option. This sum is used as the "slot-number" in
|
||||
the utmp file that this entry will be written at. In the more general case,
|
||||
the -s option specifies the slot-number directly. If for some strange reason
|
||||
your system uses a file other than
|
||||
-.B __ttys_file__
|
||||
+.B /etc/ttys
|
||||
to manage init, the -t option can direct
|
||||
\fIsessreg\fP to look elsewhere for a count of terminal sessions.
|
||||
.PP
|
||||
@@ -95,17 +95,17 @@
|
||||
sessreg -d -l $DISPLAY -x /etc/X11/xdm/Xservers $USER
|
||||
.fi
|
||||
.SH OPTIONS
|
||||
-.IP "\fB-w\fP \fI__wtmp_manpage__-file\fP"
|
||||
-This specifies an alternate __wtmp_manpage__ file, instead of
|
||||
-.BR __wtmp_file__ .
|
||||
-The special name "none" disables writing records to the __wtmp_manpage__ file.
|
||||
-.IP "\fB-u\fP \fI__utmp_manpage__-file\fP"
|
||||
-This specifies an alternate __utmp_manpage__ file, instead of
|
||||
-.BR __utmp_file__ .
|
||||
-The special name "none" disables writing records to the __utmp_manpage__ file.
|
||||
+.IP "\fB-w\fP \fIwtmp (__filemansuffix__)-file\fP"
|
||||
+This specifies an alternate wtmp (__filemansuffix__) file, instead of
|
||||
+.BR /var/log/wtmp .
|
||||
+The special name "none" disables writing records to the wtmp (__filemansuffix__) file.
|
||||
+.IP "\fB-u\fP \fIutmp (__filemansuffix__)-file\fP"
|
||||
+This specifies an alternate utmp (__filemansuffix__) file, instead of
|
||||
+.BR /var/run/utmp .
|
||||
+The special name "none" disables writing records to the utmp (__filemansuffix__) file.
|
||||
.IP "\fB-L\fP \fIlastlog-file\fP"
|
||||
This specifies an alternate lastlog file, instead of
|
||||
-.BR __lastlog_file__ ,
|
||||
+.BR /var/log/lastlog ,
|
||||
if the platform supports lastlog files.
|
||||
The special name "none" disables writing records to the lastlog file.
|
||||
.IP "\fB-l\fP \fIline-name\fP"
|
||||
@@ -122,7 +122,7 @@
|
||||
.\" __BEGIN_UTMP_ONLY__
|
||||
Each potential session has a unique slot number in BSD systems, most are
|
||||
identified by the position of the \fIline-name\fP in the
|
||||
-.BR __ttys_file__ file.
|
||||
+.BR /etc/ttys file.
|
||||
This option overrides the default position determined with ttyslot(__libmansuffix__).
|
||||
This option is inappropriate for use with xdm, the -x option is more useful.
|
||||
.\" __END_UTMP_ONLY__
|
||||
@@ -153,13 +153,13 @@
|
||||
.IP "\fB-V\fP"
|
||||
This option causes the command to print its version and exit.
|
||||
.IP "\fB-a\fP"
|
||||
-This session should be added to __utmp_manpage__/__wtmp_manpage__.
|
||||
+This session should be added to utmp/wtmp.
|
||||
.IP "\fB-d\fP"
|
||||
-This session should be deleted from __utmp_manpage__/__wtmp_manpage__. One of -a/-d must
|
||||
+This session should be deleted from utmp/wtmp. One of -a/-d must
|
||||
be specified.
|
||||
.SH "SEE ALSO"
|
||||
.BR xdm (__appmansuffix__),
|
||||
-.BR __utmp_manpage__ (__filemansuffix__),
|
||||
-.BR __wtmp_manpage__ (__filemansuffix__)
|
||||
+.BR utmp (__filemansuffix__),
|
||||
+.BR wtmp (__filemansuffix__)
|
||||
.SH AUTHOR
|
||||
Keith Packard, MIT X Consortium
|
Loading…
Reference in new issue