summaryrefslogtreecommitdiffhomepage
path: root/lib
AgeCommit message (Collapse)Author
2023-07-27uloop: interrupt on VM signalsJo-Philipp Wich
When the VM instance loading the uloop module has signal dispatching enabled, implicitly register the signal pipe as file descriptor in the global uloop and dispatch received signals to the VM instance. This ensures that the respective managed ucode signal handlers are invoked immediately and not just after `uloop_run()` returns. Also end the uloop in case any invoked signal handler threw an exception, to match the expected behaviour with other kinds of callbacks. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-25fs: explicitly compare isatty() resultJo-Philipp Wich
Reportedly, automatic conversion of the `isatty()` int result value to a bool does not work correctly on PPC. Explicitly compare the result value with `1` to infer the boolean result value. Fixes: #165 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-13Merge pull request #164 from jow-/docs-improvementsJo-Philipp Wich
docs: various improvements
2023-07-13docs: various improvementsJo-Philipp Wich
- Switch JSDoc theme to "clean-jsdoc-theme" - Add some custom CSS and JS tweaks to the theme - Use a condensed README.md for the toplevel directory - Include a longer README.md in the documentation portal - Tweak JSDoc annotations for better output results - Register `ucode.mein.io` CNAME Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-12Merge pull request #163 from jow-/docs-improvementsJo-Philipp Wich
fs: complete function documentation coverage
2023-07-12fs: use `fseeko()` and `ftello()`Jo-Philipp Wich
Use `fseeko()` and `ftello()` instead of `fseek()` and `ftell()` respectively in order to be able to deal with large file offsets. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-12fs: complete function documentation coverageJo-Philipp Wich
Add missing function documentation and return value annotations. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-12fs: add JSDoc documentationJo-Philipp Wich
Add JSDoc documentation blocks to all exported filesystem functions. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-07-12math: add JSDoc documentationJo-Philipp Wich
Add JSDoc documentation blocks to all exported math functions. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-06-05nl80211: add constants for iftypesFelix Fietkau
Useful for adding/removing interfaces Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-05-27ubus: add support for strings containing null bytesFelix Fietkau
When converting ucode strings to blobmsg, use blobmsg_add_field in order to explicltly pass the length of the data. In the other direction, use ucv_string_new_length based on the attribute length. Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-05-27struct: remove state->lenFelix Fietkau
It is unused and I couldn't find any purpose for it Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-04-03uci: fix ctx.commit() without argumentsJo-Philipp Wich
A uci commit operation may invalidate the package pointer, leading to an infinite loop while iterating the packages to commit. Refactor the code to first build a string list of configurations, then iterating it in order to avoid the iterator invalidation. While we're at it, also allow restricting save and revert operations to single configs, which was rejected as invalid before. Fixes: #146 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-03-17ubus: support multiple call return valuesJo-Philipp Wich
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-02-13rtnl: add missing uc_vm_registry_set callFelix Fietkau
Fixes maintaining the listener array Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-02-13rtnl: add missing ucv_get() callsFelix Fietkau
Arguments stored in the registry need an extra reference Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-02-13nl80211: add missing ucv_get() callsFelix Fietkau
Arguments stored in the registry need an extra reference Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-02-12nl80211: fix NL80211_ATTR_SURVEY_INFOAndre Heider
This is the last attribute, adapt .nattr to include it so it gets parsed. Signed-off-by: Andre Heider <a.heider@gmail.com>
2023-01-31rtnl: add support for registering an uloop based listenerFelix Fietkau
Similar to nl80211 uloop listener Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-01-23Merge pull request #138 from nbd168/nl80211Jo-Philipp Wich
nl80211: add support for registering an uloop based listener
2023-01-20fs: implement `fs.pipe()`Jo-Philipp Wich
The `pipe()` function takes no arguments and will return a two element array containing open read- and write file descriptors for a newly created pipe. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2023-01-19nl80211: add support for registering an uloop based listenerFelix Fietkau
Can be used to capture nl80211 messages in an event driven program Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-01-19nl80211: refactor command bitmask handlingFelix Fietkau
- add missing overflow check - make array size dynamic - set all bits if command id is not specified - add helper function for filling command bits Signed-off-by: Felix Fietkau <nbd@nbd.name>
2023-01-09Merge pull request #137 from ynezz/ynezz/isattyJo-Philipp Wich
fs: add `isatty()` function
2023-01-09fs: add `isatty()` functionPetr Štetiar
Expose the `isatty(3)` libc function in the fs module to allow checking whether a file descriptor refers to a terminal. Signed-off-by: Petr Štetiar <ynezz@true.cz>
2023-01-09nl80211: add support for NL80211_ATTR_MPATH_INFOJohn Crispin
Signed-off-by: John Crispin <john@phrozen.org>
2022-11-29fs: add `realpath()` functionJo-Philipp Wich
Expose the `realpath(3)` libc function in the fs module to allow for canonicalizing file paths. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-11-29Merge pull request #129 from jow-/math-add-isnanJo-Philipp Wich
math: add isnan() function
2022-11-29math: add isnan() functionJo-Philipp Wich
Add a new `isnan()` convenience function to the math library which can be used to test if a given value is a NaN double. The same test can be realized without the math library by using a function similar to the following one: function isNaN(x) { return x != x; } Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-11-29uloop: terminate parent uloop in task child processesJo-Philipp Wich
Ensure that the main process uloop is terminated within task child processes. Before this fix, using uloop in a task function would trigger invalid memory accesses in the parent process by notifying non-existing fd slots in the parent through the inherited shared epoll descriptor. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-11-23uci: auto-load package in `ctx.foreach()` and `ctx.get_first()`Jo-Philipp Wich
Functions that use `uci_lookup_ptr()` internally, such as `ctx.get()`, `ctx.set()` or `ctx.delete()`, implicitly load the given configuration name while the higher level functions `ctx.foreach()` or `ctx.get_first()` do not. This behaviour violates the principle of least surprise and might lead to non-deterministic program behavior as the outcome of these functions depends on prior uci operations performed on the cursor. Fix this issue by invoking `uci_load()` internally in case the given uci package name cannot be found in the cursor's package cache. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-10-18fs: expose `getdelim()` functionality through `fd.read()`Jo-Philipp Wich
When `fd.read()` is invoked with a single-character string argument, invoke `getdelim()` internally to read the input until the give character or EOF. This is useful for reading character delimited input data. For example `fd.read('\n')` will read any data up to the first newline (or EOF) while `fd.read('\0x00')` will read until the first null byte. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-10-07fs: use `getline()` for line wise read operationsJo-Philipp Wich
Use `getline()` instead of a custom `fgets()` wrapper logic to perform line wise reads from open file handles. This is required to properly deal with lines containing embedded null bytes. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-29uloop: task: gracefully handle absent output callbackJo-Philipp Wich
Both input and output callbacks for uloop tasks are optional, but the low level io callback implementation did not properly deal with an absent ucode output callback, triggering an exception in managed code due to invoking a null value as function. Fix this issue by checking for the availability of a callable output function and simply discarding the received task message otherwise. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-21ubus: hold reference to underlying connection until deferred is concludedJo-Philipp Wich
Prevent GC'ing (and thus tearing down) an active ubus connection as long as there's still unfinished deferred request contexts alive. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-09ubus: support obtaining numeric error codeJo-Philipp Wich
Some ubus users require access to the original ubus error status returned by various operations for fine grained error handling. Extend the error() function with an optional boolean argument which causes the function to return the numeric error code instead of a preformatted message when invoked. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-09ubus: add toplevel constants for ubus status codesJo-Philipp Wich
Add constants for ubus status codes to the toplevel module scope in order to avoid the need for magic values in the code. Suggested-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-09ubus: allow object method call handlers to return a numeric status codeJo-Philipp Wich
The implicit return style for sending ubus method replies currently always emits an UBUS_STATUS_NO_DATA code in case neither req.reply() was called, nor a deferred or object were returned by the handler function. This slightly complicates the implementation of handlers that do not wish to send reply data but simply acknowledge the request with an UBUS_STATUS_OK code. In order to simplify this use case, allow handlers to override the default status by treating integer return values as ubus error codes. After this change, the following handler: function (request) { /* do some work */ request.reply(null, 0); } ... can be rewritten as: function (request) { /* do some work */ return 0; } Suggested-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-09-05fs: add optional third permission argument to fs.open()Jo-Philipp Wich
Rework the `fs.open()` implementation to accept an optional third file permission argument which is applied to newly created files. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-08-24ubus: fix GCC strncpy() truncation warningJo-Philipp Wich
When building with gcc-10 and -O2, the following warning in ubus.c is triggered during the compilation: In function ‘uc_ubus_object_register’, inlined from ‘uc_ubus_publish’ at .../ubus.c:1521:10: .../ubus.c:1464:14: error: ‘strncpy’ output truncated before terminating nul copying as many bytes from a string as its length [-Werror=stringop-truncation] 1464 | obj->name = strncpy(onptr, ubus_object_name, namelen); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .../ubus.c: In function ‘uc_ubus_publish’: .../ubus.c:1447:12: note: length computed here 1447 | namelen = strlen(ubus_object_name); | ^~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors Solve this issue by using memcpy() instead. We already take care of allocating a zeroed, strlen() + 1 sized destination buffer so loosing the `\0` byte of the source string is perfectly fine. Fixes: #100 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-07-03rtnl: fix parsing/creation of IFLA_AF_SPEC RTA for the AF_BRIDGE familyJo-Philipp Wich
Some pecularities in the encoding of the IFLA_AF_SPEC attribute make it unsuitable for table driven parsing/generation. To solve this issue, introduce specific datatype handling for IFLA_AF_SPEC and parse/generate the RTA depending on the address family of the containing netlink message. Also add some missing constants while we're at it. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-29Merge pull request #91 from jow-/ubus-propagate-exceptionsJo-Philipp Wich
ubus: end uloop on exceptions in managed code
2022-06-29uloop: end uloop on exceptions in managed codeJo-Philipp Wich
Instead of silently continuing, end the uloop when encountering exceptions in ucode callbacks to let those exceptions propagate to the host program. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-29ubus: end uloop on exceptions in managed codeJo-Philipp Wich
Instead of silently continuing, end the uloop when encountering exceptions in ucode callbacks to let those exceptions propagate to the host program. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-28rtnl: expose IFLA_STATS64 contentsJo-Philipp Wich
Decode IFLA_STATS64 attribute and make contained counters available to ucode. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-28rtnl: expose ifinfomsg.ifi_change memberJo-Philipp Wich
For certain operations, such as bringing up interfaces, it is required to initialize the ifi_change mask in the ifinfomsg struct. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-28Merge pull request #86 from jow-/rtnl-fix-strict-chkJo-Philipp Wich
rtnl: update NETLINK_GET_STRICT_CHK socket flag with every request
2022-06-27rtnl: update NETLINK_GET_STRICT_CHK socket flag with every requestJo-Philipp Wich
So far the NETLINK_GET_STRICT_CHK socket flag was only set on the implicit socket creation performed during the first request and ignored for subsequent ones which made it impossible to perform only some requests with enabled strict checking. Modify the logic to check the flag state for every request and change it if needed. This allows performing both strict and non-strict requests over the same connection. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-27nl80211: fix NL80211_SURVEY_INFO_NOISE datatypeJo-Philipp Wich
Report the noise value as signed integer to calling ucode. Reported-by: John Crispin <john@phrozen.org> Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2022-06-17nl80211: recognize further NL80211_STA_INFO_* NLAsJo-Philipp Wich
Signed-off-by: Jo-Philipp Wich <jo@mein.io>