linux-sysprog · beginner · ~15 min

Environment Integer Variable Parser

Safely validate and parse process environment variables with fallback defaults.

Challenge

Process environment variables read via getenv() are untrusted user-controlled strings. A defensive parser converts strings to integers using strtol, checking for empty inputs, non-numeric characters, and arithmetic overflow.

Your Task

Implement:

int parse_env_int(const char *env_val, int default_val, int min_val, int max_val, int *out);

Rules

  1. If out == NULL, return -1.
  2. If env_val == NULL or env_val[0] == '\0', set *out = default_val and return 0.
  3. Parse env_val with strtol(env_val, &endptr, 10).
  4. If endptr == env_val (no digits found) or *endptr != '\0' (trailing garbage characters), set *out = default_val and return -1.
  5. If parsed value is < min_val or > max_val, set *out = default_val and return -1.
  6. On success, set *out = (int)parsed_val and return 0.

Example

int port = 0;
parse_env_int("8080", 3000, 1, 65535, &port); // returns 0, port == 8080
parse_env_int("invalid", 3000, 1, 65535, &port); // returns -1, port == 3000

Input format

env_val: string from getenv; defaults and bounds: int; out: pointer to int.

Output format

Returns 0 on valid parse/fallback, -1 on parse failure/out of range.

Constraints

Must use strtol with endptr check. No atoi.

Starter code

#include <stddef.h>
#include <stdlib.h>

int parse_env_int(const char *env_val, int default_val, int min_val, int max_val, int *out) {
    (void)env_val; (void)default_val; (void)min_val; (void)max_val; (void)out;
    return -1;
}

Common mistakes

Using atoi (which has undefined behavior on overflow and no error reporting); ignoring endptr.

Edge cases to handle

NULL string uses default and returns 0; trailing non-digits like "123abc" fail with -1; out of range values fail.

Background lessons

Solve this exercise in the browser editor — compile and run against the test harness, no setup required.