main.c revision 7d593912b33208f97b6a9b5aa18d6bc0227c8a67
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (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
* 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 2015 Nexenta Systems, Inc. All rights reserved.
*/
#include <locale.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "dconf.h"
#include "minfree.h"
#include "utils.h"
static const char USAGE[] = "\
Usage: %s [-enuy] [-c kernel | curproc | all ] [-d dump-device | swap ]\n\
[-m min {k|m|%%} ] [-s savecore-dir] [-r root-dir] [-z on|off]\n";
static const char OPTS[] = "einuyc:d:m:s:r:z:";
static const char PATH_DEVICE[] = "/dev/dump";
static const char PATH_CONFIG[] = "/etc/dumpadm.conf";
int
{
int c;
int dflag = 0; /* for checking in use during -d ops */
int eflag = 0; /* print estimated dump size */
int modified = 0; /* have we modified the dump config? */
int chrooted = 0;
int douuid = 0;
(void) textdomain(TEXT_DOMAIN);
/*
* Take an initial lap through argv hunting for -r root-dir,
* so that we can chroot before opening the configuration file.
* We also handle -u and any bad options at this point.
*/
else if (c == 'u')
else if (c == '?') {
return (E_USAGE);
}
}
return (E_USAGE);
}
}
if (geteuid() != 0)
/*
* If no config file exists yet, we're going to create an empty one,
* so set the modified flag to force writing out the file.
*/
modified++;
/*
* Now open and read in the initial values from the config file.
* If it doesn't exist, we create an empty file and dc is
* initialized with the default values.
*/
return (E_ERROR);
/*
* Take another lap through argv, processing options and
* modifying the dumpconf_t as appropriate.
*/
switch (c) {
case 'c':
return (E_USAGE);
modified++;
break;
case 'd':
return (E_USAGE);
dflag++;
modified++;
break;
case 'e':
eflag++;
break;
case 'i':
/* undocumented option */
if (chrooted) {
"used together\n"));
return (E_USAGE);
}
douuid++;
break;
case 'm':
break;
case 'n':
modified++;
break;
case 's':
"directory\n"), optarg);
return (E_USAGE);
}
return (E_USAGE);
modified++;
break;
case 'y':
modified++;
break;
case 'z':
return (E_USAGE);
modified++;
break;
}
}
}
if (eflag) {
else
}
if (douuid)
return (E_USAGE);
return (E_ERROR);
}
if (dcmode == DC_OVERRIDE) {
/*
* In override mode, we try to force an update. If this
* fails, we re-load the kernel configuration and write that
* out to the file in order to force the file in sync.
*
* We allow the file to be read-only but print a warning to the
* user that indicates it hasn't been updated.
*/
(void) dconf_getdev(&dc);
if (dc.dc_readonly)
"%s is read-only\n"), PATH_CONFIG);
return (E_ERROR);
} else if (modified) {
/*
* If we're modifying the configuration, then try
* to update it, and write out the file if successful.
*/
if (dc.dc_readonly) {
"read-only\n"), PATH_CONFIG);
return (E_ERROR);
}
return (E_ERROR);
}
if (dcmode == DC_CURRENT)
return (E_SUCCESS);
}