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