xref: /dflybsd-src/contrib/lvm2/dist/tools/lvmcmdlib.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*	$NetBSD: lvmcmdlib.c,v 1.1.1.3 2009/12/02 00:25:51 haad Exp $	*/
286d7f5d3SJohn Marino 
386d7f5d3SJohn Marino /*
486d7f5d3SJohn Marino  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
586d7f5d3SJohn Marino  * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
686d7f5d3SJohn Marino  *
786d7f5d3SJohn Marino  * This file is part of LVM2.
886d7f5d3SJohn Marino  *
986d7f5d3SJohn Marino  * This copyrighted material is made available to anyone wishing to use,
1086d7f5d3SJohn Marino  * modify, copy, or redistribute it subject to the terms and conditions
1186d7f5d3SJohn Marino  * of the GNU Lesser General Public License v.2.1.
1286d7f5d3SJohn Marino  *
1386d7f5d3SJohn Marino  * You should have received a copy of the GNU Lesser General Public License
1486d7f5d3SJohn Marino  * along with this program; if not, write to the Free Software Foundation,
1586d7f5d3SJohn Marino  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1686d7f5d3SJohn Marino  */
1786d7f5d3SJohn Marino 
1886d7f5d3SJohn Marino #include "tools.h"
1986d7f5d3SJohn Marino #include "lvm2cmdline.h"
2086d7f5d3SJohn Marino #include "label.h"
2186d7f5d3SJohn Marino #include "memlock.h"
2286d7f5d3SJohn Marino #include "lvm-version.h"
2386d7f5d3SJohn Marino 
2486d7f5d3SJohn Marino #include "lvm2cmd.h"
2586d7f5d3SJohn Marino 
2686d7f5d3SJohn Marino #include <signal.h>
2786d7f5d3SJohn Marino #include <syslog.h>
2886d7f5d3SJohn Marino #include <libgen.h>
2986d7f5d3SJohn Marino #include <sys/stat.h>
3086d7f5d3SJohn Marino #include <time.h>
3186d7f5d3SJohn Marino #include <sys/resource.h>
3286d7f5d3SJohn Marino 
cmdlib_lvm2_init(unsigned static_compile)3386d7f5d3SJohn Marino void *cmdlib_lvm2_init(unsigned static_compile)
3486d7f5d3SJohn Marino {
3586d7f5d3SJohn Marino 	struct cmd_context *cmd;
3686d7f5d3SJohn Marino 
3786d7f5d3SJohn Marino 	lvm_register_commands();
3886d7f5d3SJohn Marino 
3986d7f5d3SJohn Marino 	init_is_static(static_compile);
4086d7f5d3SJohn Marino 	if (!(cmd = init_lvm()))
4186d7f5d3SJohn Marino 		return NULL;
4286d7f5d3SJohn Marino 
4386d7f5d3SJohn Marino 	return (void *) cmd;
4486d7f5d3SJohn Marino }
4586d7f5d3SJohn Marino 
lvm2_run(void * handle,const char * cmdline)4686d7f5d3SJohn Marino int lvm2_run(void *handle, const char *cmdline)
4786d7f5d3SJohn Marino {
4886d7f5d3SJohn Marino 	int argc, ret, oneoff = 0;
4986d7f5d3SJohn Marino 	char *args[MAX_ARGS], **argv, *cmdcopy = NULL;
5086d7f5d3SJohn Marino 	struct cmd_context *cmd;
5186d7f5d3SJohn Marino 
5286d7f5d3SJohn Marino 	argv = args;
5386d7f5d3SJohn Marino 
5486d7f5d3SJohn Marino 	if (!handle) {
5586d7f5d3SJohn Marino 		oneoff = 1;
5686d7f5d3SJohn Marino 		if (!(handle = lvm2_init())) {
5786d7f5d3SJohn Marino 			log_error("Handle initialisation failed.");
5886d7f5d3SJohn Marino 			return ECMD_FAILED;
5986d7f5d3SJohn Marino 		}
6086d7f5d3SJohn Marino 	}
6186d7f5d3SJohn Marino 
6286d7f5d3SJohn Marino 	cmd = (struct cmd_context *) handle;
6386d7f5d3SJohn Marino 
6486d7f5d3SJohn Marino 	cmd->argv = argv;
6586d7f5d3SJohn Marino 
6686d7f5d3SJohn Marino 	if (!(cmdcopy = dm_strdup(cmdline))) {
6786d7f5d3SJohn Marino 		log_error("Cmdline copy failed.");
6886d7f5d3SJohn Marino 		ret = ECMD_FAILED;
6986d7f5d3SJohn Marino 		goto out;
7086d7f5d3SJohn Marino 	}
7186d7f5d3SJohn Marino 
7286d7f5d3SJohn Marino 	if (lvm_split(cmdcopy, &argc, argv, MAX_ARGS) == MAX_ARGS) {
7386d7f5d3SJohn Marino 		log_error("Too many arguments.  Limit is %d.", MAX_ARGS);
7486d7f5d3SJohn Marino 		ret = EINVALID_CMD_LINE;
7586d7f5d3SJohn Marino 		goto out;
7686d7f5d3SJohn Marino 	}
7786d7f5d3SJohn Marino 
7886d7f5d3SJohn Marino 	if (!argc) {
7986d7f5d3SJohn Marino 		log_error("No command supplied");
8086d7f5d3SJohn Marino 		ret = EINVALID_CMD_LINE;
8186d7f5d3SJohn Marino 		goto out;
8286d7f5d3SJohn Marino 	}
8386d7f5d3SJohn Marino 
8486d7f5d3SJohn Marino 	/* FIXME Temporary - move to libdevmapper */
8586d7f5d3SJohn Marino 	ret = ECMD_PROCESSED;
8686d7f5d3SJohn Marino 	if (!strcmp(cmdline, "_memlock_inc"))
8786d7f5d3SJohn Marino 		memlock_inc_daemon();
8886d7f5d3SJohn Marino 	else if (!strcmp(cmdline, "_memlock_dec"))
8986d7f5d3SJohn Marino 		memlock_dec_daemon();
9086d7f5d3SJohn Marino 	else
9186d7f5d3SJohn Marino 		ret = lvm_run_command(cmd, argc, argv);
9286d7f5d3SJohn Marino 
9386d7f5d3SJohn Marino       out:
9486d7f5d3SJohn Marino 	dm_free(cmdcopy);
9586d7f5d3SJohn Marino 
9686d7f5d3SJohn Marino 	if (oneoff)
9786d7f5d3SJohn Marino 		lvm2_exit(handle);
9886d7f5d3SJohn Marino 
9986d7f5d3SJohn Marino 	return ret;
10086d7f5d3SJohn Marino }
10186d7f5d3SJohn Marino 
lvm2_log_level(void * handle,int level)10286d7f5d3SJohn Marino void lvm2_log_level(void *handle, int level)
10386d7f5d3SJohn Marino {
10486d7f5d3SJohn Marino 	struct cmd_context *cmd = (struct cmd_context *) handle;
10586d7f5d3SJohn Marino 
10686d7f5d3SJohn Marino 	cmd->default_settings.verbose = level - VERBOSE_BASE_LEVEL;
10786d7f5d3SJohn Marino 
10886d7f5d3SJohn Marino 	return;
10986d7f5d3SJohn Marino }
11086d7f5d3SJohn Marino 
lvm2_log_fn(lvm2_log_fn_t log_fn)11186d7f5d3SJohn Marino void lvm2_log_fn(lvm2_log_fn_t log_fn)
11286d7f5d3SJohn Marino {
11386d7f5d3SJohn Marino 	init_log_fn(log_fn);
11486d7f5d3SJohn Marino }
11586d7f5d3SJohn Marino 
lvm2_exit(void * handle)11686d7f5d3SJohn Marino void lvm2_exit(void *handle)
11786d7f5d3SJohn Marino {
11886d7f5d3SJohn Marino 	struct cmd_context *cmd = (struct cmd_context *) handle;
11986d7f5d3SJohn Marino 
12086d7f5d3SJohn Marino 	lvm_fin(cmd);
12186d7f5d3SJohn Marino }
122