c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe/*
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * CDDL HEADER START
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * The contents of this file are subject to the terms of the
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * Common Development and Distribution License, Version 1.0 only
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * (the "License"). You may not use this file except in compliance
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * with the License.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * or http://www.opensolaris.org/os/licensing.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * See the License for the specific language governing permissions
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * and limitations under the License.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * When distributing Covered Code, include this CDDL HEADER in each
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * CDDL HEADER END
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe */
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe/*
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe * Use is subject to license terms.
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe */
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#pragma ident "%Z%%M% %I% %E% SMI"
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <stdio.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <stdlib.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <errno.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <string.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <meta.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <sys/types.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <sys/mkdev.h>
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe#include <sys/stat.h>
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov#include <limits.h>
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov#include <svm.h>
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov/*
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * FUNCTION: valid_bootlist
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * INPUT: file pointer, line buffer, line_length
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * RETURN VALUES:
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * 0 - SUCCESS
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * -1 - FAIL
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov */
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankovint
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankovvalid_bootlist(FILE *fp, int line_len)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov{
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov char *bp = NULL;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov char *line;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov /*
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * errno may not be cleared by callee routines and we
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * we want to catch fgets failures hence errno is reset.
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov */
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov errno = 0;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if ((line = malloc(line_len)) == NULL)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov return (RET_ERROR);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov while (fgets(line, line_len, fp) != NULL) {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov bp = strstr(line, "mddb_bootlist");
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (bp != NULL) {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov /* if not commented out then breakout */
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (*line != '*' && *line != '#') {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov break;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov free(line);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (bp == NULL || errno != 0)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov return (RET_ERROR);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov return (RET_SUCCESS);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov}
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov/*
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * FUNCTION: svm_check
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * Check the existance of DiskSuite or SVM
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * INPUT: rootpath
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * RETURN VALUES:
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * 0 - SUCCESS
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * -1 - FAIL
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov */
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankovint
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankovsvm_check(char *path)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov{
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov FILE *fp;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov char tmppath[PATH_MAX];
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov int rval;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov (void) strcat(strcpy(tmppath, path), MD_CONF);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if ((fp = fopen(tmppath, "r")) == NULL) {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov rval = errno;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov goto free_exit;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov rval = valid_bootlist(fp, MDDB_BOOTLIST_MAX_LEN);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov debug_printf("svm_check(): valid bootlist in %s. status %d\n",
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov tmppath, rval);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (rval == RET_SUCCESS) {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov goto free_exit;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov (void) fclose(fp);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov /* not found in md.conf try etc/system */
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov (void) strcat(strcpy(tmppath, path), SYSTEM_FILE);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if ((fp = fopen(tmppath, "r")) == NULL) {
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov rval = errno;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov goto free_exit;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov }
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov rval = valid_bootlist(fp, MDDB_BOOTLIST_MAX_LEN);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov debug_printf("svm_check(): valid bootlist in %s. status %d\n",
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov tmppath, rval);
free_exit:
(void) fclose(fp);
if (rval > 0)
rval = RET_ERROR;
return (rval);
}
/*
* FUNCTION: svm_is_md
* Check if the the given device name has an md driver.
* INPUT: special device name (/dev/dsk/c0t0d0s0 or /dev/md/dsk/d10)
*
* RETURN:
* 1 - if it is a metadevice.
* 0 - if it is not a metadevice.
*/
int
svm_is_md(char *device_name)
{
char buf[30];
struct stat sbuf;
int rval = 0;
(void) memset(buf, 0, 30);
debug_printf("svm_is_md(): device %s\n", device_name);
if (stat(device_name, &sbuf) != 0)
return (RET_ERROR);
if (get_drv_name(major(sbuf.st_rdev), "/", buf) == RET_ERROR) {
debug_printf("svm_is_md(): device get_drv_name failed: %s\n",
device_name);
return (0);
}
if (strcmp(buf, MD_MODULE) == 0) {
debug_printf("svm_is_md(): device %s succeed\n", device_name);
rval = 1;
}
return (rval);
}