1 /***************************************************************************
2  *
3  * probe-acpi.c : Probe for ACPI device information
4  *
5  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
6  * Use is subject to license terms.
7  *
8  * Licensed under the Academic Free License version 2.1
9  *
10  **************************************************************************/
11 
12 #ifdef HAVE_CONFIG_H
13 #include <config.h>
14 #endif
15 
16 #include <errno.h>
17 #include <string.h>
18 #include <strings.h>
19 #include <ctype.h>
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <sys/ioctl.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <glib.h>
26 
27 #include <libhal.h>
28 #include <logger.h>
29 #include "../utils/acpi.h"
30 
31 int
main(int argc,char * argv[])32 main(int argc, char *argv[])
33 {
34 	int ret = 1;
35 	int fd = -1;
36 	char *udi;
37 	char device_file[HAL_PATH_MAX] = "/devices";
38 	char *devfs_path;
39 	LibHalContext *ctx = NULL;
40 	DBusError error;
41 
42 	if ((udi = getenv("UDI")) == NULL)
43 		goto out;
44 	if ((devfs_path = getenv("HAL_PROP_SOLARIS_DEVFS_PATH")) == NULL)
45 		goto out;
46 	strlcat(device_file, devfs_path, HAL_PATH_MAX);
47 
48 	setup_logger();
49 
50 	dbus_error_init(&error);
51 	if ((ctx = libhal_ctx_init_direct(&error)) == NULL)
52 		goto out;
53 
54 	HAL_DEBUG(("Doing probe-acpi for %s (udi=%s)",
55 	    device_file, udi));
56 
57 	if ((fd = open(device_file, O_RDONLY | O_NONBLOCK)) < 0) {
58 		HAL_DEBUG(("Cannot open %s: %s", device_file, strerror(errno)));
59 		goto out;
60 	}
61 	if (strstr(udi, "_ac")) {
62 		ac_adapter_update(ctx, udi, fd);
63 	} else if (strstr(udi, "_battery")) {
64 		battery_update(ctx, udi, fd);
65 	} else if (strstr(udi, "_lid")) {
66 		lid_update(ctx, udi, fd);
67 	} else if (strstr(udi, "_hotkey")) {
68 		laptop_panel_update(ctx, udi, fd);
69 	}
70 
71 	ret = 0;
72 
73 out:
74 	if (fd >= 0) {
75 		close(fd);
76 	}
77 
78 	if (ctx != NULL) {
79 		libhal_ctx_shutdown(ctx, &error);
80 		libhal_ctx_free(ctx);
81 		if (dbus_error_is_set(&error)) {
82 			dbus_error_free(&error);
83 		}
84 	}
85 
86 	return (ret);
87 }
88