* ENV_NAME_FDS has the following format: Each descriptor as string followed
* by a comma; there's a trailing comma. Example: "2,4,". */
static void init_from_environment(void) {
+ const char *env;
+
+ initialized = 1;
tracked_fds_count = 0;
- const char *env = getenv(ENV_NAME_FDS);
+ /* If ENV_NAME_FORCE_WRITE is set and not empty, allow writes to a non-tty
+ * device. Use with care! Mainly used for the test suite. */
+ env = getenv(ENV_NAME_FORCE_WRITE);
+ if (env && env[0] != '\0') {
+ force_write_to_non_tty = 1;
+ }
+
+ env = getenv(ENV_NAME_FDS);
if (!env) {
return;
}
static void update_environment(void) {
/* An integer (32-bit) has at most 10 digits, + 1 for the comma after each
* number. Bigger file descriptors (which shouldn't occur in reality) are
- * truncated. */
+ * skipped. */
char env[tracked_fds_count * (10 + 1) * sizeof(char)];
char *x = env;
size_t i;
for (i = 0; i < tracked_fds_count; i++) {
int length = snprintf(x, 10 + 1, "%d", tracked_fds[i]);
- if (length >= 10 + 1)
- return;
+ if (length >= 10 + 1) {
+ /* Integer too bit to fit the buffer, skip it. */
+ continue;
+ }
/* Write comma after number. */
x += length;