pndnotifyd: fix some crashes
[pandora-libraries.git] / lib / pnd_device.c
1
2 #include <stdio.h> /* for FILE etc */
3 #include <stdlib.h> /* for malloc */
4 #include <string.h>
5
6 #include <sys/types.h> /* for open */
7 #include <sys/stat.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10 #include <ctype.h>
11
12 #include "pnd_device.h"
13
14 unsigned char pnd_device_open_write_close ( char *name, char *v ) {
15   int f;
16
17   if ( ( f = open ( name, O_WRONLY /*O_RDONLY*/ ) ) < 0 ) {
18     return ( 0 );
19   }
20
21   if ( write ( f, v, strlen ( v ) ) < strlen ( v ) ) {
22     close ( f );
23     return ( 0 );
24   }
25
26   close ( f );
27
28   return ( 1 );
29 }
30
31 unsigned char pnd_device_open_read_close ( char *name, char *r_buffer, unsigned int buffer_len ) {
32   FILE *f;
33
34   f = fopen ( name, "r" );
35
36   if ( ! f ) {
37     return ( 0 );
38   }
39
40   if ( ! fgets ( r_buffer, buffer_len, f ) ) {
41     fclose ( f );
42     return ( 0 );
43   }
44
45   fclose ( f );
46
47   return ( 1 );
48 }
49
50 unsigned char pnd_device_set_clock ( unsigned int c ) {
51   char buffer [ 100 ];
52
53   sprintf ( buffer, "%u", c );
54
55   return ( pnd_device_open_write_close ( PND_DEVICE_PROC_CLOCK, buffer ) );
56 }
57
58 unsigned int pnd_device_get_clock ( void ) {
59   char buffer [ 100 ];
60
61   if ( pnd_device_open_read_close ( PND_DEVICE_PROC_CLOCK, buffer, 100 ) ) {
62     return ( atoi ( buffer ) );
63   }
64
65   return ( 0 );
66 }
67
68 unsigned char pnd_device_set_backlight ( unsigned int c ) {
69   char buffer [ 100 ];
70
71   sprintf ( buffer, "%u", c );
72
73   return ( pnd_device_open_write_close ( PND_DEVICE_SYS_BACKLIGHT_BRIGHTNESS, buffer ) );
74 }
75
76 unsigned int pnd_device_get_backlight ( void ) {
77   char buffer [ 100 ];
78
79   if ( pnd_device_open_read_close ( PND_DEVICE_SYS_BACKLIGHT_BRIGHTNESS, buffer, 100 ) ) {
80     return ( atoi ( buffer ) );
81   }
82
83   return ( 0 );
84 }
85
86 int pnd_device_get_battery_gauge_perc ( void ) {
87   char buffer [ 100 ];
88
89   if ( pnd_device_open_read_close ( PND_DEVICE_BATTERY_GAUGE_PERC, buffer, 100 ) ) {
90     return ( atoi ( buffer ) );
91   }
92
93   return ( -1 );
94 }
95
96 unsigned char pnd_device_get_charge_current ( int *result ) {
97   char buffer [ 100 ];
98
99   if ( pnd_device_open_read_close ( PND_DEVICE_CHARGE_CURRENT, buffer, 100 ) ) {
100     *result = atoi ( buffer );
101     return ( 1 );
102   }
103
104   return ( 0 );
105 }
106
107 int pnd_device_get_charger_enable ( const char *devices ) {
108   char fullname [ 100 ];
109   char buffer [ 100 ];
110
111   while ( 1 ) {
112     if ( sscanf ( devices, "%99s", buffer ) != 1 ) {
113       break;
114     }
115
116     while ( isspace ( *devices ) )
117       devices++;
118     devices += strlen ( buffer );
119     snprintf ( fullname, sizeof ( fullname ), PND_DEVICE_POWER_BASE "/%s/enable", buffer );
120
121     /* XXX: only ckecks first good device, but that should be enough for our needs */
122     if ( pnd_device_open_read_close ( fullname, buffer, 100 ) ) {
123       return ( atoi ( buffer ) );
124     }
125   }
126
127   return ( -1 );
128 }
129
130 unsigned char pnd_device_set_charger_enable ( const char *devices, unsigned char v ) {
131   char fullname [ 100 ];
132   char buffer [ 100 ];
133   int ret = 0;
134
135   while ( 1 ) {
136     if ( sscanf ( devices, "%99s", buffer ) != 1 ) {
137       break;
138     }
139
140     while ( isspace ( *devices ) )
141       devices++;
142     devices += strlen ( buffer );
143     snprintf ( fullname, sizeof ( fullname ), PND_DEVICE_POWER_BASE "/%s/enable", buffer );
144
145     sprintf ( buffer, "%u", v );
146     ret |= pnd_device_open_write_close ( fullname, buffer );
147   }
148
149   return ( ret );
150 }
151
152 unsigned char pnd_device_set_led_power_brightness ( unsigned char v ) {
153   char buffer [ 100 ];
154
155   sprintf ( buffer, "%u", v );
156
157   return ( pnd_device_open_write_close ( PND_DEVICE_LED_POWER PND_DEVICE_LED_SUFFIX_BRIGHTNESS, buffer ) );
158 }
159
160 unsigned char pnd_device_set_led_charger_brightness ( unsigned char v ) {
161   char buffer [ 100 ];
162
163   sprintf ( buffer, "%u", v );
164
165   return ( pnd_device_open_write_close ( PND_DEVICE_LED_CHARGER PND_DEVICE_LED_SUFFIX_BRIGHTNESS, buffer ) );
166 }