Add a utility, utxrm(8).

Most of the ports I broke when I imported utmpx, were simple management
utilities for the utmp database, allowing you to add/remove entries
manually.

Add a small tool called utxrm(8), which allows you to remove an entry
from the utmpx database by hand. This is useful when a login daemon
crashes or fails to remove the entry during shutdown.
This commit is contained in:
Ed Schouten 2011-02-19 11:44:04 +00:00
parent 1ae6a21db9
commit b30bfd4339
5 changed files with 166 additions and 2 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 8, 2010
.Dd February 19, 2011
.Dt GETUTXENT 3
.Os
.Sh NAME
@ -424,7 +424,8 @@ The file format is invalid.
.Xr gettimeofday 2 ,
.Xr tty 4 ,
.Xr ac 8 ,
.Xr newsyslog 8
.Xr newsyslog 8 ,
.Xr utxrm 8
.Sh STANDARDS
The
.Fn endutxent ,

View File

@ -89,6 +89,7 @@ SUBDIR= adduser \
trpt \
tzsetup \
ugidfw \
utxrm \
vipw \
wake \
watch \

6
usr.sbin/utxrm/Makefile Normal file
View File

@ -0,0 +1,6 @@
# $FreeBSD$
PROG= utxrm
MAN= utxrm.8
.include <bsd.prog.mk>

72
usr.sbin/utxrm/utxrm.8 Normal file
View File

@ -0,0 +1,72 @@
.\" Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd February 19, 2011
.Dt UTXRM 8
.Os
.Sh NAME
.Nm utxrm
.Nd remove sessions from the user accounting database
.Sh SYNOPSIS
.Nm
.Ar identifier
.Ar ...
.Sh DESCRIPTION
The
.Nm
utility can be used to remove stale sessions from the user accounting
database, by referring to their
.Ar identifier .
Stale sessions can occur if a login service exits prematurely or fails
to remove the session from the accounting database.
.Pp
Utilities such as
.Xr w 1
will not display the identifier corresponding with a login session,
since its value is typically only of use by the process managing the
record.
The following command can be used to obtain all records from the user
accounting database's active session table, including its identifiers:
.Pp
.Dl getent utmpx active
.Pp
Identifiers can either be supplied in hexadecimal form as displayed by
.Xr getent 1 ,
or as a string if the identifier allows such a representation.
.Pp
Because this utility requires write-access to the user accounting
database, its use is limited to the super-user.
.Sh SEE ALSO
.Xr getent 1 ,
.Xr w 1 ,
.Xr pututxline 3 .
.Sh HISTORY
The
.Nm
utility appeared in
.Fx 9.0 .
.Sh AUTHORS
.An Ed Schouten Aq ed@FreeBSD.org

84
usr.sbin/utxrm/utxrm.c Normal file
View File

@ -0,0 +1,84 @@
/*-
* Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/time.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <utmpx.h>
static int
b16_pton(const char *in, char *out, size_t len)
{
size_t i;
for (i = 0; i < len * 2; i++)
if (!isxdigit((unsigned char)in[i]))
return (1);
for (i = 0; i < len; i++)
sscanf(&in[i * 2], "%02hhx", &out[i]);
return (0);
}
int
main(int argc, char *argv[])
{
struct utmpx utx = { .ut_type = DEAD_PROCESS };
size_t len;
int i, ret = 0;
if (argc < 2) {
fprintf(stderr, "usage: utxrm identifier ...\n");
return (1);
}
gettimeofday(&utx.ut_tv, NULL);
for (i = 1; i < argc; i++) {
len = strlen(argv[i]);
if (len <= sizeof(utx.ut_id)) {
/* Identifier as string. */
strncpy(utx.ut_id, argv[i], sizeof(utx.ut_id));
} else if (len != sizeof(utx.ut_id) * 2 ||
b16_pton(argv[i], utx.ut_id, sizeof(utx.ut_id)) != 0) {
/* Also not hexadecimal. */
fprintf(stderr, "%s: Invalid identifier format\n",
argv[i]);
ret = 1;
continue;
}
/* Zap the entry. */
if (pututxline(&utx) == NULL) {
perror(argv[i]);
ret = 1;
}
}
return (ret);
}