Added CVS Id fields to all ca nd h files
[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  * $ Id $
23  *
24  */
25
26 #include "../apm.h"
27 #include <stdio.h>
28 #include <string.h>
29
30 #define APM_PROC "/proc/apm"
31
32 struct linux_apm_info
33 {
34   char driver_version[10];
35   int apm_version_major;
36   int apm_version_minor;
37   int apm_flags;
38   int ac_line_status;
39   int battery_status;
40   int battery_flags;
41   int battery_percentage;
42   int battery_time;
43   int using_minutes;
44 };
45
46
47 extern int
48 olsr_printf(int, char *, ...);
49
50
51 int 
52 apm_init()
53 {
54   struct olsr_apm_info ainfo;
55
56   olsr_printf(3, "Initializing APM\n");
57
58   if(apm_read(&ainfo))
59     apm_printinfo(&ainfo);
60
61   return 1;
62 }
63
64 void
65 apm_printinfo(struct olsr_apm_info *ainfo)
66 {
67   olsr_printf(5, "APM info:\n\tAC status %d\n\tBattery percentage %d%%\n\n",
68               ainfo->ac_line_status,
69               ainfo->battery_percentage);
70
71   return;
72 }
73
74
75 int
76 apm_read(struct olsr_apm_info *ainfo)
77 {
78   char buffer[100];
79   char units[10];
80   FILE *apm_procfile;
81   struct linux_apm_info lainfo;
82
83   /* Open procfile */
84   if((apm_procfile = fopen(APM_PROC, "r")) == NULL)
85     return 0;
86
87
88   fgets(buffer, sizeof(buffer) - 1, apm_procfile);
89   if(buffer == NULL)
90     {
91       /* Try re-opening the file */
92       if((apm_procfile = fopen(APM_PROC, "r")) < 0)
93         return 0;
94       fgets(buffer, sizeof(buffer) - 1, apm_procfile);
95       if(buffer == NULL)
96         {
97           /* Giving up */
98           fprintf(stderr, "OLSRD: Could not read APM info - setting willingness to default");
99           fclose(apm_procfile);
100           return 0;
101         }
102     }
103
104   buffer[sizeof(buffer) - 1] = '\0';
105
106   //printf("READ: %s\n", buffer);
107
108   /* Get the info */
109   sscanf(buffer, "%s %d.%d %x %x %x %x %d%% %d %s\n",
110          lainfo.driver_version,
111          &lainfo.apm_version_major,
112          &lainfo.apm_version_minor,
113          &lainfo.apm_flags,
114          &lainfo.ac_line_status,
115          &lainfo.battery_status,
116          &lainfo.battery_flags,
117          &lainfo.battery_percentage,
118          &lainfo.battery_time,
119          units);
120
121   lainfo.using_minutes = !strncmp(units, "min", 3) ? 1 : 0;
122
123   /*
124    * Should take care of old APM type info here
125    */
126
127   /*
128    * Fix possible percentage error
129    */
130   if(lainfo.battery_percentage > 100)
131     lainfo.battery_percentage = -1;
132
133   /* Fill the provided struct */
134
135   if(lainfo.ac_line_status)
136     ainfo->ac_line_status = OLSR_AC_POWERED;
137   else
138     ainfo->ac_line_status = OLSR_BATTERY_POWERED;
139   
140   ainfo->battery_percentage = lainfo.battery_percentage;
141   
142   fclose(apm_procfile);
143
144   return 1;
145 }