usr/src/lib/libvolmgt/common/volmgt_on_private.c
author jmcp <James.McPherson@Sun.COM>
Thu, 30 Apr 2009 20:04:06 -0700
changeset 9521 b061a79d3d1a
parent 9519 fc2830e2f3c4
child 9694 78fafb281255
permissions -rw-r--r--
backout 6795209/6392640: breaks sparc build
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
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
    23
 * Use is subject to license terms.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
    27
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 * routines in this module are meant to be called by other libvolmgt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * routines only
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
#include	<stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include	<string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include	<dirent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include	<fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include	<string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include	<errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include	<libintl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include	<limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include	<unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include	<stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include	<volmgt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include	<sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include	<sys/mkdev.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	<sys/dkio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include	<sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include	<sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include	<sys/mnttab.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include	"volmgt_private.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#define	NULL_PATH		"/dev/null"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * This is an ON Consolidation Private interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 * Is the specified path mounted?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 * This function is really inadequate for ejection testing.  For example,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 * I could have /dev/fd0a mounted and eject /dev/fd0c, and it would be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 * ejected.  There needs to be some better way to make this check, although
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * short of looking up the mounted dev_t in the kernel mount table and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 * building in all kinds of knowledge into this function,  I'm not sure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 * how to do it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
_dev_mounted(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
{
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
    75
	static int	vol_getmntdev(FILE *, struct mnttab *, dev_t,
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
    76
			    struct dk_cinfo *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	int		fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	struct dk_cinfo	info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	static FILE 	*fp = NULL;		/* mnttab file pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	struct mnttab	mnt;			/* set bug not used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	char		*cn = NULL;		/* char spcl pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	struct stat64	sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	int		ret_val = 0;
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
	/* ensure we have the block spcl pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	if ((cn = (char *)volmgt_getfullrawname(path)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
    91
	if ((fp = fopen(MNTTAB, "rF")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		/* mtab is gone... let him go */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	if ((fd = open(cn, O_RDONLY|O_NDELAY)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	if (fstat64(fd, &sb) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	if (ioctl(fd, DKIOCINFO, &info) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	if (vol_getmntdev(fp, &mnt, sb.st_rdev, &info) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		ret_val = 1;			/* match found! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
dun:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	if (cn != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	if (fp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		(void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	if (fd >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 * This is an ON Consolidation Private interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 * Forks off rmmount and (in essence) returns the result
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * a return value of 0 (FALSE) means failure, non-zero (TRUE) means success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
_dev_unmount(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
{
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   136
	static int	call_unmount_prog(int, int, char *, int, char *,
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   137
			    char *);
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   138
	static int	get_media_info(char *, char **, int *, char **);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	char		*bn = NULL;		/* block name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	char		*mtype = NULL;		/* media type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	char		*spcl = NULL;		/* special dev. path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	char		*spcl_failed = NULL;	/* spcl that failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	int		ret_val = FALSE;	/* what we return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	char		*vr;			/* volmgt root dir */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	int		media_info_gotten = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	int		mnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	int		volume_is_not_managed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	char		*pathbuf, *absname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	if ((bn = (char *)volmgt_getfullblkname(path)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	if ((pathbuf = malloc(PATH_MAX+1)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	absname = bn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	if (realpath(bn, pathbuf) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		absname = pathbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	volume_is_not_managed = !volmgt_running() ||
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   163
		(!volmgt_ownspath(absname) && volmgt_symname(bn) == NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	free(pathbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	/* decide of we should use rmmount to unmount the media */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	if (!volume_is_not_managed) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		int		use_rmm = FALSE;	/* use rmmount??  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		/* at least volmgt is running */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		vr = (char *)volmgt_root();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		if (strncmp(bn, vr, strlen(vr)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
			/* the block path is rooted in /vol */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
			use_rmm = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		/* try to get info about media */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		media_info_gotten = get_media_info(bn, &mtype, &mnum, &spcl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		ret_val = call_unmount_prog(media_info_gotten, use_rmm, mtype,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		    mnum, spcl, bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		/* volmgt is *not* running */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		if (get_media_info(bn, &mtype, &mnum, &spcl)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
			 * volmgt is off and get_media_info() has returned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
			 * info on the media -- soo (this is kinda' a hack)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			 * ... we iterate, looking for multiple slices
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
			 * of (say) a floppy being mounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
			 * note: if an unmount fails we don't want to try
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
			 * to unmount the same device on the next try, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			 * we try to watch for that
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
			do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
				 * don't call the unmount program is we're just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
				 * trying to unmount the same device that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
				 * failed last time -- if that's the case,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
				 * then bail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
				if (spcl_failed != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
					if (strcmp(spcl, spcl_failed) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
						break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
				ret_val = call_unmount_prog(TRUE, FALSE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
				    mtype, mnum, spcl, bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
				if (!ret_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
					/* save spcl device name that failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
					spcl_failed = strdup(spcl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
					 * unmount succeeded, so clean up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
					if (spcl_failed != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
						free(spcl_failed);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
						spcl_failed = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			} while (get_media_info(bn, &mtype, &mnum, &spcl));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
			/* just do the unmmount cycle once */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
			ret_val = call_unmount_prog(FALSE, FALSE, NULL, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			    NULL, bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	if (mtype != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		free(mtype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	if (spcl != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		free(spcl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	if (spcl_failed != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		free(spcl_failed);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	if (bn != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		free(bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
dun:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
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
 * find a mnttab entry that has the same dev as the supplied dev,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
 *  returning it and a non-zero value if found, else returning 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
 * this is just like getmntany(), except that it scans based on st_rdev,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 * and it even finds different slices on the same device/unit (thanx to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 * code copied from format.c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
vol_getmntdev(FILE *fp, struct mnttab *mp, dev_t dev, struct dk_cinfo *ip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	int		fd;		/* dev-in-question fd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	struct stat64	sb;		/* dev-in-question stat struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	int		ret_val = 0;	/* default value: no match found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	char		*cn;		/* char pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	struct dk_cinfo	dkinfo;		/* for testing for slices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	denter(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	    "vol_getmntdev: entering for %d.%d, ctype/cnum/unit = %d/%d/%d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	    (int)major(dev), (int)minor(dev), ip->dki_ctype, ip->dki_cnum,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	    ip->dki_unit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	/* reset the mnttab -- just in case */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	rewind(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	/* scan each entry in mnttab */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	while (getmntent(fp, mp) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		/* don't even try unless it's a local pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		if (mp->mnt_special[0] != '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		/* get char pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		if ((cn = volmgt_getfullrawname(mp->mnt_special)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		if (cn[0] == NULLC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
			continue;	/* couldn't get raw name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		/* open the device */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		if ((fd = open(cn, O_RDONLY|O_NDELAY)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			/* if we can't open it *assume* it's not a match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			continue;
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
		/* stat the device */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		if (fstat64(fd, &sb) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
			continue;	/* ain't there: can't be a match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		/* ensure we have a spcl device (a double check) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		if (!S_ISBLK(sb.st_mode) && !S_ISCHR(sb.st_mode)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		/* (almost) finally -- check the dev_t for equality */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		if (sb.st_rdev == dev) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
			ret_val = 1;		/* match found! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		}
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
		 * check that the major numbers match, since if they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		 * don't then there's no reason to use the DKIOCINFO
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		 * ioctl to see if we have to major/minor pairs that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		 * really point to the same device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		if (major(sb.st_rdev) != major(dev)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
			/* no use continuing, since major devs are different */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		/* one last check -- for diff. slices of the same dev/unit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		if (ioctl(fd, DKIOCINFO, &dkinfo) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		free(cn);		/* all done with raw pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		(void) close(fd);	/* all done with file descriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		/* if ctrler type/number and unit match, it's a match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		if ((ip->dki_ctype == dkinfo.dki_ctype) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		    (ip->dki_cnum == dkinfo.dki_cnum) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		    (ip->dki_unit == dkinfo.dki_unit)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
			 * even though minor numbers differ we have a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
			 * match
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
			ret_val = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		/* go around again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
vol_basename(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	char	*cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	/* check for the degenerate case */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	if (strcmp(path, "/") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		return (path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	/* look for the last slash in the name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	if ((cp = strrchr(path, '/')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		/* no slash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		return (path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	/* ensure something is after the slash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	if (*++cp != NULLC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		return (cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	/* a name that ends in slash -- back up until previous slash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	while (cp != path) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		if (*--cp == '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
			return (--cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	/* the only slash is the end of the name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	return (path);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
get_media_info(char *path, char **mtypep, int *mnump, char **spclp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
{
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   412
	static int	vol_getmntdev(FILE *, struct mnttab *, dev_t,
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   413
			    struct dk_cinfo *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	FILE		*fp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	int		fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	char		*cn = NULL;		/* char spcl pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	struct stat64	sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	struct dk_cinfo	info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	struct mnttab	mnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	int		ret_val = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   422
	if ((fp = fopen(MNTTAB, "rF")) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		/* mtab is gone... let him go */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	/* get char spcl pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	if ((cn = volmgt_getfullrawname(path)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	if (cn[0] == NULLC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	if ((fd = open(cn, O_RDONLY|O_NDELAY)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		goto dun;
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
	if (fstat64(fd, &sb) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	if (ioctl(fd, DKIOCINFO, &info) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		goto dun;
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
	/* if we found the entry then disect it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	if (vol_getmntdev(fp, &mnt, sb.st_rdev, &info) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		char		*cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		char		*mtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		char		*mnt_dir;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		int		mtype_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		DIR		*dirp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		struct dirent64	*dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		char		*volname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		/* return the spcl device name found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		*spclp = strdup(mnt.mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		 * try to get the media type (e.g. "floppy") from the mount
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		 * point (e.g. "/floppy/NAME") if vold is running
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		if (!volmgt_running() ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		    (!volmgt_ownspath(*spclp) &&
9521
b061a79d3d1a backout 6795209/6392640: breaks sparc build
jmcp <James.McPherson@Sun.COM>
parents: 9519
diff changeset
   468
			volmgt_symname(*spclp) == NULL)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			ret_val = TRUE;		/* success (if limited) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
			goto dun;
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
		/* get the first part of the mount point (e.g. "floppy") */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		cp = mnt.mnt_mountp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		if (*cp++ != '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
			goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		mtype = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		if ((cp = strchr(mtype, '/')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		*cp++ = NULLC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		mnt_dir = mnt.mnt_mountp;	/* save dir path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		/* get the volume name (e.g. "unnamed_floppy") */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		volname = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		/* scan for the symlink that points to our volname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		if ((dirp = opendir(mnt_dir)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
			goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		mtype_len = strlen(mtype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		while ((dp = readdir64(dirp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
			char		lpath[2 * (MAXNAMELEN+1)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
			char		linkbuf[MAXPATHLEN+4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
			int		lb_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
			struct stat64	sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
			if (strncmp(dp->d_name, mtype, mtype_len) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
				continue;	/* not even close */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			(void) sprintf(lpath, "%s/%s", mnt_dir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			    dp->d_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
			if (lstat64(lpath, &sb) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
				continue;	/* what? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			if (!S_ISLNK(sb.st_mode)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
				continue;	/* not our baby */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			if ((lb_len = readlink(lpath, linkbuf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
			    sizeof (linkbuf))) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
			linkbuf[lb_len] = NULLC; /* null terminate */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
			if ((cp = vol_basename(linkbuf)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			/* now we have the name! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
			if (strcmp(cp, volname) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
				/* found it !! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
				if (sscanf(dp->d_name + mtype_len, "%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
				    mnump) == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
					*mtypep = strdup(mtype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
					ret_val = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		(void) closedir(dirp);
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
dun:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	if (fp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		(void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	if (fd >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	if (cn != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		free(cn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	if (ret_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
		dexit("get_media_info: returning mtype=%s, mnum=%d, spcl=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
		    *mtypep == NULL ? "<null ptr>" : *mtypep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
		    *mnump,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		    *spclp == NULL ? "<null ptr>" : *spclp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		dexit("get_media_info: FAILED\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
 * call the appropriate unmount program, returning its success (TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
 * or failure (FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
call_unmount_prog(int mi_gotten, int use_rmm, char *mtype, int mnum,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
    char *spcl, char *bn)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	pid_t		pid;			/* forked proc's pid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	int		ret_val = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	const char	*etc_umount = "/etc/umount";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	const char	*rmm = "/usr/sbin/rmmount";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	int		rval;			/* proc's return value */
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
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	denter(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	"call_unmount_prog(%s, %s, \"%s\", %d, \"%s\", \"%s\"): entering\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	    mi_gotten ? "TRUE" : "FALSE", use_rmm ? "TRUE" : "FALSE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	    mtype ? mtype : "<null ptr>", mnum, spcl ? spcl : "<null ptr>",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	    bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	/* create a child to unmount the path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	if ((pid = fork()) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		goto dun;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	if (pid == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		/* the child */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
#ifndef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		int		xfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		char		env_buf[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
#ifndef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		/* get rid of those nasty err messages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		if ((xfd = open(NULL_PATH, O_RDWR)) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
			(void) dup2(xfd, fileno(stdin));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
			(void) dup2(xfd, fileno(stdout));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			(void) dup2(xfd, fileno(stderr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		if (use_rmm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
			/* set up environment vars */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			(void) putenv("VOLUME_ACTION=eject");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
			(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
			if (mi_gotten) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
				(void) sprintf(env_buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
				    "VOLUME_MEDIATYPE=%s", mtype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
				(void) sprintf(env_buf, "VOLUME_SYMDEV=%s%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
				    mtype, mnum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
				(void) sprintf(env_buf, "VOLUME_PATH=%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
				    spcl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
				(void) sprintf(env_buf, "VOLUME_NAME=%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
				    vol_basename(spcl));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
				(void) sprintf(env_buf, "VOLUME_PATH=%s", bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
				(void) sprintf(env_buf, "VOLUME_NAME=%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
				    vol_basename(bn));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
				(void) putenv(strdup(env_buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
			dprintf("call_unmount_prog: calling \"%s -D\"\n", rmm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
			(void) execl(rmm, rmm, "-D", NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			(void) execl(rmm, rmm, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			dprintf("call_unmount_prog: calling \"%s %s\"\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			    etc_umount, mi_gotten ? spcl : bn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			(void) execl(etc_umount, etc_umount,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			    mi_gotten ? spcl : bn,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			    NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		exit(-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	/* wait for the umount command to exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	if (waitpid(pid, &rval, 0) == pid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		if (WIFEXITED(rval)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
			if (WEXITSTATUS(rval) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				ret_val = TRUE;	/* success */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		}
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
dun:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
}