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