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