usr/src/lib/libc/port/gen/getutx.c
author casper
Mon, 01 May 2006 11:23:49 -0700
changeset 1914 8a8c5f225b1b
parent 1111 e2bd9f81a79d
child 3235 9af05252020c
permissions -rw-r--r--
4916205 libcmd should not use file operation routines from C library 6234782 Kerberos and GSSAPI should not use fopen 6259671 vold won't be killed by TERM signal when several removable devices are managed 6386770 pam_authenticate can fail if open files are >= 255 and the soft fd limit is greater than 256 6414401 Remove shadow stdio implementation obsoleted by PSARC 2006/162 6414404 __rpc_openchild never called and not exported by library 6416815 ON needs to be hardened against the 32-bit fopen/255 problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1111
diff changeset
     5
 * Common Development and Distribution License (the "License").
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1111
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
1111
e2bd9f81a79d 6362144 gcc breaks libc by turning structure assignments into calls to memcpy()
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1111
diff changeset
    23
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * University Copyright- Copyright (c) 1982, 1986, 1988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * The Regents of the University of California
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * All Rights Reserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * University Acknowledgment- Portions of this document are derived from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * software developed by the University of California, Berkeley, and its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * contributors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * Routines to read and write the /etc/utmpx file. Also contains
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * binary compatibility routines to support the old utmp interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * on systems with MAXPID <= SHRT_MAX.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#pragma weak getutxent = _getutxent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#pragma weak getutent = _getutent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#pragma weak getutxid = _getutxid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#pragma weak getutid = _getutid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#pragma weak getutxline = _getutxline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#pragma weak getutline = _getutline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#pragma weak getutmpx = _getutmpx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#pragma weak getutmp = _getutmp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#pragma weak makeutx = _makeutx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#pragma weak makeut = _makeut
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#pragma weak modutx = _modutx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#pragma weak modut = _modut
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#pragma weak pututxline = _pututxline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#pragma weak pututline = _pututline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#pragma weak setutxent = _setutxent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#pragma weak setutent = _setutent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#pragma weak endutxent = _endutxent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#pragma weak endutent = _endutent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#pragma weak utmpxname = _utmpxname
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#pragma weak utmpname = _utmpname
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#pragma weak updwtmpx = _updwtmpx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#pragma weak updwtmp = _updwtmp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include <utmpx.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#include <sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#include <spawn.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	IDLEN		4	/* length of id field in utmp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#define	SC_WILDC	0xff	/* wild char for utmp ids */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#define	MAXFILE		79	/* Maximum pathname length for "utmpx" file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
#define	MAXVAL		255		/* max value for an id `character' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
#define	IPIPE		"/etc/initpipe"	/* FIFO to send pids to init */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#define	UPIPE		"/etc/utmppipe"	/* FIFO to send pids to utmpd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#define	VAR_UTMPX_FILE	"/var/adm/utmpx" /* for sanity check only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 * format of message sent to init
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
typedef struct	pidrec {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	int	pd_type;	/* command type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	pid_t	pd_pid;		/* pid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
} pidrec_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * pd_type's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
#define	ADDPID 1	/* add a pid to "godchild" list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#define	REMPID 2	/* remove a pid to "godchild" list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
static void	utmpx_frec2api(const struct futmpx *, struct utmpx *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
static void	utmpx_api2frec(const struct utmpx *, struct futmpx *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
static void	unlockutx(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
static void	sendpid(int, pid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
static void	sendupid(int, pid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
static int	idcmp(const char *, const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
static int	allocid(char *, unsigned char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
static int	lockutx(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
static struct utmpx *invoke_utmp_update(const struct utmpx *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
static struct futmpx *getoneutx(off_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
static void	putoneutx(const struct utmpx *, off_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
static int	big_pids_in_use(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * prototypes for utmp compatibility routines (in getut.c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
extern struct utmp *_compat_getutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
extern struct utmp *_compat_getutid(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
extern struct utmp *_compat_getutline(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
extern struct utmp *_compat_pututline(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
extern void _compat_setutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
extern void _compat_endutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
extern void _compat_updwtmp(const char *, struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
extern struct utmp *_compat_makeut(struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
static int fd = -1;	/* File descriptor for the utmpx file. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
static int ut_got_maxpid = 0;	/* Flag set when sysconf(_SC_MAXPID) called */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
static pid_t ut_maxpid = 0;	/* Value of MAXPID from sysconf */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
static int tempfd = -1;  /* To store fd between lockutx() and unlockutx() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
static	FILE	*fp = NULL;	/* Buffered file descriptior for utmpx file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
static int changed_name = 0;	/* Flag set when not using utmpx file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
static char utmpxfile[MAXFILE+1] = UTMPX_FILE;	/* Name of the current */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
char _compat_utmpfile[MAXFILE+1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
static int compat_utmpflag = 0;	/* old compat mode flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
static struct futmpx fubuf;	/* Copy of last entry read in. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
static struct utmpx ubuf;	/* Last entry returned to client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
static struct utmp utmpcompat;	/* Buffer for returning utmp-format data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * In the 64-bit world, the utmpx data structure grows because of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * the ut_time field (a struct timeval) grows in the middle of it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
utmpx_frec2api(const struct futmpx *src, struct utmpx *dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	if (src == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	(void) strncpy(dst->ut_user, src->ut_user, sizeof (dst->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	(void) strncpy(dst->ut_line, src->ut_line, sizeof (dst->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	(void) memcpy(dst->ut_id, src->ut_id, sizeof (dst->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	dst->ut_pid = src->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	dst->ut_type = src->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	dst->ut_exit.e_termination = src->ut_exit.e_termination;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	dst->ut_exit.e_exit = src->ut_exit.e_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	dst->ut_tv.tv_sec = (time_t)src->ut_tv.tv_sec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	dst->ut_tv.tv_usec = (suseconds_t)src->ut_tv.tv_usec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	dst->ut_session = src->ut_session;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	bzero(dst->pad, sizeof (dst->pad));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	dst->ut_syslen = src->ut_syslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	(void) memcpy(dst->ut_host, src->ut_host, sizeof (dst->ut_host));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
utmpx_api2frec(const struct utmpx *src, struct futmpx *dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	if (src == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	(void) strncpy(dst->ut_user, src->ut_user, sizeof (dst->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	(void) strncpy(dst->ut_line, src->ut_line, sizeof (dst->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	(void) memcpy(dst->ut_id, src->ut_id, sizeof (dst->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	dst->ut_pid = src->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	dst->ut_type = src->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	dst->ut_exit.e_termination = src->ut_exit.e_termination;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	dst->ut_exit.e_exit = src->ut_exit.e_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	dst->ut_tv.tv_sec = (time32_t)src->ut_tv.tv_sec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	dst->ut_tv.tv_usec = (int32_t)src->ut_tv.tv_usec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	dst->ut_session = src->ut_session;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	bzero(dst->pad, sizeof (dst->pad));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	dst->ut_syslen = src->ut_syslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	(void) memcpy(dst->ut_host, src->ut_host, sizeof (dst->ut_host));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 * "getutxent_frec" gets the raw version of the next entry in the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
static struct futmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
getutxent_frec(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	 * If the "utmpx" file is not open, attempt to open it for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	 * reading.  If there is no file, attempt to create one.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	 * both attempts fail, return NULL.  If the file exists, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	 * isn't readable and writeable, do not attempt to create.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		if ((fd = open(utmpxfile, O_RDWR|O_CREAT, 0644)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			 * If the open failed for permissions, try opening
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
			 * it only for reading.  All "pututxline()" later
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			 * will fail the writes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			if ((fd = open(utmpxfile, O_RDONLY)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1111
diff changeset
   228
			if ((fp = fopen(utmpxfile, "rF")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
				(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
				fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			 * Get the stream pointer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			 */
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1111
diff changeset
   238
			if ((fp = fopen(utmpxfile, "r+F")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
				(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
				fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	 * Try to read in the next entry from the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	if (fread(&fubuf, sizeof (fubuf), 1, fp) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		 * Make sure fubuf is zeroed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	return (&fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
 * "big_pids_in_use" determines whether large pid numbers are in use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
 * or not.  If MAXPID won't fit in a signed short, the utmp.ut_pid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
 * field will overflow.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 * Returns 0 if small pids are in use, 1 otherwise
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
big_pids_in_use(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	if (!ut_got_maxpid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		ut_got_maxpid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		ut_maxpid = sysconf(_SC_MAXPID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	return (ut_maxpid > SHRT_MAX ? 1 : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 * "getutxent" gets the next entry in the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
getutxent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	struct futmpx *futxp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	futxp = getutxent_frec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	if (futxp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
 * "getutent" gets the next entry in the utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
getutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	struct utmpx *utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	if (compat_utmpflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		return (_compat_getutent());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	/* fail if we can't represent maxpid properly */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	if (big_pids_in_use()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		errno = EOVERFLOW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	if ((utmpx = getutxent()) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	getutmp(utmpx, &utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	return (&utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
 * "getutxid" finds the specified entry in the utmpx file.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
 * it can't find it, it returns NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
getutxid(const struct utmpx *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	short type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 * From XPG5: "The getutxid() or getutxline() may cache data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	 * For this reason, to use getutxline() to search for multiple
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	 * occurrences, it is necessary to zero out the static data after
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	 * each success, or getutxline() could just return a pointer to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	 * the same utmpx structure over and over again."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	utmpx_api2frec(&ubuf, &fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	 * Start looking for entry. Look in our current buffer before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	 * reading in new entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		 * If there is no entry in "fubuf", skip to the read.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
		if (fubuf.ut_type != EMPTY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			switch (entry->ut_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
			 * Do not look for an entry if the user sent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
			 * us an EMPTY entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			case EMPTY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			 * For RUN_LVL, BOOT_TIME, OLD_TIME, and NEW_TIME
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
			 * entries, only the types have to match.  If they do,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
			 * return the address of internal buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			case RUN_LVL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
			case BOOT_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			case DOWN_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			case OLD_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			case NEW_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
				if (entry->ut_type == fubuf.ut_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
					utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
					return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
			 * For INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
			 * and DEAD_PROCESS the type of the entry in "fubuf",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			 * must be one of the above and id's must match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			case INIT_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			case LOGIN_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			case USER_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			case DEAD_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
				if (((type = fubuf.ut_type) == INIT_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
				    type == LOGIN_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
				    type == USER_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
				    type == DEAD_PROCESS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
				    (fubuf.ut_id[0] == entry->ut_id[0]) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
				    (fubuf.ut_id[1] == entry->ut_id[1]) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
				    (fubuf.ut_id[2] == entry->ut_id[2]) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
				    (fubuf.ut_id[3] == entry->ut_id[3])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
					utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
					return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
			 * Do not search for illegal types of entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	} while (getutxent_frec() != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	 * Return NULL since the proper entry wasn't found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
 * "getutid" finds the specified entry in the utmp file.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
 * it can't find it, it returns NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
getutid(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	struct utmpx *utmpx2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	if (compat_utmpflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		return (_compat_getutid(entry));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	/* fail if we can't represent maxpid properly */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	if (big_pids_in_use()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		errno = EOVERFLOW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	getutmpx(entry, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	if ((utmpx2 = getutxid(&utmpx)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	getutmp(utmpx2, &utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	return (&utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 * "getutxline" searches the "utmpx" file for a LOGIN_PROCESS or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 * USER_PROCESS with the same "line" as the specified "entry".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
getutxline(const struct utmpx *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	 * From XPG5: "The getutxid() or getutxline() may cache data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	 * For this reason, to use getutxline() to search for multiple
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	 * occurrences, it is necessary to zero out the static data after
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	 * each success, or getutxline() could just return a pointer to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	 * the same utmpx structure over and over again."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	utmpx_api2frec(&ubuf, &fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		 * If the current entry is the one we are interested in,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		 * return a pointer to it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		if (fubuf.ut_type != EMPTY &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		    (fubuf.ut_type == LOGIN_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		    fubuf.ut_type == USER_PROCESS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		    strncmp(&entry->ut_line[0], &fubuf.ut_line[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		    sizeof (fubuf.ut_line)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
			utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
			return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	} while (getutxent_frec() != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	 * Since entry wasn't found, return NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
 * "getutline" searches the "utmp" file for a LOGIN_PROCESS or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
 * USER_PROCESS with the same "line" as the specified "entry".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
getutline(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	struct utmpx *utmpx2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	if (compat_utmpflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		return (_compat_getutline(entry));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	/* fail if we can't represent maxpid properly */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	if (big_pids_in_use()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		errno = EOVERFLOW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	/* call getutxline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	getutmpx(entry, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	if ((utmpx2 = getutxline(&utmpx)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	getutmp(utmpx2, &utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	return (&utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
 * invoke_utmp_update
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
 * Invokes the utmp_update program which has the privilege to write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
 * to the /etc/utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
#define	UTMP_UPDATE 	"/usr/lib/utmp_update"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
#define	STRSZ	64	/* Size of char buffer for argument strings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
static struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
invoke_utmp_update(const struct utmpx *entryx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	extern char **environ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	int status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	pid_t child;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	pid_t w;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	char user[STRSZ], id[STRSZ], line[STRSZ], pid[STRSZ], type[STRSZ],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	    term[STRSZ], exit[STRSZ], time[STRSZ], time_usec[STRSZ],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	    session_id[STRSZ], syslen[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	char pad[sizeof (entryx->pad) * 2 + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	char host[sizeof (entryx->ut_host) + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	struct utmpx *curx = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	char bin2hex[] = "0123456789ABCDEF";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	sigset_t mask, omask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	unsigned char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	char *argvec[15];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	 * Convert the utmp struct to strings for command line arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	(void) strncpy(user, entryx->ut_user, sizeof (entryx->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	user[sizeof (entryx->ut_user)] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	(void) strncpy(id, entryx->ut_id, sizeof (entryx->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	id[sizeof (entryx->ut_id)] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	(void) strncpy(line, entryx->ut_line, sizeof (entryx->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	line[sizeof (entryx->ut_line)] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	(void) sprintf(pid, "%d", entryx->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	(void) sprintf(type, "%d", entryx->ut_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	(void) sprintf(term, "%d", entryx->ut_exit.e_termination);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	(void) sprintf(exit, "%d", entryx->ut_exit.e_exit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	(void) sprintf(time, "%ld", entryx->ut_tv.tv_sec);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	(void) sprintf(time_usec, "%ld", entryx->ut_tv.tv_usec);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	(void) sprintf(session_id, "%d", entryx->ut_session);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	cp = (unsigned char *)entryx->pad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	for (i = 0; i < sizeof (entryx->pad); ++i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		pad[i << 1] = bin2hex[(cp[i] >> 4) & 0xF];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		pad[(i << 1) + 1] = bin2hex[cp[i] & 0xF];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	pad[sizeof (pad) - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	(void) sprintf(syslen, "%d", entryx->ut_syslen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	(void) strlcpy(host, entryx->ut_host, sizeof (host));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	argvec[0] = UTMP_UPDATE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	argvec[1] = user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	argvec[2] = id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	argvec[3] = line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	argvec[4] = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	argvec[5] = type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	argvec[6] = term;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	argvec[7] = exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	argvec[8] = time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	argvec[9] = time_usec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	argvec[10] = session_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	argvec[11] = pad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	argvec[12] = syslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	argvec[13] = host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	argvec[14] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	 * Block SIGCLD while we do this.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	 * This avoids having an unexpected SIGCLD sent to the process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	(void) sigemptyset(&mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	(void) sigaddset(&mask, SIGCLD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	(void) sigprocmask(SIG_BLOCK, &mask, &omask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	error = posix_spawn(&child, UTMP_UPDATE, NULL, NULL, argvec, environ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		errno = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		w = waitpid(child, &status, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	} while (w == -1 && errno == EINTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	 * We can get ECHILD if the process is ignoring SIGCLD.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	if (!(w == -1 && errno == ECHILD) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	    (w == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		 * The child encountered an error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	 * Normal termination.  Return a pointer to the entry we just made.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	setutxent();	/* Reset file pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	while ((curx = getutxent()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
		if (curx->ut_type != EMPTY &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
		    (curx->ut_type == LOGIN_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
		    curx->ut_type == USER_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		    curx->ut_type == DEAD_PROCESS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		    strncmp(&entryx->ut_line[0], &curx->ut_line[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		    sizeof (curx->ut_line)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	(void) sigprocmask(SIG_SETMASK, &omask, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	return (curx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
 * "pututxline" writes the structure sent into the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
 * If there is already an entry with the same id, then it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
 * overwritten, otherwise a new entry is made at the end of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
 * utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
pututxline(const struct utmpx *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	struct utmpx *answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	int lock = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	struct utmpx tmpxbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	struct futmpx ftmpxbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	 * Copy the user supplied entry into our temporary buffer to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	 * avoid the possibility that the user is actually passing us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	 * the address of "ubuf".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	if (entry == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
1111
e2bd9f81a79d 6362144 gcc breaks libc by turning structure assignments into calls to memcpy()
raf
parents: 0
diff changeset
   640
	(void) memcpy(&tmpxbuf, entry, sizeof (tmpxbuf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	utmpx_api2frec(entry, &ftmpxbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
		(void) getutxent_frec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
		if (fd < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
			return ((struct utmpx *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	 * If we are not the superuser than we can't write to /etc/utmp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	 * so invoke update_utmp(8) to write the entry for us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	if (changed_name == 0 && geteuid() != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		return (invoke_utmp_update(entry));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	 * Find the proper entry in the utmpx file.  Start at the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	 * location.  If it isn't found from here to the end of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	 * file, then reset to the beginning of the file and try again.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	 * If it still isn't found, then write a new entry at the end of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	 * the file.  (Making sure the location is an integral number of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	 * utmp structures into the file incase the file is scribbled.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	if (getutxid(&tmpxbuf) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
		setutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
		 * Lock the the entire file from here onwards.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		if (getutxid(&tmpxbuf) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
			lock++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
			if (lockf(fd, F_LOCK, 0) < NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
			(void) fseek(fp, 0, SEEK_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
			(void) fseek(fp, -(long)sizeof (struct futmpx),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
			    SEEK_CUR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
		(void) fseek(fp, -(long)sizeof (struct futmpx), SEEK_CUR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	 * Write out the user supplied structure.  If the write fails,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	 * then the user probably doesn't have permission to write the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
	 * utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	if (fwrite(&ftmpxbuf, sizeof (ftmpxbuf), 1, fp) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		answer = (struct utmpx *)NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		 * Save the new user structure into ubuf and fubuf so that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		 * it will be up to date in the future.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		(void) fflush(fp);
1111
e2bd9f81a79d 6362144 gcc breaks libc by turning structure assignments into calls to memcpy()
raf
parents: 0
diff changeset
   696
		(void) memcpy(&fubuf, &ftmpxbuf, sizeof (fubuf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		utmpx_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		answer = &ubuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	if (lock)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		(void) lockf(fd, F_ULOCK, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	if (answer != NULL && (tmpxbuf.ut_type == USER_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	    tmpxbuf.ut_type == DEAD_PROCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		sendupid(tmpxbuf.ut_type == USER_PROCESS ? ADDPID : REMPID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		    (pid_t)tmpxbuf.ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	return (answer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
 * "pututline" is a wrapper that calls pututxline after converting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
 * the utmp record to a utmpx record.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
pututline(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
	struct utmpx *utmpx2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	if (compat_utmpflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		return (_compat_pututline(entry));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	getutmpx(entry, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	if ((utmpx2 = pututxline(&utmpx)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
	getutmp(utmpx2, &utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
	return (&utmpcompat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
 * "setutxent" just resets the utmpx file back to the beginning.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
setutxent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		(void) lseek(fd, 0L, SEEK_SET);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	if (fp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
		(void) fseek(fp, 0L, SEEK_SET);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	 * Zero the stored copy of the last entry read, since we are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	 * resetting to the beginning of the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	bzero(&ubuf, sizeof (ubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
 * "setutent" is a wrapper that calls setutxent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
setutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	if (compat_utmpflag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
		_compat_setutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	setutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
 * "endutxent" closes the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
endutxent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
	if (fp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
		(void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	fp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	bzero(&ubuf, sizeof (ubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
 * "endutent" is a wrapper that calls endutxent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
 * and clears the utmp compatibility buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
endutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	if (compat_utmpflag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	endutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	bzero(&utmpcompat, sizeof (utmpcompat));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
 * "utmpxname" allows the user to read a file other than the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
 * normal "utmpx" file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
utmpxname(const char *newfile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	 * Determine if the new filename will fit.  If not, return 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	if ((len = strlen(newfile)) > MAXFILE-1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	 * The name of the utmpx file has to end with 'x'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	if (newfile[len-1] != 'x')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	 * Otherwise copy in the new file name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
		(void) strcpy(&utmpxfile[0], newfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	 * Make sure everything is reset to the beginning state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	endutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	 * If the file is being changed to /etc/utmpx or /var/adm/utmpx then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	 * we clear the flag so pututxline invokes utmp_update.  Otherwise
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	 * we set the flag indicating that they changed to another name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	if (strcmp(utmpxfile, UTMPX_FILE) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	    strcmp(utmpxfile, VAR_UTMPX_FILE) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		changed_name = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
		changed_name = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
 * "utmpname" allows the user to read a file other than the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
 * normal "utmp" file. If the file specified is "/var/adm/utmp"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
 * or "/var/adm/wtmp", it is translated to the corresponding "utmpx"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
 * format name, and all "utmp" operations become wrapped calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
 * to the equivalent "utmpx" routines, with data conversions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
 * as appropriate.  In the event the application wishes to read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
 * an actual "old" utmp file (named something other than /var/adm/utmp),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
 * calling this function with that name enables backward compatibility
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
 * mode, where we actually call the old utmp routines to operate on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
 * the old file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
utmpname(const char *newfile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	char name[MAXFILE+1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	if (strlen(newfile) > MAXFILE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	if (strcmp(newfile, "/var/adm/utmp") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	    strcmp(newfile, "/var/adm/wtmp") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		(void) strcpy(name, newfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		(void) strcat(name, "x");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
		compat_utmpflag = 0;	/* turn off old compat mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		return (utmpxname(name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
		(void) strcpy(_compat_utmpfile, newfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
		compat_utmpflag = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
 * Add the record to wtmpx.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
updwtmpx(const char *filex, struct utmpx *utx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
	struct futmpx futx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
	int wfdx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
	if ((wfdx = open(filex, O_WRONLY | O_APPEND)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	(void) lseek(wfdx, 0, SEEK_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	utmpx_api2frec(utx, &futx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	(void) write(wfdx, &futx, sizeof (futx));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	(void) close(wfdx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
 * Add record to wtmp (actually wtmpx). If not updating /var/adm/wtmp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
 * use the old utmp compatibility routine to write a utmp-format
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
 * record to the file specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
updwtmp(const char *file, struct utmp *ut)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	char xfile[MAXFILE + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	if (strcmp(file, "/var/adm/wtmp") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		(void) strlcpy(xfile, file, sizeof (xfile) - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
		(void) strcat(xfile, "x");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		getutmpx(ut, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		updwtmpx((const char *)&xfile, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		_compat_updwtmp(file, ut);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
 * modutx - modify a utmpx entry.  Also notify init about new pids or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
 *	old pids that it no longer needs to care about
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
 *	args:	utp- point to utmpx structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
modutx(const struct utmpx *utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	struct utmpx utmp;		/* holding area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	struct utmpx *ucp = &utmp;	/* and a pointer to it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	struct utmpx *up;		/* "current" utmpx entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	struct futmpx *fup;		/* being examined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	for (i = 0; i < IDLEN; ++i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		if ((unsigned char)utp->ut_id[i] == SC_WILDC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	 * copy the supplied utmpx structure someplace safe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
	 */
1111
e2bd9f81a79d 6362144 gcc breaks libc by turning structure assignments into calls to memcpy()
raf
parents: 0
diff changeset
   940
	(void) memcpy(&utmp, utp, sizeof (utmp));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	setutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	while (fup = getutxent_frec()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		if (idcmp(ucp->ut_id, fup->ut_id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
		 * only get here if ids are the same, i.e. found right entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
		if (ucp->ut_pid != fup->ut_pid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
			sendpid(REMPID, (pid_t)fup->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
			sendpid(ADDPID, (pid_t)ucp->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	up = pututxline(ucp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	if (ucp->ut_type == DEAD_PROCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		sendpid(REMPID, (pid_t)ucp->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	if (up)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		updwtmpx(WTMPX_FILE, up);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	endutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	return (up);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
 * modut - modify a utmp entry.	 Also notify init about new pids or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
 *	old pids that it no longer needs to care about
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
 *	args:	utmp - point to utmp structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
modut(struct utmp *utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
	struct utmpx *utmpx2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	getutmpx(utp, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	if ((utmpx2 = modutx(&utmpx)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	getutmp(utmpx2, utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	return (utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
 * idcmp - compare two id strings, return  0 if same, non-zero if not *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
 *	args:	s1 - first id string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
 *		s2 - second id string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
idcmp(const char *s1, const char *s2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
	for (i = 0; i < IDLEN; ++i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
		if ((unsigned char) *s1 != SC_WILDC && (*s1++ != *s2++))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
 * allocid - allocate an unused id for utmp, either by recycling a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
 *	DEAD_PROCESS entry or creating a new one.  This routine only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
 *	gets called if a wild card character was specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
 *	args:	srcid - pattern for new id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
 *		saveid - last id matching pattern for a non-dead process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
allocid(char *srcid, unsigned char *saveid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
	int i;		/* scratch variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	int changed;		/* flag to indicate that a new id has */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
				/* been generated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
	char copyid[IDLEN];	/* work area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	(void) memcpy(copyid, srcid, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	changed = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	for (i = 0; i < IDLEN; ++i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		 * if this character isn't wild, it'll be part of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
		 * generated id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
		if ((unsigned char) copyid[i] != SC_WILDC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
		 * it's a wild character, retrieve the character from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
		 * saved id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
		copyid[i] = saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		 * if we haven't changed anything yet, try to find a new char
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
		 * to use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		if (!changed && (saveid[i] < MAXVAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		 * Note: this algorithm is taking the "last matched" id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
		 * and trying to make a 1 character change to it to create
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
		 * a new one.  Rather than special-case the first time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
		 * (when no perturbation is really necessary), just don't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		 * allocate the first valid id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
			while (++saveid[i] < MAXVAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
				 * make sure new char is alphanumeric
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
				if (isalnum(saveid[i])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
					copyid[i] = saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
					changed = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
			if (!changed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
				 * Then 'reset' the current count at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
				 * this position to it's lowest valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
				 * value, and propagate the carry to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
				 * the next wild-card slot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
				 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
				 * See 1113208.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
				saveid[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
				while (!isalnum(saveid[i]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
				saveid[i]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
				copyid[i] = ++saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	 * changed is true if we were successful in allocating an id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	if (changed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
		(void) memcpy(srcid, copyid, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
 * lockutx - lock utmpx file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
lockutx(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	int lockfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
	if ((lockfd = open(UTMPX_FILE, O_RDWR|O_CREAT, 0644)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	if (lockf(lockfd, F_LOCK, 0) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
		(void) close(lockfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
	tempfd = fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
	fd = lockfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
 * unlockutx - unlock utmpx file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
unlockutx(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	(void) lockf(fd, F_ULOCK, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
	fd = tempfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
 * sendpid - send message to init to add or remove a pid from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
 *	"godchild" list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
 *	args:	cmd - ADDPID or REMPID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
 *		pid - pid of "godchild"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
sendpid(int cmd, pid_t pid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	int pfd;		/* file desc. for init pipe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
	pidrec_t prec;		/* place for message to be built */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
	 * if for some reason init didn't open initpipe, open it read/write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
	 * here to avoid sending SIGPIPE to the calling process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	pfd = open(IPIPE, O_RDWR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	if (pfd < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
	prec.pd_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	prec.pd_type = cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
	(void) write(pfd, &prec, sizeof (pidrec_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
	(void) close(pfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
 * makeutx - create a utmpx entry, recycling an id if a wild card is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
 *	specified.  Also notify init about the new pid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
 *	args:	utmpx - point to utmpx structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
struct utmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
makeutx(const struct utmpx *utmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	struct utmpx *utp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	struct futmpx *ut;		/* "current" utmpx being examined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	unsigned char saveid[IDLEN];	/* the last id we matched that was */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
					/* NOT a dead proc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	int falphanum = 0x30;		/* first alpha num char */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	off_t offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	 * Are any wild card char's present in the idlen string?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	if (memchr(utmp->ut_id, SC_WILDC, IDLEN) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
		 * try to lock the utmpx file, only needed if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
		 * we're doing wildcard matching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
		if (lockutx())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
		 * used in allocid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
		(void) memset(saveid, falphanum, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
		while (ut = getoneutx(&offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
			if (idcmp(utmp->ut_id, ut->ut_id)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
				 * Found a match. We are done if this is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
				 * a free slot. Else record this id. We
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
				 * will need it to generate the next new id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
				if (ut->ut_type == DEAD_PROCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
					(void) memcpy(saveid, ut->ut_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
					    IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
		if (ut) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
			 * Unused entry, reuse it. We know the offset. So
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
			 * just go to that offset  utmpx and write it out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
			(void) memcpy((caddr_t)utmp->ut_id, ut->ut_id, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
			putoneutx(utmp, offset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
			updwtmpx(WTMPX_FILE, (struct utmpx *)utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
			unlockutx();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
			sendpid(ADDPID, (pid_t)utmp->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
			return ((struct utmpx *)utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
			 * nothing available, allocate an id and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
			 * write it out at the end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
			if (allocid((char *)utmp->ut_id, saveid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
				unlockutx();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
				 * Seek to end and write out the entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
				 * and also update the utmpx file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
				(void) lseek(fd, 0L, SEEK_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
				offset = lseek(fd, 0L, SEEK_CUR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
				putoneutx(utmp, offset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
				updwtmpx(WTMPX_FILE, (struct utmpx *)utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
				unlockutx();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
				sendpid(ADDPID, (pid_t)utmp->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
				return ((struct utmpx *)utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
		utp = pututxline(utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
		if (utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
			updwtmpx(WTMPX_FILE, utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
		endutxent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
		sendpid(ADDPID, (pid_t)utmp->ut_pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
		return (utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
 * makeut - create a utmp entry, recycling an id if a wild card is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
 *	specified.  Also notify init about the new pid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
 *	args:	utmp - point to utmp structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
makeut(struct utmp *utmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
	struct utmpx utmpx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	struct utmpx *utmpx2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	if (compat_utmpflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		return (_compat_makeut(utmp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	getutmpx(utmp, &utmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	if ((utmpx2 = makeutx(&utmpx)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
	getutmp(utmpx2, utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
	return (utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
#define	UTMPNBUF	200	/* Approx 8k (FS Block) size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
static struct futmpx	*utmpbuf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
 * Buffered read routine to get one entry from utmpx file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
static struct futmpx *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
getoneutx(off_t *off)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
	static	size_t idx = 0;	/* Current index in the utmpbuf */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
	static	size_t nidx = 0;	/* Max entries in this utmpbuf */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
	static	int nbuf = 0;	/* number of utmpbufs read from disk */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
	ssize_t	nbytes, bufsz = sizeof (struct futmpx) * UTMPNBUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	if (utmpbuf == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
		if ((utmpbuf = malloc(bufsz)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
			perror("malloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	if (idx == nidx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
		 *	We have read all entries in the utmpbuf. Read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
		 *	the buffer from the disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
		if ((nbytes = read(fd, utmpbuf, bufsz)) < bufsz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
			 *	Partial read only. keep count of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
			 *	number of valid entries in the buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
			nidx = nbytes / sizeof (struct futmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
			 *	We read in the full UTMPNBUF entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
			 *	Great !
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
			nidx = UTMPNBUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
		nbuf++;		/* Number of buf we have read in. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
		idx = 0;	/* reset index within utmpbuf */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
	 *	Current offset of this buffer in the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
	*off = (((nbuf - 1) * UTMPNBUF) + idx) * sizeof (struct futmpx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
	if (idx < nidx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
		 *	We still have at least one valid buffer in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
		 *	utmpbuf to be passed to the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
		return (&utmpbuf[idx++]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	 *	Reached EOF. Return NULL. Offset is set correctly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	 *	to append at the end of the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
putoneutx(const struct utmpx *utpx, off_t off)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
	struct	futmpx futx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	utmpx_api2frec(utpx, &futx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	(void) lseek(fd, off, SEEK_SET);	/* seek in the utmpx file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	(void) write(fd, &futx, sizeof (futx));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
 * sendupid - send message to utmpd to add or remove a pid from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
 *	list of procs to watch
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
 *	args:	cmd - ADDPID or REMPID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
 *		pid - process ID of process to watch
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
sendupid(int cmd, pid_t pid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	int pfd;		/* file desc. for utmp pipe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	pidrec_t prec;		/* place for message to be built */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	 * if for some reason utmp didn't open utmppipe, open it read/write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	 * here to avoid sending SIGPIPE to the calling process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
	pfd = open(UPIPE, O_RDWR | O_NONBLOCK | O_NDELAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
	if (pfd < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	prec.pd_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	prec.pd_type = cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	(void) write(pfd, &prec, sizeof (pidrec_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	(void) close(pfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
 * getutmpx - convert a utmp record into a utmpx record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
getutmpx(const struct utmp *ut, struct utmpx *utx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	(void) memcpy(utx->ut_user, ut->ut_user, sizeof (ut->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	(void) bzero(&utx->ut_user[sizeof (ut->ut_user)],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	    sizeof (utx->ut_user) - sizeof (ut->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	(void) memcpy(utx->ut_line, ut->ut_line, sizeof (ut->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	(void) bzero(&utx->ut_line[sizeof (ut->ut_line)],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	    sizeof (utx->ut_line) - sizeof (ut->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	(void) memcpy(utx->ut_id, ut->ut_id, sizeof (ut->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	utx->ut_pid = ut->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	utx->ut_type = ut->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	utx->ut_exit = ut->ut_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	utx->ut_tv.tv_sec = ut->ut_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	utx->ut_tv.tv_usec = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	utx->ut_session = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
	bzero(utx->pad, sizeof (utx->pad));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	bzero(utx->ut_host, sizeof (utx->ut_host));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	utx->ut_syslen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
 * getutmp - convert a utmpx record into a utmp record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
getutmp(const struct utmpx *utx, struct utmp *ut)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
	(void) memcpy(ut->ut_user, utx->ut_user, sizeof (ut->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
	(void) memcpy(ut->ut_line, utx->ut_line, sizeof (ut->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	(void) memcpy(ut->ut_id, utx->ut_id, sizeof (utx->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	ut->ut_pid = utx->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	ut->ut_type = utx->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	ut->ut_exit = utx->ut_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	ut->ut_time = utx->ut_tv.tv_sec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
}