Blame lib/args.c

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