Skip to content
GitLab
Menu
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
Apr 22, 2014
by
Hisham Muhammad
Browse files
Refactor and fix resource leaks.
parent
79e39012
Changes
1
Hide whitespace changes
Inline
Side-by-side
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
;
...
...
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