18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * util.c - Various utilities
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2004 David Zeuthen, <david@fubar.dk>
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
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdarg.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <errno.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <time.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <ctype.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdint.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/stat.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fcntl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <signal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/wait.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/file.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_runner.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "device_info.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China/** Determine whether the given character is valid as the first character
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China * in a name.
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China */
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China#define VALID_INITIAL_NAME_CHARACTER(c) \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China (((c) >= 'A' && (c) <= 'Z') || \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China ((c) >= 'a' && (c) <= 'z') || \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China ((c) == '_'))
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China/** Determine whether the given character is valid as a second or later
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China * character in a name.
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China */
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China#define VALID_NAME_CHARACTER(c) \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China (((c) >= '0' && (c) <= '9') || \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China ((c) >= 'A' && (c) <= 'Z') || \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China ((c) >= 'a' && (c) <= 'z') || \
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China ((c) == '_'))
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_remove_trailing_slash (gchar *path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *c = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (path == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = strrchr (path, '/');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (c == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Invalid path %s", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*(c+1) == '\0')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *c = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Given a path, /foo/bar/bat/foobar, return the last element, e.g.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * foobar.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param path Path
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return Pointer into given string
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst gchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_last_element (const gchar *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (p = s + len - 1; p > s; --p) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((*p) == '/')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return p + 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Given a path, this functions finds the path representing the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * parent directory by truncation.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param path Path
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return Path for parent or NULL. Must be freed by caller
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_parent_path (const gchar *path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *parent_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Find parent device by truncating our own path */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_path = g_strndup (path, HAL_PATH_MAX);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (parent_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = len - 1; parent_path[i] != '/'; --i) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_path[i] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_path[i] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return parent_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_normalized_path (const gchar *path1, const gchar *path2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int len1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int len2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *p1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *p2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar buf[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len1 = strlen (path1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len2 = strlen (path2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p1 = path1 + len1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p2 = path2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (p2 < path2 + len2 && strncmp (p2, "../", 3) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p2 += 3;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (p1 >= path1 && *(--p1)!='/')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((p1-path1) < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Could not normalize '%s' and '%s', return 'NULL'", path1, path2));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (buf, path1, (p1-path1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[p1-path1] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup_printf ("%s/%s", buf, p2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_int_from_file (const gchar *directory, const gchar *file, gint *result, gint base)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[64];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar path[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (path, sizeof (path), "%s/%s", directory, file);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = fopen (path, "rb");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot open '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fgets (buf, sizeof (buf), f) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot read from '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* TODO: handle error condition */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *result = strtol (buf, NULL, base);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_int_from_file (HalDevice *d, const gchar *key, const gchar *directory, const gchar *file, gint base)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_util_get_int_from_file (directory, file, &value, base))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = hal_device_property_set_int (d, key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_uint64_from_file (const gchar *directory, const gchar *file, guint64 *result, gint base)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[64];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar path[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (path, sizeof (path), "%s/%s", directory, file);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = fopen (path, "rb");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot open '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fgets (buf, sizeof (buf), f) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot read from '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* TODO: handle error condition */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *result = strtoll (buf, NULL, base);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_uint64_from_file (HalDevice *d, const gchar *key, const gchar *directory, const gchar *file, gint base)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint64 value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_util_get_uint64_from_file (directory, file, &value, base))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = hal_device_property_set_uint64 (d, key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_bcd2_from_file (const gchar *directory, const gchar *file, gint *result)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[64];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar path[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint digit;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint left, right;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean passed_white_space;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint num_prec;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gsize len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (path, sizeof (path), "%s/%s", directory, file);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = fopen (path, "rb");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot open '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fgets (buf, sizeof (buf), f) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot read from '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem left = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem passed_white_space = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < len && buf[i] != '.'; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_ascii_isspace (buf[i])) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (passed_white_space)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem passed_white_space = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem left *= 16;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = buf[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem digit = (int) (c - '0');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem left += digit;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem right = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_prec = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (; i < len; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_ascii_isspace (buf[i]))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (num_prec == 2) /* Only care about two digits
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * of precision */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem right *= 16;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = buf[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem digit = (int) (c - '0');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem right += digit;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_prec++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (; num_prec < 2; num_prec++)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem right *= 16;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *result = left * 256 + (right & 255);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_bcd2_from_file (HalDevice *d, const gchar *key, const gchar *directory, const gchar *file)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_util_get_bcd2_from_file (directory, file, &value))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = hal_device_property_set_int (d, key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_get_string_from_file (const gchar *directory, const gchar *file)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static gchar buf[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar path[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gsize len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (path, sizeof (path), "%s/%s", directory, file);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = fopen (path, "rb");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot open '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[0] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fgets (buf, sizeof (buf), f) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot read from '%s'", path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len>0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[len-1] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Clear remaining whitespace */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = len - 2; i >= 0; --i) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!g_ascii_isspace (buf[i]))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[i] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_string_from_file (HalDevice *d, const gchar *key, const gchar *directory, const gchar *file)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((buf = hal_util_get_string_from_file (directory, file)) != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = hal_device_property_set_string (d, key, buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_compute_udi (HalDeviceStore *store, gchar *dst, gsize dstsize, const gchar *format, ...)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_list args;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar buf[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_start (args, format);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_vsnprintf (buf, sizeof (buf), format, args);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_end (args);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strcanon (buf,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/_"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "abcdefghijklmnopqrstuvwxyz"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "1234567890", '_');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strlcpy (dst, buf, dstsize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_store_find (store, dst) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; ; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (dst, dstsize, "%s_%d", buf, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_store_find (store, dst) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_path_ascend (gchar *path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (path == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = strrchr (path, '/');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *p = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean _grep_can_reuse = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_grep_discard_existing_data (void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem _grep_can_reuse = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Given a directory and filename, open the file and search for the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * first line that starts with the given linestart string. Returns
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the rest of the line as a string if found.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param directory Directory, e.g. "/proc/acpi/battery/BAT0"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param file File, e.g. "info"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param linestart Start of line, e.g. "serial number"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param reuse Whether we should reuse the file contents
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * if the file is the same; can be cleared
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * with hal_util_grep_discard_existing_data()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return NULL if not found, otherwise the remainder
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * of the line, e.g. ": 21805" if
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the file /proc/acpi/battery/BAT0 contains
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * this line "serial number: 21805"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The string is only valid until the next
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * invocation of this function.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_grep_file (const gchar *directory, const gchar *file, const gchar *linestart, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static gchar buf[2048];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static unsigned int bufsize;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static gchar filename[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static gchar oldfilename[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gsize linestart_len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* TODO: use reuse and _grep_can_reuse parameters to avoid loading
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the file again and again
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (file != NULL && strlen (file) > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf (filename, sizeof (filename), "%s/%s", directory, file);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (filename, directory, sizeof (filename));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (_grep_can_reuse && reuse && strcmp (oldfilename, filename) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* just reuse old file; e.g. bufsize, buf */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_INFO (("hal_util_grep_file: reusing buf for %s", filename));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem f = fopen (filename, "r");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (f == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem bufsize = fread (buf, sizeof (char), sizeof (buf) - 1, f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[bufsize] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_INFO (("hal_util_grep_file: read %s of %d bytes", filename, bufsize));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* book keeping */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem _grep_can_reuse = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (oldfilename, filename, sizeof(oldfilename));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem linestart_len = strlen (linestart);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* analyze buf */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem do {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int linelen;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static char line[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (linelen = 0; p[linelen] != '\n' && p[linelen] != '\0'; linelen++)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (linelen < sizeof (line)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (line, p, linelen);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem line[linelen] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strncmp (line, linestart, linestart_len) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem result = line + linestart_len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p += linelen + 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } while (p < buf + bufsize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return result;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_grep_string_elem_from_file (const gchar *directory, const gchar *file,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *linestart, guint elem, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *line;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static gchar buf[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar **tokens;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i, j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tokens = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (((line = hal_util_grep_file (directory, file, linestart, reuse)) == NULL) || (strlen (line) == 0))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tokens = g_strsplit_set (line, " \t:", 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0, j = 0; tokens[i] != NULL; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen (tokens[i]) == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (j == elem) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (buf, tokens[i], sizeof (buf));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (tokens != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (tokens);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_grep_int_elem_from_file (const gchar *directory, const gchar *file,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *linestart, guint elem, guint base, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *endptr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *strvalue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value = G_MAXINT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strvalue = hal_util_grep_string_elem_from_file (directory, file, linestart, elem, reuse);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strvalue == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value = strtol (strvalue, &endptr, base);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (endptr == strvalue) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value = G_MAXINT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Get a string value from a formatted text file and assign it to
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * a property on a device object.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Example: Given that the file /proc/acpi/battery/BAT0/info contains
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the line
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "design voltage: 10800 mV"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * then hal_util_set_string_elem_from_file (d, "battery.foo",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "/proc/acpi/battery/BAT0", "info", "design voltage", 1) will assign
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the string "mV" to the property "battery.foo" on d.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param d Device object
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param key Property name
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param directory Directory, e.g. "/proc/acpi/battery/BAT0"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param file File, e.g. "info"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param linestart Start of line, e.g. "design voltage"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param elem Element number after linestart to extract
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * excluding whitespace and ':' characters.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return TRUE, if, and only if, the value could be
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * extracted and the property was set
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_string_elem_from_file (HalDevice *d, const gchar *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *directory, const gchar *file,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *linestart, guint elem, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((value = hal_util_grep_string_elem_from_file (directory, file, linestart, elem, reuse)) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = hal_device_property_set_string (d, key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Get an integer value from a formatted text file and assign it to
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * a property on a device object.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Example: Given that the file /proc/acpi/battery/BAT0/info contains
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the line
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "design voltage: 10800 mV"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * then hal_util_set_int_elem_from_file (d, "battery.foo",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "/proc/acpi/battery/BAT0", "info", "design voltage", 0) will assign
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the integer 10800 to the property "battery.foo" on d.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param d Device object
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param key Property name
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param directory Directory, e.g. "/proc/acpi/battery/BAT0"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param file File, e.g. "info"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param linestart Start of line, e.g. "design voltage"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param elem Element number after linestart to extract
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * excluding whitespace and ':' characters.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return TRUE, if, and only if, the value could be
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * extracted and the property was set
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_int_elem_from_file (HalDevice *d, const gchar *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *directory, const gchar *file,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *linestart, guint elem, guint base, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *endptr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *strvalue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strvalue = hal_util_grep_string_elem_from_file (directory, file, linestart, elem, reuse);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strvalue == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value = strtol (strvalue, &endptr, base);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (endptr == strvalue)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = hal_device_property_set_int (d, key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Get a value from a formatted text file, test it against a given
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * value, and set a boolean property on a device object with the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * test result.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Example: Given that the file /proc/acpi/battery/BAT0/info contains
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the line
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "present: yes"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * then hal_util_set_bool_elem_from_file (d, "battery.baz",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "/proc/acpi/battery/BAT0", "info", "present", 0, "yes") will assign
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the boolean TRUE to the property "battery.baz" on d.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If, instead, the line was
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * "present: no"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the value assigned will be FALSE.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param d Device object
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param key Property name
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param directory Directory, e.g. "/proc/acpi/battery/BAT0"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param file File, e.g. "info"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param linestart Start of line, e.g. "design voltage"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param elem Element number after linestart to extract
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * excluding whitespace and ':' characters.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param expected Value to test against
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return TRUE, if, and only if, the value could be
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * extracted and the property was set
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_set_bool_elem_from_file (HalDevice *d, const gchar *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *directory, const gchar *file,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *linestart, guint elem, const gchar *expected, gboolean reuse)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *line;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar **tokens;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i, j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tokens = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (((line = hal_util_grep_file (directory, file, linestart, reuse)) == NULL) || (strlen (line) == 0))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tokens = g_strsplit_set (line, " \t:", 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0, j = 0; tokens[i] != NULL; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen (tokens[i]) == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (j == elem) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, key, strcmp (tokens[i], expected) == 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (tokens != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (tokens);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar **
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_dup_strv_from_g_slist (GSList *strlist)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar **strv;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = g_slist_length (strlist);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strv = g_new (char *, len + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = strlist, j = 0; i != NULL; i = g_slist_next (i), j++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strv[j] = g_strdup ((const gchar *) i->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strv[j] = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return strv;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* -------------------------------------------------------------------------------------------------------------- */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar **programs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar **extra_env;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint next_program;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalCalloutsDone callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer userdata2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} Callout;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void callout_do_next (Callout *c);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemcallout_terminated (HalDevice *d, guint32 exit_type,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint return_code, gchar **error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data1, gpointer data2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Callout *c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = (Callout *) data1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callout_do_next (c);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemcallout_do_next (Callout *c)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Check if we're done */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (c->programs[c->next_program] == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer userdata2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalCalloutsDone callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = c->d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem userdata1 = c->userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem userdata2 = c->userdata2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback = c->callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (c->programs);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (c->extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (c);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback (d, userdata1, userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_runner_run(c->d, c->programs[c->next_program], c->extra_env,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_HELPER_TIMEOUT, callout_terminated,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (gpointer)c, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->next_program++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_callout_device (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *programs, gchar **extra_env)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem Callout *c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = g_new0 (Callout, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->d = d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->callback = callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->userdata1 = userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->userdata2 = userdata2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->programs = hal_util_dup_strv_from_g_slist (programs);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->extra_env = g_strdupv (extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c->next_program = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callout_do_next (c);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_callout_device_add (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *programs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *extra_env[2] = {"HALD_ACTION=add", NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((programs = hal_device_property_get_strlist (d, "info.callouts.add")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback (d, userdata1, userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Add callouts for udi=%s", d->udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_callout_device (d, callback, userdata1, userdata2, programs, extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_callout_device_remove (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *programs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *extra_env[2] = {"HALD_ACTION=remove", NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((programs = hal_device_property_get_strlist (d, "info.callouts.remove")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback (d, userdata1, userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Remove callouts for udi=%s", d->udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_callout_device (d, callback, userdata1, userdata2, programs, extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_callout_device_preprobe (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *programs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *extra_env[2] = {"HALD_ACTION=preprobe", NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((programs = hal_device_property_get_strlist (d, "info.callouts.preprobe")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback (d, userdata1, userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Preprobe callouts for udi=%s", d->udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_callout_device (d, callback, userdata1, userdata2, programs, extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_strdup_valid_utf8 (const char *str)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *endchar;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *newstr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int count = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (str == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem newstr = g_strdup (str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (!g_utf8_validate (newstr, -1, (const char **) &endchar)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *endchar = '?';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem count++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen(newstr) == count)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return newstr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_hexdump (const void *mem, unsigned int size)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int n;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *buf = (const char *) mem;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem n = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("Dumping %d=0x%x bytes\n", size, size);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (n < size) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("0x%04x: ", n);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j = n;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < 16; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (j >= size)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%02x ", buf[j]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for ( ; i < 16; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j = n;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < 16; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (j >= size)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%c", isprint(buf[j]) ? buf[j] : '.');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem j++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem n += 16;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_is_mounted_by_hald (const char *mount_point)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *hal_mtab;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int hal_mtab_len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_read;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *hal_mtab_buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **lines;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean found;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab_buf = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem found = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_DEBUG (("examining /media/.hal-mtab for %s", mount_point));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab = fopen ("/media/.hal-mtab", "r");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_mtab == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot open /media/.hal-mtab"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fseek (hal_mtab, 0L, SEEK_END) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot seek to end of /media/.hal-mtab"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab_len = ftell (hal_mtab);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_mtab_len < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot determine size of /media/.hal-mtab"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rewind (hal_mtab);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab_buf = g_new0 (char, hal_mtab_len + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_read = fread (hal_mtab_buf, 1, hal_mtab_len, hal_mtab);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (num_read != hal_mtab_len) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot read from /media/.hal-mtab"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (hal_mtab);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_DEBUG (("hal_mtab = '%s'\n", hal_mtab_buf));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lines = g_strsplit (hal_mtab_buf, "\n", 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (hal_mtab_buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab_buf = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* find the entry we're going to unmount */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; lines[i] != NULL && !found; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **line_elements;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_DEBUG ((" line = '%s'", lines[i]));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((lines[i])[0] == '#')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem line_elements = g_strsplit (lines[i], "\t", 6);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_strv_length (line_elements) == 6) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" devfile = '%s'", line_elements[0]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" uid = '%s'", line_elements[1]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" session id = '%s'", line_elements[2]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" fs = '%s'", line_elements[3]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" options = '%s'", line_elements[4]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" mount_point = '%s'", line_elements[5]));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG ((" (comparing against '%s')", mount_point));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (line_elements[5], mount_point) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem found = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_INFO (("device at '%s' is indeed mounted by HAL's Mount()", mount_point));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (line_elements);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev (lines);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_mtab != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose (hal_mtab);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_mtab_buf != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (hal_mtab_buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return found;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_branch_claim (HalDeviceStore *store, HalDevice *root, dbus_bool_t claimed,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *service, int uid)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *children;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (claimed) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (root, "info.claimed", claimed);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (root, "info.claimed.service", service);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (root, "info.claimed.uid", uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (root, "info.claimed");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (root, "info.claimed.service");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (root, "info.claimed.uid");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem children = hal_device_store_match_multiple_key_value_string (store,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "info.parent", root->udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = children; i != NULL; i = g_slist_next (i)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = HAL_DEVICE (i->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_branch_claim (store, d, claimed, service, uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free (children);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China/** Given an interface name, check if it is valid.
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China * @param name A given interface name
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China * @return TRUE if name is valid, otherwise FALSE
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China */
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing Chinagboolean
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing Chinais_valid_interface_name(const char *name) {
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China const char *end;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China const char *last_dot;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China last_dot = NULL;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China if (strlen(name) == 0)
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China end = name + strlen(name);
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China if (*name == '.') /* disallow starting with a . */
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China else if (!VALID_INITIAL_NAME_CHARACTER (*name))
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China else
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China name++;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China while (name != end) {
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China if (*name == '.') {
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China if ((name + 1) == end)
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China else if (!VALID_INITIAL_NAME_CHARACTER (*(name + 1)))
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China last_dot = name;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China name++; /* we just validated the next char, so skip two */
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China } else if (!VALID_NAME_CHARACTER (*name))
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China name++;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China }
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China if (last_dot == NULL)
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return FALSE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China return TRUE;
97191cec6312a1c3a1b70c5f4a543c415c59edf7Xiaolin Zhang - Sun Microsystems - Beijing China}