|
Packit Service |
a4b2a9 |
/* ----------------------------------------------------------------------- *
|
|
Packit Service |
a4b2a9 |
*
|
|
Packit Service |
a4b2a9 |
* args.c - argument vector handling.
|
|
Packit Service |
a4b2a9 |
*
|
|
Packit Service |
a4b2a9 |
* Copyright 2006 Ian Kent <raven@themaw.net> - All Rights Reserved
|
|
Packit Service |
a4b2a9 |
*
|
|
Packit Service |
a4b2a9 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a4b2a9 |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a4b2a9 |
* the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
|
|
Packit Service |
a4b2a9 |
* USA; either version 2 of the License, or (at your option) any later
|
|
Packit Service |
a4b2a9 |
* version; incorporated herein by reference.
|
|
Packit Service |
a4b2a9 |
*
|
|
Packit Service |
a4b2a9 |
* ----------------------------------------------------------------------- */
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
#include <stdlib.h>
|
|
Packit Service |
a4b2a9 |
#include <string.h>
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
#include "automount.h"
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
/*
|
|
Packit Service |
a4b2a9 |
* Add entry to arg vector - argc is new arg vector size
|
|
Packit Service |
a4b2a9 |
* NOTE: this outine will free the passed in argv vector
|
|
Packit Service |
a4b2a9 |
* upon success.
|
|
Packit Service |
a4b2a9 |
*/
|
|
Packit Service |
a4b2a9 |
char **add_argv(int argc, char **argv, char *str)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
char **vector;
|
|
Packit Service |
a4b2a9 |
size_t vector_size;
|
|
Packit Service |
a4b2a9 |
int i;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector_size = (argc + 1) * sizeof(char *);
|
|
Packit Service |
a4b2a9 |
vector = (char **) malloc(vector_size);
|
|
Packit Service |
a4b2a9 |
if (!vector)
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
for (i = 0; i < argc - 1; i++) {
|
|
Packit Service |
a4b2a9 |
if (argv[i]) {
|
|
Packit Service |
a4b2a9 |
vector[i] = strdup(argv[i]);
|
|
Packit Service |
a4b2a9 |
if (!vector[i]) {
|
|
Packit Service |
a4b2a9 |
logerr("failed to strdup arg");
|
|
Packit Service |
a4b2a9 |
break;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
} else
|
|
Packit Service |
a4b2a9 |
vector[i] = NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (i < argc - 1) {
|
|
Packit Service |
a4b2a9 |
free_argv(argc - 1, (const char **) vector);
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector[argc - 1] = strdup(str);
|
|
Packit Service |
a4b2a9 |
if (!vector[argc - 1]) {
|
|
Packit Service |
a4b2a9 |
free_argv(argc - 1, (const char **) vector);
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector[argc] = NULL;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
free_argv(argc - 1, (const char **) argv);
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
return vector;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
char **append_argv(int argc1, char **argv1, int argc2, char **argv2)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
char **vector;
|
|
Packit Service |
a4b2a9 |
size_t vector_size;
|
|
Packit Service |
a4b2a9 |
int len, i, j;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
len = argc1 + argc2;
|
|
Packit Service |
a4b2a9 |
vector_size = (len + 1) * sizeof(char *);
|
|
Packit Service |
a4b2a9 |
vector = (char **) realloc(argv1, vector_size);
|
|
Packit Service |
a4b2a9 |
if (!vector) {
|
|
Packit Service |
a4b2a9 |
free_argv(argc1, (const char **) argv1);
|
|
Packit Service |
a4b2a9 |
free_argv(argc2, (const char **) argv2);
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
for (i = argc1, j = 0; i <= len; i++, j++) {
|
|
Packit Service |
a4b2a9 |
if (argv2[j]) {
|
|
Packit Service |
a4b2a9 |
vector[i] = strdup(argv2[j]);
|
|
Packit Service |
a4b2a9 |
if (!vector[i]) {
|
|
Packit Service |
a4b2a9 |
logerr("failed to strdup arg");
|
|
Packit Service |
a4b2a9 |
break;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
} else
|
|
Packit Service |
a4b2a9 |
vector[i] = NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (i < len) {
|
|
Packit Service |
a4b2a9 |
free_argv(len, (const char **) vector);
|
|
Packit Service |
a4b2a9 |
free_argv(argc2, (const char **) argv2);
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector[len] = NULL;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
free_argv(argc2, (const char **) argv2);
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
return vector;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
const char **copy_argv(int argc, const char **argv)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
char **vector;
|
|
Packit Service |
a4b2a9 |
size_t vector_size;
|
|
Packit Service |
a4b2a9 |
int i;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector_size = (argc + 1) * sizeof(char *);
|
|
Packit Service |
a4b2a9 |
vector = (char **) malloc(vector_size);
|
|
Packit Service |
a4b2a9 |
if (!vector)
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
for (i = 0; i < argc; i++) {
|
|
Packit Service |
a4b2a9 |
if (argv[i]) {
|
|
Packit Service |
a4b2a9 |
vector[i] = strdup(argv[i]);
|
|
Packit Service |
a4b2a9 |
if (!vector[i]) {
|
|
Packit Service |
a4b2a9 |
logerr("failed to strdup arg");
|
|
Packit Service |
a4b2a9 |
break;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
} else
|
|
Packit Service |
a4b2a9 |
vector[i] = NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (i < argc) {
|
|
Packit Service |
a4b2a9 |
free_argv(argc, (const char **) vector);
|
|
Packit Service |
a4b2a9 |
return NULL;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
vector[argc] = NULL;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
return (const char **) vector;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
static int compare(const char *s1, const char *s2)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
int res = 0;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (s1) {
|
|
Packit Service |
a4b2a9 |
if (!s2)
|
|
Packit Service |
a4b2a9 |
goto done;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (strcmp(s1, s2))
|
|
Packit Service |
a4b2a9 |
goto done;
|
|
Packit Service |
a4b2a9 |
} else if (s2)
|
|
Packit Service |
a4b2a9 |
goto done;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
res = 1;
|
|
Packit Service |
a4b2a9 |
done:
|
|
Packit Service |
a4b2a9 |
return res;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
int compare_argv(int argc1, const char **argv1, int argc2, const char **argv2)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
int res = 1;
|
|
Packit Service |
a4b2a9 |
int i, val;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (argc1 != argc2)
|
|
Packit Service |
a4b2a9 |
return 0;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
i = 0;
|
|
Packit Service |
a4b2a9 |
while (i < argc1) {
|
|
Packit Service |
a4b2a9 |
val = compare(argv1[i], argv2[i]);
|
|
Packit Service |
a4b2a9 |
if (!val) {
|
|
Packit Service |
a4b2a9 |
res = 0;
|
|
Packit Service |
a4b2a9 |
break;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
i++;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
return res;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
int free_argv(int argc, const char **argv)
|
|
Packit Service |
a4b2a9 |
{
|
|
Packit Service |
a4b2a9 |
char **vector = (char **) argv;
|
|
Packit Service |
a4b2a9 |
int i;
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
if (!argc) {
|
|
Packit Service |
a4b2a9 |
if (vector)
|
|
Packit Service |
a4b2a9 |
free(vector);
|
|
Packit Service |
a4b2a9 |
return 1;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
for (i = 0; i < argc; i++) {
|
|
Packit Service |
a4b2a9 |
if (vector[i])
|
|
Packit Service |
a4b2a9 |
free(vector[i]);
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
free(vector);
|
|
Packit Service |
a4b2a9 |
|
|
Packit Service |
a4b2a9 |
return 1;
|
|
Packit Service |
a4b2a9 |
}
|
|
Packit Service |
a4b2a9 |
|