Cleaned up externcmd_allocate and externcmd_free
This commit is contained in:
@ -82,36 +82,33 @@ int tokenize_arguments(char* argstr, char** argv)
|
|||||||
*/
|
*/
|
||||||
EXTERNCMD* externcmd_allocate(char* argstr)
|
EXTERNCMD* externcmd_allocate(char* argstr)
|
||||||
{
|
{
|
||||||
EXTERNCMD* cmd;
|
EXTERNCMD* cmd = NULL;
|
||||||
|
|
||||||
if(argstr == NULL)
|
if (argstr && (cmd = (EXTERNCMD*) malloc(sizeof(EXTERNCMD))) &&
|
||||||
return NULL;
|
(cmd->argv = malloc(sizeof(char*) * MAXSCALE_EXTCMD_ARG_MAX)))
|
||||||
|
|
||||||
if((cmd = (EXTERNCMD*)malloc(sizeof(EXTERNCMD))) != NULL)
|
|
||||||
{
|
{
|
||||||
if(tokenize_arguments(argstr,cmd->parameters) == -1)
|
if (tokenize_arguments(argstr, cmd->argv) == 0)
|
||||||
{
|
{
|
||||||
free(cmd);
|
if (access(cmd->argv[0], X_OK) != 0)
|
||||||
return NULL;
|
{
|
||||||
}
|
if (access(cmd->argv[0], F_OK) != 0)
|
||||||
if(access(cmd->parameters[0],F_OK) != 0)
|
{
|
||||||
{
|
skygw_log_write(LE, "Error: Cannot find file: %s", cmd->argv[0]);
|
||||||
skygw_log_write(LE,
|
}
|
||||||
"Error: Cannot find file: %s",
|
else
|
||||||
cmd->parameters[0]);
|
{
|
||||||
externcmd_free(cmd);
|
skygw_log_write(LE, "Error: Cannot execute file '%s'. Missing "
|
||||||
return NULL;
|
"execution permissions.", cmd->argv[0]);
|
||||||
}
|
}
|
||||||
|
externcmd_free(cmd);
|
||||||
if(access(cmd->parameters[0],X_OK) != 0)
|
cmd = NULL;
|
||||||
{
|
}
|
||||||
skygw_log_write(LE,
|
}
|
||||||
"Error: Cannot execute file '%s'. Missing execution permissions.",
|
else
|
||||||
cmd->parameters[0]);
|
{
|
||||||
externcmd_free(cmd);
|
externcmd_free(cmd);
|
||||||
return NULL;
|
cmd = NULL;
|
||||||
}
|
}
|
||||||
skygw_log_write(LT, "Executing script %s.", cmd->parameters[0]);
|
|
||||||
}
|
}
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
@ -122,13 +119,15 @@ EXTERNCMD* externcmd_allocate(char* argstr)
|
|||||||
*/
|
*/
|
||||||
void externcmd_free(EXTERNCMD* cmd)
|
void externcmd_free(EXTERNCMD* cmd)
|
||||||
{
|
{
|
||||||
int i;
|
if (cmd)
|
||||||
|
|
||||||
for(i = 0;cmd->parameters[i] != NULL;i++)
|
|
||||||
{
|
{
|
||||||
free(cmd->parameters[i]);
|
for (int i = 0; cmd->argv[i]; i++)
|
||||||
|
{
|
||||||
|
free(cmd->argv[i]);
|
||||||
|
}
|
||||||
|
free(cmd->argv);
|
||||||
|
free(cmd);
|
||||||
}
|
}
|
||||||
free(cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -147,13 +146,13 @@ int externcmd_execute(EXTERNCMD* cmd)
|
|||||||
{
|
{
|
||||||
char errbuf[STRERROR_BUFLEN];
|
char errbuf[STRERROR_BUFLEN];
|
||||||
skygw_log_write(LOGFILE_ERROR,"Error: Failed to execute command '%s', fork failed: [%d] %s",
|
skygw_log_write(LOGFILE_ERROR,"Error: Failed to execute command '%s', fork failed: [%d] %s",
|
||||||
cmd->parameters[0],errno,strerror_r(errno, errbuf, sizeof(errbuf)));
|
cmd->argv[0],errno,strerror_r(errno, errbuf, sizeof(errbuf)));
|
||||||
rval = -1;
|
rval = -1;
|
||||||
}
|
}
|
||||||
else if(pid == 0)
|
else if(pid == 0)
|
||||||
{
|
{
|
||||||
/** Child process, execute command */
|
/** Child process, execute command */
|
||||||
execvp(cmd->parameters[0],cmd->parameters);
|
execvp(cmd->argv[0],cmd->argv);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
#define MAXSCALE_EXTCMD_ARG_MAX 256
|
#define MAXSCALE_EXTCMD_ARG_MAX 256
|
||||||
|
|
||||||
typedef struct extern_cmd_t{
|
typedef struct extern_cmd_t{
|
||||||
char* parameters[MAXSCALE_EXTCMD_ARG_MAX]; /*< Command arguments */
|
char** argv; /*< Argument vector for the command, first being the actual command
|
||||||
|
* being executed. */
|
||||||
int n_exec; /*< Number of times executed */
|
int n_exec; /*< Number of times executed */
|
||||||
pid_t child; /*< PID of the child process */
|
pid_t child; /*< PID of the child process */
|
||||||
}EXTERNCMD;
|
}EXTERNCMD;
|
||||||
|
Reference in New Issue
Block a user