1/***************************************************************************
2 * CVSID: $Id$
3 *
4 * utils.c - Some utils for the hald runner
5 *
6 * Copyright (C) 2006 Sjoerd Simons, <sjoerd@luon.net>
7 *
8 * Licensed under the Academic Free License version 2.1
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23 *
24 **************************************************************************/
25#include <stdio.h>
26#include <stdlib.h>
27#define DBUS_API_SUBJECT_TO_CHANGE
28#include <dbus/dbus-glib-lowlevel.h>
29#include <glib.h>
30
31#include "utils.h"
32
33char **
34get_string_array(DBusMessageIter *iter, char *extra)
35{
36	GArray *array;
37	char **result;
38	array = g_array_new(TRUE, FALSE, sizeof(char *));
39
40	while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRING) {
41		const char *value;
42		char *t;
43		dbus_message_iter_get_basic(iter, &value);
44		t = g_strdup(value);
45		g_array_append_vals(array, &t, 1);
46		dbus_message_iter_next(iter);
47	}
48	if (extra != NULL)
49		g_array_append_vals(array, &extra, 1);
50	result = (char **) array->data;
51	g_array_free(array, FALSE);
52	return result;
53}
54
55char **
56get_string_array_from_fd(int fd)
57{
58	GArray *array;
59	char **result;
60	GString *str;
61	gsize pos;
62	GIOChannel *io;
63	int i = 0;
64
65	array = g_array_new(TRUE, FALSE, sizeof(char *));
66	str = g_string_new("");
67	io = g_io_channel_unix_new(fd);
68	while (g_io_channel_read_line_string(io, str, &pos, NULL) == G_IO_STATUS_NORMAL && (i++ < 128)) {
69		char *t;
70
71		/* Remove the terminting char aka \n */
72		g_string_erase(str, pos, 1);
73		t = g_strdup(str->str);
74		g_array_append_vals(array, &t, 1);
75	}
76	g_string_free(str, TRUE);
77	g_io_channel_unref(io);
78	result = (char **) array->data;
79	g_array_free(array, FALSE);
80	return result;
81}
82
83void
84free_string_array(char **array)
85{
86	char **p;
87
88	for (p = array; p != NULL && *p != NULL; p++)
89		g_free(*p);
90	g_free(array);
91}
92