Introduction
Introduction Statistics Contact Development Disclaimer Help
slstatus-dyn_battery-20250416-f68f492.diff - sites - public wiki contents of su…
git clone git://git.suckless.org/sites
Log
Files
Refs
---
slstatus-dyn_battery-20250416-f68f492.diff (4427B)
---
1 From 44fcd213f975ae35fb92de9bc56d8d895478edb5 Mon Sep 17 00:00:00 2001
2 From: Madison Lynch <[email protected]>
3 Date: Wed, 16 Apr 2025 16:18:33 -0700
4 Subject: [PATCH] Improved memory-safety in dyn_battery function
5
6 ---
7 Makefile | 1 +
8 components/dyn_battery.c | 84 ++++++++++++++++++++++++++++++++++++++++
9 config.def.h | 3 ++
10 slstatus.h | 3 ++
11 4 files changed, 91 insertions(+)
12 create mode 100644 components/dyn_battery.c
13
14 diff --git a/Makefile b/Makefile
15 index 7a18274..d1b24dd 100644
16 --- a/Makefile
17 +++ b/Makefile
18 @@ -11,6 +11,7 @@ COM =\
19 components/cpu\
20 components/datetime\
21 components/disk\
22 + components/dyn_battery\
23 components/entropy\
24 components/hostname\
25 components/ip\
26 diff --git a/components/dyn_battery.c b/components/dyn_battery.c
27 new file mode 100644
28 index 0000000..9377071
29 --- /dev/null
30 +++ b/components/dyn_battery.c
31 @@ -0,0 +1,84 @@
32 +/* Written by Madison Lynch <[email protected]> */
33 +/* Only Linux is supported */
34 +#include <stdio.h>
35 +#include <stdlib.h>
36 +#include <string.h>
37 +#include <dirent.h>
38 +
39 +#include "../slstatus.h"
40 +
41 +#define BAT_PREFIX "BAT"
42 +#define BAT_DIR "/sys/class/power_supply"
43 +
44 +/**
45 +* Counts number of batteries detected by system.
46 +*
47 +* @return unsigned integer denoting the number of detected batteries.
48 +* @author Madison Lynch
49 +*/
50 +static unsigned int
51 +battery_count(void) {
52 + DIR *dir = opendir(BAT_DIR);
53 + unsigned int bat_c = 0;
54 +
55 + struct dirent *entry;
56 + while((entry = readdir(dir)))
57 + if(strlen(entry->d_name) > 3)
58 + if(strncmp(entry->d_name, BAT_PREFIX, 3) == 0)
59 + bat_c++;
60 +
61 + (void) closedir(dir);
62 + return bat_c;
63 +}
64 +
65 +/**
66 +* Displays the status and capacity of a dynamic amount of batteries (i.…
67 +* laptop may have secondary external battery).
68 +*
69 +* @param fmt format string to use for each battery display. ordered ke…
70 +* %u: battery number || %s: battery state || %s battery cap…
71 +* @return string containing the status and capacities of all detected b…
72 +* @author Madison Lynch
73 +*/
74 +const char *
75 +dyn_battery(const char *fmt) {
76 + static char *ret;
77 + free(ret); // Free address from previous output
78 +
79 + const size_t fmt_s = strlen(fmt);
80 + const unsigned int bat_c = battery_count();
81 +
82 + // Extra byte in calloc() for null byte
83 + ret = (char *)calloc(fmt_s * bat_c + 1, sizeof(char));
84 + if(!ret) {
85 + fprintf(stderr, "dyn_battery: calloc() failed.");
86 + return NULL;
87 + }
88 +
89 + unsigned int displacement = 0; // For appending battery displays
90 + for(unsigned int i=0; i<bat_c; i++) {
91 + char bat[7]; // "BAT" = 3 + <=3 digit number + null byte
92 + (void) sprintf(bat, "BAT%u", i);
93 +
94 + // Add battery display to final string to be returned
95 + (void) sprintf(
96 + ret + displacement,
97 + fmt,
98 + i,
99 + battery_state(bat),
100 + battery_perc(bat)
101 + );
102 + displacement = strlen(ret);
103 +
104 + // Add space between battery displays
105 + ret[displacement++] = ' ';
106 + }
107 +
108 + // Remove extra space after last battery display
109 + ret[--displacement] = '\0';
110 +
111 + return ret;
112 +}
113 +
114 +#undef BAT_DIR
115 +#undef BAT_PREFIX
116 diff --git a/config.def.h b/config.def.h
117 index d805331..a0052e3 100644
118 --- a/config.def.h
119 +++ b/config.def.h
120 @@ -26,6 +26,9 @@ static const char unknown_str[] = "n/a";
121 * disk_perc disk usage in percent mountpoint path …
122 * disk_total total disk space in GB mountpoint path …
123 * disk_used used disk space in GB mountpoint path …
124 + * dyn_battery displays the name, state and format string (%…
125 + * capacity of all detected %s). order is im…
126 + * batteries and matches desc…
127 * entropy available entropy NULL
128 * gid GID of current user NULL
129 * hostname hostname NULL
130 diff --git a/slstatus.h b/slstatus.h
131 index 8ef5874..44a4b61 100644
132 --- a/slstatus.h
133 +++ b/slstatus.h
134 @@ -21,6 +21,9 @@ const char *disk_perc(const char *path);
135 const char *disk_total(const char *path);
136 const char *disk_used(const char *path);
137
138 +/* dyn_battery */
139 +const char *dyn_battery(const char *fmt);
140 +
141 /* entropy */
142 const char *entropy(const char *unused);
143
144 --
145 2.49.0
146
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.