In the case where no CPU number is given, skipping a character of
padding actually skips the null terminator, causing further iterations
through the loop to read out of bounds. Have sscanf() return the number
of characters read, instead of reconstructing it from the CPU number.
This was observed as a failure in test 024-cpu-usage-invalid-cpu.
Avoid using the OSS emulation layer to fetch the master volume,
and instead share the audioio code with OpenBSD.
Avoid a failed read on the master control's mute enum if it can't
be found, because sometimes there isn't one.
Previously the format placeholders were auto-converted to the maximum possible
unit, e.g. /proc/meminfo reports MemTotal of 16307104kB which will get
converted to 15.6GiB. It is now possible to specifiy the target unit, e.g. Mi,
which will be used for the conversion - in the example it would lead to
15924.9MiB.
The resulting number can now be further formatted via the decimal option. It
allows to specify the number of decimals to use, e.g. 15.6GiB vs. 15GiB or
15924.9MiB vs. 15925MiB.
Use station info instead of bss info to update %signal and %quality.
Bss info is based on scan info and doesn't get updated often. Station
info get's updated with every beacon. Bss info still used as fallback.
Failing to read() some data into the destination buffer from the slurp()
function was not considered an error. This means that we were
potentially leaving the caller with an uninitialized destination buffer
without letting him know it's uninitialized.
It is quite unlikely that a single call to read() would ever fail right
after a successful call to open(..., O_RDONLY). However, one practical
example of this happening is when the file being opened is actually a
directory.
Fixed by propagating the error (i.e. returning false from slurp()) if
the call to read() fails.
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
For my thoughts about optional dependencies, see
https://michael.stapelberg.ch/posts/2019-05-23-optional-dependencies/
This commit follows the best practices outlined in that article:
1. The travis config was modified to verify both code paths build and link/don’t
link against pulseaudio.
2. If pulseaudio is missing, the build fails until packagers explicitly pass a
--disable flag. In practice, I think the only situation when this flag should
be set is in source-based linux distributions where users can express
package-level compilation preferences (e.g. Gentoo USE flags).
3. The --version output now reflects the status of the optional dependency.
fixes#359
Added a function to print file contents to status bar without newlines.
Added tests for print file contents function
Added manpage entry for file contents
This commit implements the %devicename specifier for the volume module
for both PulseAudio and ALSA. This way, i3status will be able to display
the specific device that corresponds to the volume indicator.
Note that this is not implemented for the OSS API but is left in a state
where someone can pick it up for the future.
When using ALSA, the "Capture" mixer doesn't have the playback channel,
instead "capture"-related methods should be used to get information
about the current volume / state of the mixer.
Currently, the module cpu_usage prints %cpu0 information for the invalid
%cpu placeholder (i.e. the cpu number is missing).
Consider the following configuration.
order += "cpu_usage"
cpu_usage {
format = "cpu0=%cpu0 cpu1=%cpu1 cpu=%cpu"
# missing cpu number -------------------^
}
The configuration above produces the output below.
$ i3status -c config
i3status: trying to auto-detect output_format setting
i3status: auto-detected "term"
cpu0=-2% cpu1=-49% cpu=-2%
cpu0=06% cpu1=02% cpu=06%
cpu0=05% cpu1=06% cpu=05%
...
The module prints %cpu0 at the third placeholder where it should report
an error.
This commit fixes this behavior by initializing `number' to -1. If the
cpu is missing in %cpu placeholder, the sscanf function does not set
`number'. Because `number' is -1 (lower to 0), an error is reported and
the placeholder is skipped.
$ i3status -c ./config
i3status: trying to auto-detect output_format setting
i3status: auto-detected "term"
provided CPU number '-1' above detected number of CPU 4
cpu0= cpu1=-48% cpu=
provided CPU number '-1' above detected number of CPU 4
cpu0= cpu1=11% cpu=
provided CPU number '-1' above detected number of CPU 4
cpu0= cpu1=03% cpu=
...
its now possible to have percentage before and after a variable. except
for the date. But percentage with dates does not make much sense to me, so
i skipped it.
Since the following commit in the Linux kernel tree
0fdc100bdc4b ethtool: allow non-netadmin to query settings
it is no longer necessary to have the CAP_NET_ADMIN capability to query
a device speed using ioctl(..., SIOCETHTOOL) in conjonction with the
ETHTOOL_GSET ethtool command.
The mentioned commit landed first in the 2.6.37 version of the Kernel.
This version is no longer maintained nowdays.
Since it is not necessary anymore, it is strongly prefered from a
security standpoint to drop the CAP_NET_ADMIN capability from the
binary.
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
Calling globfree(NULL) is undefined behaviour. In Linux (glibc), it
results in a segmentation fault.
It is also undefined behaviour to call globfree(&pglob) if a previous
call to glob(&pglob) returned an error.
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
The manual of glob(3) says that the function returns 0 on successful
completion. Any other integer value should be considered an error, not
only negative integers.
In practice, *BSD systems use negative values but Linux uses positive
integers.
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
Compiling on Linux with -Wundef produces the following warning:
warning: "__OpenBSD__" is not defined, evaluates to 0 [-Wundef]
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
Before the following change
f947d0a Breaks configfiles! Major refactoring of i3status, see below
The die(fmt, ...) function was outputting the reason to the status bar
in addition to stderr. For this reason, it was meaningful to create a
temporary string according to the format string and then passing it
around to the different functions.
Nowadays, we only display the error message to stderr so calling
fprintf(stderr, ...) is much simpler.
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
The following commit:
6a75ea9 Show IP address when address has a label
introduced a way to show the IP address of an interface when a label is
associated to the IP.
When a label is associated to an IP, the structure returned by
getifaddrs() has the label concatenated to the interface name in the
.ifa_name field as in the following example:
struct ifaddrs ifaddr = {
.ifa_name = "eth0:mylabel",
};
As a consequence, using a strict comparison between the interface name
and the .ifa_name field yields a falsy result. However, checking if the
.ifa_name starts with the interface name (e.g. eth0) does not work
either because other network interfaces can have a name which starts
with eth0.
This commit solves the issue by stripping out the optional label from
the .ifa_name field before making a strict comparison with the interface
name.
Fix#283
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
On some hardware the AUDIO_MIXER_READ ioctl requires the current number
of channels to be set, and the mute device found needs to be checked if
it belongs to the master output device.
`print_battery_info` computes `batt_info.percentage_remaining` by
dividing batt_info.remaining by `full`. If `full` is `0` then the
battery remaining will be reported as "inf".
Before this, it tries to set `full` to either the design capacity or to
the last known good charge. It determines if these values are available
by checking whether their fields in `batt_info` are non-negative. As it
initialized `batt_info` with values of `-1`, a non-negative value
implies that something has provided a value.
`slurp_all_batteries` and `add_battery_info` however initialize these
fields to zero, so if these functions are called then
`batt_info.full_design` will always be used.
This means that on systems that don't provide a value for design
capacity the percentage remaining will be reported as "inf", unless the
user has set `last_full_capacity` to `true` in their `i3status.conf`.
This patch changes `print_battery_info` to expect values for the battery
capacity to be strictly greater than zero. This seems reasonable as a
battery with a capacity of zero isn't useful.
An alternative solution would be to change `slurp_all_batteries` and
`add_battery_info` to initialize `batt_info` with `-1`, as
`print_battery_info` does. This is less appealing as `add_battery_info`
is accumulating the values, so using `-1` would introduce off-by-one
errors without additional code to avoid them.