xref: /illumos-gate/usr/src/cmd/hal/hald-runner/utils.c (revision d5ace9454616652a717c9831d949dffa319381f9)
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 
33 char **
34 get_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 
55 char **
56 get_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 
83 void
84 free_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