Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
htop
Commits
b1564c2b
Commit
b1564c2b
authored
11 years ago
by
Hisham Muhammad
Browse files
Options
Download
Email Patches
Plain Diff
Refactor and fix resource leaks.
parent
79e39012
master
darwin-cpu-average
fixedgray
freebsd
linear-graph-scan
lua
next
perfcounters
pkgconfig-on-linux
solaris
sreclaimable
travis-ci
wip
3.0.0beta5
3.0.0beta4
3.0.0beta3
3.0.0beta2
3.0.0beta1
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
1.0.3
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
BatteryMeter.c
+119
-127
BatteryMeter.c
with
119 additions
and
127 deletions
+119
-127
BatteryMeter.c
View file @
b1564c2b
...
...
@@ -36,12 +36,13 @@ int BatteryMeter_attributes[] = {
static
unsigned
long
int
parseUevent
(
FILE
*
file
,
const
char
*
key
)
{
char
line
[
100
];
unsigned
long
int
dValue
=
0
;
char
*
saveptr
;
while
(
fgets
(
line
,
sizeof
line
,
file
))
{
if
(
strncmp
(
line
,
key
,
strlen
(
key
))
==
0
)
{
char
*
value
;
strtok
(
line
,
"="
);
value
=
strtok
(
NULL
,
"="
);
strtok
_r
(
line
,
"="
,
&
saveptr
);
value
=
strtok
_r
(
NULL
,
"="
,
&
saveptr
);
dValue
=
atoi
(
value
);
break
;
}
...
...
@@ -55,169 +56,158 @@ static unsigned long int parseBatInfo(const char *fileName, const unsigned short
if
(
!
batteryDir
)
return
0
;
typedef
struct
listLbl
{
char
*
content
;
struct
listLbl
*
next
;
}
list
;
list
*
myList
=
NULL
;
list
*
newEntry
;
/*
Some of this is based off of code found in kismet (they claim it came from gkrellm).
Written for multi battery use...
*/
for
(
const
struct
dirent
*
dirEntries
=
readdir
((
DIR
*
)
batteryDir
);
dirEntries
;
dirEntries
=
readdir
((
DIR
*
)
batteryDir
))
{
char
*
entryName
=
(
char
*
)
dirEntries
->
d_name
;
char
*
batteries
[
64
];
unsigned
int
nBatteries
=
0
;
memset
(
batteries
,
sizeof
batteries
,
sizeof
(
char
*
));
struct
dirent
result
;
struct
dirent
*
dirEntry
;
while
(
nBatteries
<
sizeof
batteries
)
{
readdir_r
(
batteryDir
,
&
result
,
&
dirEntry
);
if
(
!
dirEntry
)
break
;
char
*
entryName
=
dirEntry
->
d_name
;
if
(
strncmp
(
entryName
,
"BAT"
,
3
))
continue
;
newEntry
=
calloc
(
1
,
sizeof
(
list
));
newEntry
->
next
=
myList
;
newEntry
->
content
=
entryName
;
myList
=
newEntry
;
batteries
[
nBatteries
]
=
strdup
(
entryName
);
nBatteries
++
;
}
closedir
(
batteryDir
);
unsigned
long
int
total
=
0
;
for
(
newEntry
=
myList
;
newEntry
;
newEntry
=
newEntry
->
next
)
{
const
char
infoPath
[
30
];
const
FILE
*
file
;
char
line
[
50
];
snprintf
((
char
*
)
infoPath
,
sizeof
infoPath
,
"%s%s/%s"
,
batteryPath
,
newEntry
->
content
,
fileName
);
for
(
unsigned
int
i
=
0
;
i
<
nBatteries
;
i
++
)
{
char
infoPath
[
30
];
snprintf
(
infoPath
,
sizeof
infoPath
,
"%s%s/%s"
,
batteryPath
,
batteries
[
i
],
fileName
);
if
((
file
=
fopen
(
infoPath
,
"r"
)
)
==
NULL
)
{
closedir
(
batteryDir
);
re
turn
0
;
FILE
*
file
=
fopen
(
infoPath
,
"r"
)
;
if
(
!
file
)
{
b
re
ak
;
}
char
line
[
50
];
for
(
unsigned
short
int
i
=
0
;
i
<
lineNum
;
i
++
)
{
fgets
(
line
,
sizeof
line
,
(
FILE
*
)
file
);
fgets
(
line
,
sizeof
line
,
file
);
}
fclose
(
(
FILE
*
)
file
);
fclose
(
file
);
const
char
*
foundNum
Tmp
=
String_getToken
(
line
,
wordNum
);
const
unsigned
long
int
foundNum
=
atoi
(
foundNum
Tmp
);
free
(
(
char
*
)
foundNum
Tmp
);
char
*
foundNum
Str
=
String_getToken
(
line
,
wordNum
);
const
unsigned
long
int
foundNum
=
atoi
(
foundNum
Str
);
free
(
foundNum
Str
);
total
+=
foundNum
;
}
free
(
myList
);
free
(
newEntry
);
closedir
(
batteryDir
);
for
(
unsigned
int
i
=
0
;
i
<
nBatteries
;
i
++
)
{
free
(
batteries
[
i
]);
}
return
total
;
}
static
ACPresence
chkIsOnline
()
{
FILE
*
file
=
NULL
;
static
ACPresence
procAcpiCheck
()
{
ACPresence
isOn
=
AC_ERROR
;
const
char
*
power_supplyPath
=
PROCDIR
"/acpi/ac_adapter"
;
DIR
*
power_supplyDir
=
opendir
(
power_supplyPath
);
if
(
!
power_supplyDir
)
{
return
AC_ERROR
;
}
if
(
access
(
PROCDIR
"/acpi/ac_adapter"
,
F_OK
)
==
0
)
{
const
char
*
power_supplyPath
=
PROCDIR
"/acpi/ac_adapter"
;
DIR
*
power_supplyDir
=
opendir
(
power_supplyPath
);
if
(
!
power_supplyDir
)
return
AC_ERROR
;
for
(
const
struct
dirent
*
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
);
dirEntries
;
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
))
{
char
*
entryName
=
(
char
*
)
dirEntries
->
d_name
;
if
(
entryName
[
0
]
!=
'A'
)
continue
;
char
statePath
[
50
];
snprintf
((
char
*
)
statePath
,
sizeof
statePath
,
"%s/%s/state"
,
power_supplyPath
,
entryName
);
file
=
fopen
(
statePath
,
"r"
);
if
(
!
file
)
{
isOn
=
AC_ERROR
;
continue
;
}
struct
dirent
result
;
struct
dirent
*
dirEntry
;
for
(;;)
{
readdir_r
((
DIR
*
)
power_supplyDir
,
&
result
,
&
dirEntry
);
if
(
!
dirEntry
)
break
;
char
line
[
100
];
fgets
(
line
,
sizeof
line
,
file
);
line
[
sizeof
(
line
)
-
1
]
=
'\0'
;
char
*
entryName
=
(
char
*
)
dirEntry
->
d_name
;
if
(
file
)
{
fclose
(
file
);
file
=
NULL
;
}
const
char
*
isOnline
=
String_getToken
(
line
,
2
);
if
(
entryName
[
0
]
!=
'A'
)
continue
;
if
(
strcmp
(
isOnline
,
"on-line"
)
==
0
)
{
free
((
char
*
)
isOnline
);
isOn
=
AC_PRESENT
;
// If any AC adapter is being used then stop
break
;
char
statePath
[
50
];
snprintf
((
char
*
)
statePath
,
sizeof
statePath
,
"%s/%s/state"
,
power_supplyPath
,
entryName
);
FILE
*
file
=
fopen
(
statePath
,
"r"
);
}
else
{
isOn
=
AC_ABSENT
;
}
free
((
char
*
)
isOnline
);
if
(
!
file
)
{
isOn
=
AC_ERROR
;
continue
;
}
if
(
power_supplyDir
)
closedir
(
power_supplyDir
);
char
line
[
100
];
fgets
(
line
,
sizeof
line
,
file
);
line
[
sizeof
(
line
)
-
1
]
=
'\0'
;
}
else
{
const
char
*
power_supplyPath
=
"/sys/class/power_supply"
;
if
(
access
(
"/sys/class/power_supply"
,
F_OK
)
==
0
)
{
const
struct
dirent
*
dirEntries
;
DIR
*
power_supplyDir
=
opendir
(
power_supplyPath
);
char
*
entryName
;
if
(
!
power_supplyDir
)
{
return
AC_ERROR
;
}
for
(
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
);
dirEntries
;
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
))
{
entryName
=
(
char
*
)
dirEntries
->
d_name
;
fclose
(
file
);
if
(
strncmp
(
entryName
,
"A"
,
1
))
{
continue
;
}
const
char
*
isOnline
=
String_getToken
(
line
,
2
);
char
onlinePath
[
50
];
snprintf
((
char
*
)
onlinePath
,
sizeof
onlinePath
,
"%s/%s/online"
,
power_supplyPath
,
entryName
);
file
=
fopen
(
onlinePath
,
"r"
);
if
(
strcmp
(
isOnline
,
"on-line"
)
==
0
)
{
isOn
=
AC_PRESENT
;
}
else
{
isOn
=
AC_ABSENT
;
}
free
((
char
*
)
isOnline
);
if
(
isOn
==
AC_PRESENT
)
{
break
;
}
}
if
(
!
file
)
{
isOn
=
AC_ERROR
;
continue
;
}
if
(
power_supplyDir
)
closedir
(
power_supplyDir
)
;
return
isOn
;
}
isOn
=
(
fgetc
(
file
)
-
'0'
);
static
ACPresence
sysCheck
()
{
ACPresence
isOn
=
AC_ERROR
;
const
char
*
power_supplyPath
=
"/sys/class/power_supply"
;
DIR
*
power_supplyDir
=
opendir
(
power_supplyPath
);
if
(
!
power_supplyDir
)
{
return
AC_ERROR
;
}
if
(
file
)
{
fclose
(
file
);
file
=
NULL
;
}
struct
dirent
result
;
struct
dirent
*
dirEntry
;
for
(;;)
{
readdir_r
((
DIR
*
)
power_supplyDir
,
&
result
,
&
dirEntry
);
if
(
!
dirEntry
)
break
;
if
(
isOn
==
AC_PRESENT
)
{
// If any AC adapter is being used then stop
break
;
}
else
{
continue
;
}
char
*
entryName
=
(
char
*
)
dirEntry
->
d_name
;
if
(
strncmp
(
entryName
,
"A"
,
1
))
{
continue
;
}
char
onlinePath
[
50
];
snprintf
((
char
*
)
onlinePath
,
sizeof
onlinePath
,
"%s/%s/online"
,
power_supplyPath
,
entryName
);
FILE
*
file
=
fopen
(
onlinePath
,
"r"
);
if
(
!
file
)
{
isOn
=
AC_ERROR
;
}
else
{
isOn
=
(
fgetc
(
file
)
-
'0'
);
fclose
(
file
);
if
(
isOn
==
AC_PRESENT
)
{
// If any AC adapter is being used then stop
break
;
}
if
(
power_supplyDir
)
closedir
(
power_supplyDir
);
}
}
// Just in case :-)
if
(
file
)
fclose
(
file
);
if
(
power_supplyDir
)
closedir
(
power_supplyDir
);
return
isOn
;
}
static
ACPresence
chkIsOnline
()
{
if
(
access
(
PROCDIR
"/acpi/ac_adapter"
,
F_OK
)
==
0
)
{
return
procAcpiCheck
();
}
else
if
(
access
(
"/sys/class/power_supply"
,
F_OK
)
==
0
)
{
return
sysCheck
();
}
else
{
return
AC_ERROR
;
}
}
static
double
getProcBatData
()
{
const
unsigned
long
int
totalFull
=
parseBatInfo
(
"info"
,
3
,
4
);
if
(
totalFull
==
0
)
...
...
@@ -232,19 +222,21 @@ static double getProcBatData() {
}
static
double
getSysBatData
()
{
const
struct
dirent
*
dirEntries
;
const
char
*
power_supplyPath
=
"/sys/class/power_supply/"
;
DIR
*
power_supplyDir
=
opendir
(
power_supplyPath
);
if
(
!
power_supplyDir
)
return
0
;
char
*
entryName
;
unsigned
long
int
totalFull
=
0
;
unsigned
long
int
totalRemain
=
0
;
for
(
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
);
dirEntries
;
dirEntries
=
readdir
((
DIR
*
)
power_supplyDir
))
{
entryName
=
(
char
*
)
dirEntries
->
d_name
;
struct
dirent
result
;
struct
dirent
*
dirEntry
;
for
(;;)
{
readdir_r
((
DIR
*
)
power_supplyDir
,
&
result
,
&
dirEntry
);
if
(
!
dirEntry
)
break
;
char
*
entryName
=
(
char
*
)
dirEntry
->
d_name
;
if
(
strncmp
(
entryName
,
"BAT"
,
3
))
{
continue
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help