/*
 * Copyright (C) Tildeslash Ltd. All rights reserved.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * In addition, as a special exception, the copyright holders give
 * permission to link the code of portions of this program with the
 * OpenSSL library under certain conditions as described in each
 * individual source file, and distribute linked combinations
 * including the two.
 *
 * You must obey the GNU Affero General Public License in all respects
 * for all of the code used other than OpenSSL.  
 */


#ifndef COMMAND_INCLUDED
#define COMMAND_INCLUDED
#include <system/Process.h>
#include <util/List.h>


/**
 * A <b>Command</b> creates operating system processes. Each Command instance
 * manages a collection of process attributes. The Command_execute() method
 * creates a new sub-process with those attributes and the method can be invoked
 * repeatedly from the same instance to create new sub-processes with identical
 * or related attributes.
 *
 * Modifying a Command's attributes will affect processes subsequently created,
 * but will never affect previously created processes or the calling process
 * itself.
 *
 * @see Process.h
 * @see http://www.mmonit.com/
 * @file
 */


#define T Command_T
typedef struct T *T;
/** 
 * Default Path for Command: <code>PATH=/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin</code>. 
 * May be overridden by Command_setEnv() 
 */
extern const char *Command_Path;


/**
 * Create a new Command object and set the operating system program with
 * arguments to execute. The <code>arg0</code> argument is the first argument
 * in a sequence of arguments to the program. The arguments list can be thought
 * of as arg0, arg1, ..., argn. Together they describe a list of one or more
 * pointers to null-terminated strings that represent the argument list 
 * available to the executed program specified in <code>path</code>. The 
 * list of arguments <em style="color:red">must</em> be terminated by a
 * NULL pointer. Example:
 * <pre>
 * Command_new("/bin/ls", NULL)
 * Command_new("/bin/ls", "-lrt", NULL)
 * Command_new("/bin/sh", "-c", "ps -aef|egrep mmonit", NULL)
 * </pre>
 * @param path A string containing the path to the program to execute
 * @param arg0 The first argument in a sequence of arguments. The last value
 * in the arguments list <strong>must</strong> be NULL.
 * @exception AssertException if the program does not exist or cannot be
 * executed
 * @return This Command object
 */
T Command_new(const char *path, const char *arg0, ...);


/**
 * Destroy A Command object and release allocated resources. Call this
 * method to release a Command object allocated with Command_new()
 * @param C A Command object reference
 */
void Command_free(T *C);


/** @name Properties */
//@{

/**
 * Set the user id the sub-process should switch to on exec. If not set, the uid of 
 * the calling process is used. Note that this process must run with super-user
 * privileges for the sub-process to be able to switch uid
 * @param C A Command object
 * @param uid The user id the sub-process should switch to when executed
 */
void Command_setUid(T C, uid_t uid);


/**
 * Returns the uid the sub-process should switch to on exec. 
 * @param C A Command object
 * @return The user id the sub-process should use. Returns 0
 * if not set, meaning the sub-process will run with the same
 * uid as this process.
 */
uid_t Command_getUid(T C);


/**
 * Set the group id the sub-process should switch to on exec. If not set, the gid of 
 * the calling process is used. Note that this process must run with super-user
 * privileges for the sub-process to be able to switch gid
 * @param C A Command object
 * @param gid The group id the sub-process should switch to when executed
 */
void Command_setGid(T C, gid_t gid);


/**
 * Returns the group id the Command should switch to on exec. 
 * @param C A Command object
 * @return The group id the sub-process should use. Returns 0
 * if not set, meaning the sub-process will run with the same
 * gid as this process.
 */
gid_t Command_getGid(T C);


/**
 * Set the working directory for the sub-process. If directory cannot be changed
 * the sub-process will exit
 * @param C A Command object
 * @param dir The working directory for the sub-process
 * @exception AssertException if the directory does not exist or is not accessible
 */
void Command_setDir(T C, const char *dir);


/**
 * Returns the working directory for the sub-process. Unless previously
 * set, the returned value is NULL, meaning the calling process's current
 * directory
 * @param C A Command object
 * @return The working directory for the sub-process or NULL meaning the calling
 * process's current directory
 */
const char *Command_getDir(T C);


/**
 * Set or replace the environment variable identified by <code>name</code>.
 * The sub-process does <em>not</em> inherit the environment from the calling 
 * process and has only a spartan PATH set by default.
 * @param C A Command object
 * @param name The environment variable to set or replace
 * @param value The value
 */
void Command_setEnv(T C, const char *name, const char *value);


/**
 * Set or replace the environment variable(s) specified in <code>env</code>.
 * The <code>env</code> string is expected to be on a name=value; format
 * and each name=value pair must be separated with ';'. This is a
 * convenience function, wrapping Command_setEnv() and is rather inefficient.
 * @param C A Command object
 * @param env An environment string containing name=value pairs separated 
 * with ';'. Example: <code>PATH=/usr/bin; SHELL=/bin/bash;</code>
 * @see Command_setEnv()
 */
void Command_vSetEnv(T C, const char *env, ...);


/**
 * Returns the value of the environment variable identified by 
 * <code>name</code>. 
 * @param C A Command object
 * @param name The environment variable to get the value of
 * @return The value for name or NULL if name was not found
 */
const char *Command_getEnv(T C, const char *name);



/**
 * Returns the operating system program with arguments to be executed by 
 * this Command. The first element in the list is the path to the program
 * and subsequent elements are arguments to the program. Elements in the 
 * list are C-strings. 
 * @param C A Command object
 * @return A list with the operating system program with arguments to 
 * execute. The first element in the list is the program.
 */
List_T Command_getCommand(T C);


//@}


/** 
 * Create a new sub-process using the attributes of this Command object.
 * The new sub-process will execute the command and arguments given in 
 * Command_new(). The caller is responsible for releasing the returned
 * Process_T object by calling Process_free(). If creating the new 
 * sub-process failed, NULL is returned and errno is set to indicate the
 * error. Use e.g. System_getLastError() to get a description of the error
 * that occured.
 * @param C A Command object
 * @return A new Process_T object representing the sub-process or NULL
 * if execute failed.
 */
Process_T Command_execute(T C);


#undef T
#endif

