/*
 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.  
 * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
 *
 * This file is part of LVM2.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License v.2.1.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef _LVM_EXEC_H
#define _LVM_EXEC_H

#include "lib.h"

struct cmd_context;

/**
 * Execute command with paramaters and return status
 *
 * \param rstatus
 * Returns command's exit status code.
 *
 * \param sync_needed
 * Bool specifying whether local devices needs to be synchronized
 * before executing command.
 * Note: You cannot synchronize devices within activation context.
 *
 * \return
 * 1 (success) or 0 (failure).
 */
int exec_cmd(struct cmd_context *cmd, const char *const argv[],
	     int *rstatus, int sync_needed);


struct FILE;
struct pipe_data {
	FILE *fp;
	pid_t pid;
};

/**
 * popen() like function to read-only output from executed command
 * without running shell.
 *
 * \param argv
 * Arguments for execvp.
 *
 * \param sync_needed
 * Bool specifying whether local devices needs to be synchronized
 * before executing command.
 * Note: You cannot synchronize devices within activation context.
 *
 * \param pdata
 * Arguments to store data needed for pclose_exec().
 *
 * \return
 * 1 (success) or 0 (failure).
 */
FILE *pipe_open(struct cmd_context *cmd, const char *const argv[],
		int sync_needed, struct pipe_data *pdata);

int pipe_close(struct pipe_data *pdata);

#endif
