usr/src/lib/libdiskmgt/common/inuse_fs.c
author sjelinek
Thu, 27 Oct 2005 09:01:18 -0700
changeset 767 0aa24dfb5d87
parent 0 68f95e015346
child 871 f917b2ed7d21
permissions -rw-r--r--
PSARC 2004/776 device checking for fs utilities PSARC 2005/461 Device in use checking environment variables 5084421 libdiskmgt needs to detect in use ZFS data 5085739 remove workaround for bug 4725434 6194015 Device in use checking for Solaris utilities-PSARC/2004/776 6261853 libdiskmgt does not work correctly in all cases on amd64 6268374 libdiskmgt allocates incorrect size for readdir_r() dirent argument 6291309 PSARC/2005/461 - libdiskmgt should enable bypassing of inuse checking 6301815 PSARC/2005/461-Need Sun private libdiskmgt flag for use during install to disable sysevent starting
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
    23
 * Copyright 2005 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
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <dirent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/vfstab.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/fs/ufs_fs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include "libdiskmgt.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include "disks_private.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * The list of filesystem heuristic programs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
struct heuristic {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	struct heuristic	*next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	char			*prog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	char			*type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
struct vfstab_list {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	char	*special;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	char	*mountp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	struct vfstab_list 	*next;
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
static struct vfstab_list	*vfstab_listp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static	mutex_t	vfstab_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
static	time_t	timestamp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
static struct heuristic	*hlist = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
static int		initialized = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
static mutex_t		init_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
static int	has_fs(char *prog, char *slice);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
static int	load_heuristics();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
static int	add_use_record(struct vfstab *vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
static int	load_vfstab();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static void	free_vfstab(struct vfstab_list *listp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 * Use the heuristics to check for a filesystem on the slice.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
inuse_fs(char *slice, nvlist_t *attrs, int *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	struct 	heuristic	*hp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	time_t	curr_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	int	found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	*errp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	if (slice == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	    return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	 * We get the list of heuristic programs one time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	(void) mutex_lock(&init_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	if (!initialized) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	    *errp = load_heuristics();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	    if (*errp == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		initialized = 1;
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
	(void) mutex_unlock(&init_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	/* Run each of the heuristics. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	for (hp = hlist; hp; hp = hp->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	    if (has_fs(hp->prog, slice)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		libdiskmgt_add_str(attrs, DM_USED_BY, DM_USE_FS, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		libdiskmgt_add_str(attrs, DM_USED_NAME, hp->type, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	if (*errp != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		return (found);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	 * Second heuristic used is the check for an entry in vfstab
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	(void) mutex_lock(&vfstab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	curr_time = time(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	if (timestamp < curr_time && (curr_time - timestamp) > 60) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
		free_vfstab(vfstab_listp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
		*errp = load_vfstab();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		timestamp = curr_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	if (*errp == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	    struct vfstab_list	*listp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	    listp = vfstab_listp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	    while (listp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		if (strcmp(slice, listp->special) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		    char *mountp = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		    if (listp->mountp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			mountp = listp->mountp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		    libdiskmgt_add_str(attrs, DM_USED_BY, DM_USE_VFSTAB, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		    libdiskmgt_add_str(attrs, DM_USED_NAME, mountp, errp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		    found = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		listp = listp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	(void) mutex_unlock(&vfstab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	return (found);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
has_fs(char *prog, char *slice)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	pid_t	pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	int	loc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	mode_t	mode = S_IRUSR | S_IWUSR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	switch ((pid = fork1())) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	    /* child process */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	    closefrom(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	    (void) open("/dev/null", O_WRONLY, mode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	    (void) open("/dev/null", O_WRONLY, mode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	    (void) execl(prog, "fstyp", slice, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	    _exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	case -1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	    return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	    /* parent process */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	(void) waitpid(pid, &loc, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	if (WIFEXITED(loc) && WEXITSTATUS(loc) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	    return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	return (0);
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * Create a list of filesystem heuristic programs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
load_heuristics()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	DIR	*dirp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	if ((dirp = opendir("/usr/lib/fs")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	    struct dirent   *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	    while ((dp = readdir(dirp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		char		path[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		struct stat	buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		DIR		*subdirp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		/* skip known dirs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		if (strcmp(dp->d_name, ".") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
		    strcmp(dp->d_name, "..") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		    continue;
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
		(void) snprintf(path, sizeof (path), "/usr/lib/fs/%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		    dp->d_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		if (stat(path, &buf) != 0 || !(buf.st_mode & S_IFDIR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		    continue;
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
		if ((subdirp = opendir(path)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		    struct dirent   *sdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		    while ((sdp = readdir(subdirp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			if (strcmp(sdp->d_name, "fstyp") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			    char progpath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			    (void) snprintf(progpath, sizeof (progpath),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
				"/usr/lib/fs/%s/fstyp", dp->d_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			    if (stat(progpath, &buf) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
				buf.st_mode & S_IFREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
				struct heuristic *hp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
				hp = (struct heuristic *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
				    malloc(sizeof (struct heuristic));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
				if (hp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
				    (void) closedir(subdirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
				    (void) closedir(dirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
				    return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
				if ((hp->prog = strdup(progpath)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
				    (void) closedir(subdirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
				    (void) closedir(dirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				    return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
				if ((hp->type = strdup(dp->d_name)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
				    (void) closedir(subdirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
				    (void) closedir(dirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
				    return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				hp->next = hlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				hlist = hp;
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
			    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		    (void) closedir(subdirp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	    (void) closedir(dirp);
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
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
load_vfstab()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	FILE	*fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	struct	vfstab vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	int	status = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	fp = fopen(VFSTAB, "r");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	if (fp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	    (void) memset(&vp, 0, sizeof (struct vfstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	    while (getvfsent(fp, &vp) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		    status = add_use_record(&vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		    if (status != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			(void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
			return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		(void) memset(&vp, 0, sizeof (struct vfstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	    (void) fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	    status = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	return (status);
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
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
add_use_record(struct vfstab *vp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	struct 	vfstab_list	*vfsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	vfsp = (struct vfstab_list *)malloc(sizeof (struct vfstab_list));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	if (vfsp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	    return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	vfsp->special = strdup(vp->vfs_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	if (vfsp->special == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	    free(vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	    return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	if (vp->vfs_mountp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	    vfsp->mountp = strdup(vp->vfs_mountp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	    if (vfsp->mountp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		free(vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		return (ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	    vfsp->mountp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	vfsp->next = vfstab_listp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	vfstab_listp = vfsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
free_vfstab(struct vfstab_list *listp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	struct vfstab_list	*nextp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	while (listp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	    nextp = listp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	    free((void *)listp->special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	    free((void *)listp->mountp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	    free((void *)listp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	    listp = nextp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	vfstab_listp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
}