Air Quality Monitor
Portable C application for collecting, storing, and analyzing air quality sensor readings
Loading...
Searching...
No Matches
aqm_paths.c
1#include "core/aqm_paths.h"
2#include "core/aqm_platform.h"
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7static char g_data_dir[AQM_PATH_MAX];
8
9static int append_path(char *buf, size_t buflen, const char *a, const char *b) {
10 int n = snprintf(buf, buflen, "%s%s%s", a, AQM_PATH_SEP, b);
11 if (n < 0 || (size_t)n >= buflen)
12 return -1;
13 return 0;
14}
15
16void aqm_paths_init(void) {
17 const char *env = getenv("AIR_QUALITY_DATA_DIR");
18 if (env && env[0] != '\0') {
19 size_t len = strlen(env);
20 if (len >= sizeof(g_data_dir)) {
21 fprintf(stderr, "AIR_QUALITY_DATA_DIR path too long.\n");
22 g_data_dir[0] = '\0';
23 return;
24 }
25 memcpy(g_data_dir, env, len + 1);
26 } else {
27 if (snprintf(g_data_dir, sizeof(g_data_dir), "data") >= (int)sizeof(g_data_dir)) {
28 g_data_dir[0] = '\0';
29 return;
30 }
31 }
32
33 if (aqm_mkdir_p(g_data_dir) != 0) {
34 fprintf(stderr, "Could not create data directory: %s\n", g_data_dir);
35 g_data_dir[0] = '\0';
36 }
37}
38
39int aqm_get_data_dir(char *buf, size_t buflen) {
40 if (!buf || buflen == 0)
41 return -1;
42 if (g_data_dir[0] == '\0') {
43 aqm_paths_init();
44 }
45 if (g_data_dir[0] == '\0')
46 return -1;
47 if (strlen(g_data_dir) >= buflen)
48 return -1;
49 memcpy(buf, g_data_dir, strlen(g_data_dir) + 1);
50 return 0;
51}
52
53int aqm_get_db_path(char *buf, size_t buflen) {
54 char dir[AQM_PATH_MAX];
55 if (aqm_get_data_dir(dir, sizeof(dir)) != 0)
56 return -1;
57 return append_path(buf, buflen, dir, "air_quality.db");
58}
59
60int aqm_get_config_path(char *buf, size_t buflen) {
61 char dir[AQM_PATH_MAX];
62 if (aqm_get_data_dir(dir, sizeof(dir)) != 0)
63 return -1;
64 return append_path(buf, buflen, dir, "config.cfg");
65}