usr/src/lib/libc/port/gen/getut.c
author raf
Mon, 10 Apr 2006 12:27:38 -0700
changeset 1778 6357a59054f7
parent 0 68f95e015346
child 1914 8a8c5f225b1b
permissions -rw-r--r--
6404383 select() behaviour changed in Solaris 10, breaking binary compatibility
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
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
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * Compatibility routines to read and write alternate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * utmp-like files.  These routines are only used in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * the case where utmpname() is used to change to a file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * other than /var/adm/utmp or /var/adm/wtmp.  In this case,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * we assume that someone really wants to read old utmp-format
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * files.  Otherwise, the getutent, setutent, getutid, setutline,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * and pututline functions are actually wrappers around the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * equivalent function operating on utmpx-like files.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <utmpx.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <utime.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	IDLEN	4	/* length of id field in utmp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	SC_WILDC	0xff	/* wild char for utmp ids */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#define	MAXVAL	255	/* max value for an id 'character' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#ifdef ut_time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#undef ut_time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
static void	utmp_frec2api(const struct futmp *, struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
static void	utmp_api2frec(const struct utmp *, struct futmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
struct utmp 	*_compat_getutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
struct utmp	*_compat_getutid(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
struct utmp	*_compat_getutline(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
struct utmp	*_compat_pututline(const struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
void		_compat_setutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
void		_compat_endutent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
void		_compat_updwtmp(const char *, struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
struct utmp	*_compat_makeut(struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
struct utmp	*_compat_modut(struct utmp *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static void	unlockut(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static int	idcmp(const char *, const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static int	allocid(char *, unsigned char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static int	lockut(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static int fd = -1;	/* File descriptor for the utmp file. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * name of the current utmp-like file - set by utmpname (getutx.c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * only if running in backward compatibility mode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
extern const char _compat_utmpfile[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
#ifdef ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
static long loc_utmp;	/* Where in "utmp" the current "ubuf" was found. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
static struct futmp fubuf;	/* Copy of last entry read in. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
static struct utmp ubuf;	/* Last entry returned to client */
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
 * In the 64-bit world, the utmp data structure grows because of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 * the ut_time field (a time_t) at the end of it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
utmp_frec2api(const struct futmp *src, struct utmp *dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	if (src == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	(void) strncpy(dst->ut_user, src->ut_user, sizeof (dst->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	(void) strncpy(dst->ut_line, src->ut_line, sizeof (dst->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	(void) memcpy(dst->ut_id, src->ut_id, sizeof (dst->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	dst->ut_pid = src->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	dst->ut_type = src->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	dst->ut_exit.e_termination = src->ut_exit.e_termination;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	dst->ut_exit.e_exit = src->ut_exit.e_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	dst->ut_time = (time_t)src->ut_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
utmp_api2frec(const struct utmp *src, struct futmp *dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	if (src == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	(void) strncpy(dst->ut_user, src->ut_user, sizeof (dst->ut_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	(void) strncpy(dst->ut_line, src->ut_line, sizeof (dst->ut_line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	(void) memcpy(dst->ut_id, src->ut_id, sizeof (dst->ut_id));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	dst->ut_pid = src->ut_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	dst->ut_type = src->ut_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	dst->ut_exit.e_termination = src->ut_exit.e_termination;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	dst->ut_exit.e_exit = src->ut_exit.e_exit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	dst->ut_time = (time32_t)src->ut_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
 * "getutent_frec" gets the raw version of the next entry in the utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
static struct futmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
getutent_frec(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	 * If the "utmp" file is not open, attempt to open it for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	 * reading.  If there is no file, attempt to create one.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	 * both attempts fail, return NULL.  If the file exists, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	 * isn't readable and writeable, do not attempt to create.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		if ((fd = open(_compat_utmpfile, O_RDWR|O_CREAT, 0644)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			 * If the open failed for permissions, try opening
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			 * it only for reading.  All "pututline()" later
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			 * will fail the writes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
			if ((fd = open(_compat_utmpfile, O_RDONLY)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	/* Try to read in the next entry from the utmp file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	if (read(fd, &fubuf, sizeof (fubuf)) != sizeof (fubuf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	/* Save the location in the file where this entry was found. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	(void) lseek(fd, 0L, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	return (&fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 * "_compat_getutent" gets the next entry in the utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
_compat_getutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	struct futmp *futp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	futp = getutent_frec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	if (futp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 * "_compat_getutid" finds the specified entry in the utmp file.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 * it can't find it, it returns NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
_compat_getutid(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	short type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	utmp_api2frec(&ubuf, &fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	 * Start looking for entry.  Look in our current buffer before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	 * reading in new entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
		 * If there is no entry in "ubuf", skip to the read.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		if (fubuf.ut_type != EMPTY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
			switch (entry->ut_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
			 * Do not look for an entry if the user sent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			 * us an EMPTY entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
			case EMPTY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
			 * For RUN_LVL, BOOT_TIME, DOWN_TIME,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			 * OLD_TIME, and NEW_TIME entries, only the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
			 * types have to match.  If they do, return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			 * the address of internal buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			case RUN_LVL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			case BOOT_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			case DOWN_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			case OLD_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			case NEW_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
				if (entry->ut_type == fubuf.ut_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
					utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
					return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			 * For INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			 * and DEAD_PROCESS the type of the entry in "fubuf",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			 * must be one of the above and id's must match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
			case INIT_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			case LOGIN_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			case USER_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			case DEAD_PROCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
				if (((type = fubuf.ut_type) == INIT_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				    type == LOGIN_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				    type == USER_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
				    type == DEAD_PROCESS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
				    fubuf.ut_id[0] == entry->ut_id[0] &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
				    fubuf.ut_id[1] == entry->ut_id[1] &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
				    fubuf.ut_id[2] == entry->ut_id[2] &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
				    fubuf.ut_id[3] == entry->ut_id[3]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
					utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
					return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			/* Do not search for illegal types of entry. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	} while (getutent_frec() != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	/* the proper entry wasn't found. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
 * "_compat_getutline" searches the "utmp" file for a LOGIN_PROCESS or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 * USER_PROCESS with the same "line" as the specified "entry".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
_compat_getutline(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	utmp_api2frec(&ubuf, &fubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		 * If the current entry is the one we are interested in,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		 * return a pointer to it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		if (fubuf.ut_type != EMPTY &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		    (fubuf.ut_type == LOGIN_PROCESS ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		    fubuf.ut_type == USER_PROCESS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		    strncmp(&entry->ut_line[0], &fubuf.ut_line[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		    sizeof (fubuf.ut_line)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
			return (&ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	} while (getutent_frec() != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
 * "_compat_pututline" writes the structure sent into the utmp file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
 * If there is already an entry with the same id, then it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
 * overwritten, otherwise a new entry is made at the end of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
 * utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
_compat_pututline(const struct utmp *entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	int fc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	struct utmp *answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	struct utmp tmpbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	struct futmp ftmpbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	 * Copy the user supplied entry into our temporary buffer to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	 * avoid the possibility that the user is actually passing us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	 * the address of "ubuf".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	tmpbuf = *entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	utmp_api2frec(entry, &ftmpbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	(void) getutent_frec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#ifdef	ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		gdebug("pututline: Unable to create utmp file.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	/* Make sure file is writable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	if ((fc = fcntl(fd, F_GETFL, NULL)) == -1 || (fc & O_RDWR) != O_RDWR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		return (NULL);
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
	 * Find the proper entry in the utmp file.  Start at the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	 * location.  If it isn't found from here to the end of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	 * file, then reset to the beginning of the file and try again.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	 * If it still isn't found, then write a new entry at the end of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	 * the file.  (Making sure the location is an integral number of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	 * utmp structures into the file incase the file is scribbled.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	if (_compat_getutid(&tmpbuf) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
#ifdef	ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		gdebug("1st getutid() failed. fd: %d", fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		_compat_setutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		if (_compat_getutid(&tmpbuf) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
#ifdef	ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
			loc_utmp = lseek(fd, 0L, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			gdebug("2nd getutid() failed. fd: %d loc_utmp: %ld\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
			    fd, loc_utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
			(void) fcntl(fd, F_SETFL, fc | O_APPEND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			(void) lseek(fd, -(long)sizeof (struct futmp), 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		(void) lseek(fd, -(long)sizeof (struct futmp), 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	 * Write out the user supplied structure.  If the write fails,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	 * then the user probably doesn't have permission to write the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	 * utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	if (write(fd, &ftmpbuf, sizeof (ftmpbuf)) != sizeof (ftmpbuf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
#ifdef	ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		gdebug("pututline failed: write-%d\n", errno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		answer = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		 * Copy the new user structure into ubuf so that it will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		 * be up to date in the future.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		fubuf = ftmpbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		utmp_frec2api(&fubuf, &ubuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		answer = &ubuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
#ifdef	ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		gdebug("id: %c%c loc: %ld\n", fubuf.ut_id[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		    fubuf.ut_id[1], fubuf.ut_id[2], fubuf.ut_id[3],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		    loc_utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	(void) fcntl(fd, F_SETFL, fc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	return (answer);
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
 * "_compat_setutent" just resets the utmp file back to the beginning.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
_compat_setutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		(void) lseek(fd, 0L, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	 * Zero the stored copy of the last entry read, since we are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	 * resetting to the beginning of the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	bzero(&ubuf, sizeof (ubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
 * "_compat_endutent" closes the utmp file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
_compat_endutent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	bzero(&ubuf, sizeof (ubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	bzero(&fubuf, sizeof (fubuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 * If one of wtmp and wtmpx files exist, create the other, and the record.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
 * If they both exist add the record.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
_compat_updwtmp(const char *file, struct utmp *ut)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	struct futmp fut;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	fd = open(file, O_WRONLY | O_APPEND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		if ((fd = open(file, O_WRONLY|O_CREAT, 0644)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	(void) lseek(fd, 0, 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	utmp_api2frec(ut, &fut);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	(void) write(fd, &fut, sizeof (fut));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 * makeut - create a utmp entry, recycling an id if a wild card is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 *	specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 *	args:	utmp - point to utmp structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
_compat_makeut(struct utmp *utmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	struct utmp *utp;	/* "current" utmp entry being examined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	int wild;		/* flag, true iff wild card char seen */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	/* the last id we matched that was NOT a dead proc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	unsigned char saveid[IDLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	wild = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	for (i = 0; i < IDLEN; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		if ((unsigned char)utmp->ut_id[i] == SC_WILDC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
			wild = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	if (wild) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		 * try to lock the utmp file, only needed if we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		 * doing wildcard matching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		if (lockut())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		_compat_setutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		/* find the first alphanumeric character */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		for (i = 0; i < MAXVAL; ++i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			if (isalnum(i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		(void) memset(saveid, i, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		while ((utp = _compat_getutent()) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			if (idcmp(utmp->ut_id, utp->ut_id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
			if (utp->ut_type == DEAD_PROCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
			(void) memcpy(saveid, utp->ut_id, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		if (utp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
			 * found an unused entry, reuse it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			(void) memcpy(utmp->ut_id, utp->ut_id, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			utp = _compat_pututline(utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			if (utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
				_compat_updwtmp(WTMP_FILE, utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
			_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			unlockut();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
			return (utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			 * nothing available, try to allocate an id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			if (allocid(utmp->ut_id, saveid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
				_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
				unlockut();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
				utp = _compat_pututline(utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
				if (utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
					_compat_updwtmp(WTMP_FILE, utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
				_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
				unlockut();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
				return (utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		utp = _compat_pututline(utmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
		if (utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			_compat_updwtmp(WTMP_FILE, utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		return (utp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
 * _compat_modut - modify a utmp entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 *	args:	utmp - point to utmp structure to be created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
struct utmp *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
_compat_modut(struct utmp *utp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	int i;					/* scratch variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	struct utmp utmp;			/* holding area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	struct utmp *ucp = &utmp;		/* and a pointer to it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	struct utmp *up;	/* "current" utmp entry being examined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	struct futmp *fup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	for (i = 0; i < IDLEN; ++i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		if ((unsigned char)utp->ut_id[i] == SC_WILDC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	/* copy the supplied utmp structure someplace safe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	utmp = *utp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	_compat_setutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	while (fup = getutent_frec()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
		if (idcmp(ucp->ut_id, fup->ut_id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	up = _compat_pututline(ucp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	if (up)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		_compat_updwtmp(WTMP_FILE, up);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	_compat_endutent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	return (up);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
 * idcmp - compare two id strings, return 0 if same, non-zero if not *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
 *	args:	s1 - first id string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
 *		s2 - second id string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
idcmp(const char *s1, const char *s2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	for (i = 0; i < IDLEN; ++i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		if ((unsigned char)*s1 != SC_WILDC && (*s1++ != *s2++))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
 * allocid - allocate an unused id for utmp, either by recycling a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
 *	DEAD_PROCESS entry or creating a new one.  This routine only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
 *	gets called if a wild card character was specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
 *	args:	srcid - pattern for new id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
 *		saveid - last id matching pattern for a non-dead process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
allocid(char *srcid, unsigned char *saveid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	int i;		/* scratch variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	int changed;	/* flag to indicate that a new id has been generated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	char copyid[IDLEN];	/* work area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	(void) memcpy(copyid, srcid, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	changed = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	for (i = 0; i < IDLEN; ++i) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		 * if this character isn't wild, it'll
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		 * be part of the generated id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		if ((unsigned char) copyid[i] != SC_WILDC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		 * it's a wild character, retrieve the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
		 * character from the saved id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		copyid[i] = saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		 * if we haven't changed anything yet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		 * try to find a new char to use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
		if (!changed && (saveid[i] < MAXVAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
 * Note: this algorithm is taking the "last matched" id and trying to make
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
 * a 1 character change to it to create a new one.  Rather than special-case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
 * the first time (when no perturbation is really necessary), just don't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
 * allocate the first valid id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			while (++saveid[i] < MAXVAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
				/* make sure new char is alphanumeric */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
				if (isalnum(saveid[i])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
					copyid[i] = saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
					changed = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			if (!changed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
				 * Then 'reset' the current count at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
				 * this position to it's lowest valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
				 * value, and propagate the carry to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
				 * the next wild-card slot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
				 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
				 * See 1113208.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
				saveid[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
				while (!isalnum(saveid[i]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
					saveid[i]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
				copyid[i] = ++saveid[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	/* changed is true if we were successful in allocating an id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	if (changed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
		(void) memcpy(srcid, copyid, IDLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
}
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
 * lockut - lock utmp file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
lockut(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	if ((fd = open(_compat_utmpfile, O_RDWR|O_CREAT, 0644)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	if (lockf(fd, F_LOCK, 0) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
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
 * unlockut - unlock utmp file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
unlockut(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	(void) lockf(fd, F_ULOCK, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
#ifdef  ERRDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
#include <stdarg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
gdebug(const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	FILE *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	int errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	va_list ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	if ((fp = fopen("/etc/dbg.getut", "a+")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	va_start(ap, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	(void) vfprintf(fp, fmt, ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	va_end(ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	(void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
#endif