Mercurial > illumos > onarm
diff usr/src/cmd/fs.d/cachefs/cfstagchk/cfstagchk.c @ 0:c9caec207d52 b86
Initial porting based on b86
author | Koji Uno <koji.uno@sun.com> |
---|---|
date | Tue, 02 Jun 2009 18:56:50 +0900 |
parents | |
children | 1a15d5aaf794 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/fs.d/cachefs/cfstagchk/cfstagchk.c Tue Jun 02 18:56:50 2009 +0900 @@ -0,0 +1,188 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)cfstagchk.c 1.7 05/06/08 SMI" + +/* + * ----------------------------------------------------------------- + * + * cfstagchk.c + * + * Cache FS admin utility. Used to read and/or write a + * cache tag from/to the specified partition. + */ + +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <ctype.h> +#include <stdarg.h> +#include <sys/param.h> +#include <sys/types.h> +#include <sys/vtoc.h> + +void pr_err(char *fmt, ...); +void usage(char *); + +/* + * ----------------------------------------------------------------- + * + * main + * + * Description: + * Main routine for the cfstagchk program + * Arguments: + * argc number of command line arguments + * argv command line arguments + * Returns: + * Returns 0 for failure, > 0 for an error. + * Preconditions: + */ + +int +main(int argc, char **argv) +{ + int c; + int which; + + char *path; + + int wflag; + int fd, err, slice; + struct vtoc vtoc; + struct partition *p; + + /* verify root running command */ + if (getuid() != 0) { + pr_err(gettext("must be run by root")); + return (1); + } + + (void) setlocale(LC_ALL, ""); +#if !defined(TEXT_DOMAIN) +#define TEXT_DOMAIN "SYS_TEST" +#endif + (void) textdomain(TEXT_DOMAIN); + + /* set defaults for command line options */ + wflag = 0; + + /* parse the command line arguments */ + while ((c = getopt(argc, argv, "w")) != EOF) { + switch (c) { + + case 'w': /* write */ + wflag = 1; + break; + + default: + usage(gettext("illegal option")); + return (1); + } + } + argc -= optind; + argv += optind; + if (argc != 1) { + usage(gettext("must specify a single device")); + return (1); + } + + fd = open(*argv, O_RDWR); + if (fd < 0) { + pr_err("can't open %s", *argv); + return (1); + } + + slice = read_vtoc(fd, &vtoc); + if (slice < 0) { + pr_err(gettext("can't read vtoc")); + return (1); + } + p = &vtoc.v_part[slice]; + if (!wflag) { + err = 0; + if (p->p_tag != V_CACHE) + err++; + } else { + p->p_tag = V_CACHE; + err = write_vtoc(fd, &vtoc); + if (err < 0) + pr_err(gettext("write_vtoc failure")); + } + return (err); +} + +/* + * ----------------------------------------------------------------- + * + * usage + * + * Description: + * Prints a usage message for this utility. + * Arguments: + * msgp message to include with the usage message + * Returns: + * Preconditions: + * precond(msgp) + */ + +void +usage(char *msgp) +{ + fprintf(stderr, gettext("cfstagchk: %s\n"), msgp); + fprintf(stderr, gettext("usage: cfstagchk [-w] device\n")); +} + +/* + * ----------------------------------------------------------------- + * + * pr_err + * + * Description: + * Prints an error message to stderr. + * Arguments: + * fmt printf style format + * ... arguments for fmt + * Returns: + * Preconditions: + * precond(fmt) + */ + +void +pr_err(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + (void) fprintf(stderr, gettext("cfstagchk: ")); + (void) vfprintf(stderr, fmt, ap); + (void) fprintf(stderr, "\n"); + va_end(ap); +}