18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * utils.c - Some utils for the hald runner
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2006 Sjoerd Simons, <sjoerd@luon.net>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is free software; you can redistribute it and/or modify
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it under the terms of the GNU General Public License as published by
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the Free Software Foundation; either version 2 of the License, or
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (at your option) any later version.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is distributed in the hope that it will be useful,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but WITHOUT ANY WARRANTY; without even the implied warranty of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * GNU General Public License for more details.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You should have received a copy of the GNU General Public License
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * along with this program; if not, write to the Free Software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define DBUS_API_SUBJECT_TO_CHANGE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib-lowlevel.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "utils.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar **
18c2aff776a775d34a4c9893a4c72e0434d68e36artemget_string_array(DBusMessageIter *iter, char *extra)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GArray *array;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem array = g_array_new(TRUE, FALSE, sizeof(char *));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRING) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *t;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_basic(iter, &value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem t = g_strdup(value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_append_vals(array, &t, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_next(iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (extra != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_append_vals(array, &extra, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = (char **) array->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_free(array, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar **
18c2aff776a775d34a4c9893a4c72e0434d68e36artemget_string_array_from_fd(int fd)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GArray *array;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GString *str;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gsize pos;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GIOChannel *io;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem array = g_array_new(TRUE, FALSE, sizeof(char *));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = g_string_new("");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem io = g_io_channel_unix_new(fd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (g_io_channel_read_line_string(io, str, &pos, NULL) == G_IO_STATUS_NORMAL && (i++ < 128)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *t;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Remove the terminting char aka \n */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_string_erase(str, pos, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem t = g_strdup(str->str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_append_vals(array, &t, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_string_free(str, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_io_channel_unref(io);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = (char **) array->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_free(array, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemfree_string_array(char **array)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (p = array; p != NULL && *p != NULL; p++)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(*p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(array);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}