Updated UniK olsrd to olsr.org in licence headers
[olsrd.git] / src / linux / apm.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2003 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsr.org is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 #include "../apm.h"
24 #include <stdio.h>
25 #include <string.h>
26
27 #define APM_PROC "/proc/apm"
28
29 struct linux_apm_info
30 {
31   char driver_version[10];
32   int apm_version_major;
33   int apm_version_minor;
34   int apm_flags;
35   int ac_line_status;
36   int battery_status;
37   int battery_flags;
38   int battery_percentage;
39   int battery_time;
40   int using_minutes;
41 };
42
43
44 extern int
45 olsr_printf(int, char *, ...);
46
47
48 int 
49 apm_init()
50 {
51   struct olsr_apm_info ainfo;
52
53   olsr_printf(3, "Initializing APM\n");
54
55   if(apm_read(&ainfo))
56     apm_printinfo(&ainfo);
57
58   return 1;
59 }
60
61 void
62 apm_printinfo(struct olsr_apm_info *ainfo)
63 {
64   olsr_printf(5, "APM info:\n\tAC status %d\n\tBattery percentage %d%%\n\n",
65               ainfo->ac_line_status,
66               ainfo->battery_percentage);
67
68   return;
69 }
70
71
72 int
73 apm_read(struct olsr_apm_info *ainfo)
74 {
75   char buffer[100];
76   char units[10];
77   FILE *apm_procfile;
78   struct linux_apm_info lainfo;
79
80   /* Open procfile */
81   if((apm_procfile = fopen(APM_PROC, "r")) == NULL)
82     return 0;
83
84
85   fgets(buffer, sizeof(buffer) - 1, apm_procfile);
86   if(buffer == NULL)
87     {
88       /* Try re-opening the file */
89       if((apm_procfile = fopen(APM_PROC, "r")) < 0)
90         return 0;
91       fgets(buffer, sizeof(buffer) - 1, apm_procfile);
92       if(buffer == NULL)
93         {
94           /* Giving up */
95           fprintf(stderr, "OLSRD: Could not read APM info - setting willingness to default");
96           fclose(apm_procfile);
97           return 0;
98         }
99     }
100
101   buffer[sizeof(buffer) - 1] = '\0';
102
103   //printf("READ: %s\n", buffer);
104
105   /* Get the info */
106   sscanf(buffer, "%s %d.%d %x %x %x %x %d%% %d %s\n",
107          lainfo.driver_version,
108          &lainfo.apm_version_major,
109          &lainfo.apm_version_minor,
110          &lainfo.apm_flags,
111          &lainfo.ac_line_status,
112          &lainfo.battery_status,
113          &lainfo.battery_flags,
114          &lainfo.battery_percentage,
115          &lainfo.battery_time,
116          units);
117
118   lainfo.using_minutes = !strncmp(units, "min", 3) ? 1 : 0;
119
120   /*
121    * Should take care of old APM type info here
122    */
123
124   /*
125    * Fix possible percentage error
126    */
127   if(lainfo.battery_percentage > 100)
128     lainfo.battery_percentage = -1;
129
130   /* Fill the provided struct */
131
132   if(lainfo.ac_line_status)
133     ainfo->ac_line_status = OLSR_AC_POWERED;
134   else
135     ainfo->ac_line_status = OLSR_BATTERY_POWERED;
136   
137   ainfo->battery_percentage = lainfo.battery_percentage;
138   
139   fclose(apm_procfile);
140
141   return 1;
142 }