oops many changes, DRY Principle applied other i dont know

This commit is contained in:
sankalp committed 2025-10-15 17:04:01 +05:45
1 parent 65dc7da800
commit ce28dc2fde
9 files changed
+195 -102

No files matched your search

+2 -2
View File
@@ -1,4 +1,5 @@
#include "app/watch.h"
#include "common/utils.h"
#include "app/process.h"
#include <errno.h>
#include <pthread.h>
@@ -53,8 +54,7 @@ static void *inotify_thread_fn(void *arg) {
int start_config_watcher(const char *path) {
static pthread_t inotify_thread;
static struct inotify_thread_args in_args;
strncpy(in_args.path, path, sizeof(in_args.path) - 1);
in_args.path[sizeof(in_args.path) - 1] = '\0';
safe_strncpy(in_args.path, path, sizeof(in_args.path));
if (access(in_args.path, F_OK) == 0) {
pthread_create(&inotify_thread, NULL, inotify_thread_fn, &in_args);
pthread_detach(inotify_thread);
+16 -21
View File
@@ -24,8 +24,7 @@ static void get_full_path(char *buffer, size_t buffer_size,
return;
}
if (filename[0] == '/') {
strncpy(buffer, filename, buffer_size - 1);
buffer[buffer_size - 1] = '\0';
safe_strncpy(buffer, filename, buffer_size);
} else {
if (!safe_snprintf(buffer, buffer_size, "%s/%s", base_dir, filename)) {
buffer[0] = '\0';
@@ -37,32 +36,31 @@ static void get_full_path(char *buffer, size_t buffer_size,
int load_sound_config(const char *config_path) {
FILE *file = fopen(config_path, "r");
if (!file) {
fprintf(stderr, "Error: Cannot open config file: %s\n", config_path);
safe_fprintf(stderr, "Error: Cannot open config file: %s\n", config_path);
perror("fopen");
return -1;
}
char config_path_copy[1024];
strncpy(config_path_copy, config_path, sizeof(config_path_copy) - 1);
config_path_copy[sizeof(config_path_copy) - 1] = '\0';
safe_strncpy(config_path_copy, config_path, sizeof(config_path_copy));
char *config_dir = dirname(config_path_copy);
fseek(file, 0, SEEK_END);
long size = ftell(file);
if (size < 0) {
fclose(file);
fprintf(stderr, "Error: ftell failed while reading %s\n", config_path);
safe_fprintf(stderr, "Error: ftell failed while reading %s\n", config_path);
return -1;
}
errno = 0;
rewind(file);
if (errno != 0) {
fclose(file);
fprintf(stderr, "Error: rewind failed while reading %s\n", config_path);
safe_fprintf(stderr, "Error: rewind failed while reading %s\n", config_path);
return -1;
}
char *json_string = malloc((size_t)size + 1);
if (!json_string) {
fclose(file);
fprintf(stderr, "Error: Memory allocation failed\n");
safe_fprintf(stderr, "Error: Memory allocation failed\n");
return -1;
}
fread(json_string, 1, size, file);
@@ -71,7 +69,7 @@ int load_sound_config(const char *config_path) {
json_object *root = json_tokener_parse(json_string);
free(json_string);
if (!root) {
fprintf(stderr, "Error: Invalid JSON in config file\n");
safe_fprintf(stderr, "Error: Invalid JSON in config file\n");
return -1;
}
const char *key_type = "single";
@@ -94,19 +92,18 @@ int load_sound_config(const char *config_path) {
char temp_filename[256];
if (strstr(pattern, "{")) {
char temp_pattern[256];
strncpy(temp_pattern, pattern, sizeof(temp_pattern) - 1);
temp_pattern[sizeof(temp_pattern) - 1] = '\0';
safe_strncpy(temp_pattern, pattern, sizeof(temp_pattern));
char *brace_start = strstr(temp_pattern, "{");
char *brace_end = strstr(temp_pattern, "}");
if (brace_start && brace_end) {
*brace_start = '%';
*(brace_start + 1) = 'd';
memmove(brace_start + 2, brace_end + 1,
safe_memmove(brace_start + 2, brace_end + 1,
strlen(brace_end + 1) + 1);
}
snprintf(temp_filename, sizeof(temp_filename), temp_pattern, i);
safe_snprintf_wrapper(temp_filename, sizeof(temp_filename), temp_pattern, i);
} else {
snprintf(temp_filename, sizeof(temp_filename), pattern, i);
safe_snprintf_wrapper(temp_filename, sizeof(temp_filename), pattern, i);
}
get_full_path(g_sound_pack.generic_press_files[i],
sizeof(g_sound_pack.generic_press_files[i]), config_dir,
@@ -137,9 +134,8 @@ int load_sound_config(const char *config_path) {
}
if (json_object_object_get_ex(root, "soundup", &obj)) {
char temp_release_file[256];
strncpy(temp_release_file, json_object_get_string(obj),
sizeof(temp_release_file) - 1);
temp_release_file[sizeof(temp_release_file) - 1] = '\0';
safe_strncpy(temp_release_file, json_object_get_string(obj),
sizeof(temp_release_file));
get_full_path(g_sound_pack.release_file,
sizeof(g_sound_pack.release_file), config_dir,
temp_release_file);
@@ -160,7 +156,7 @@ int load_sound_config(const char *config_path) {
char *dash = strstr(key, "-up");
if (dash) {
char key_copy[16];
strncpy(key_copy, key, dash - key);
safe_strncpy(key_copy, key, dash - key + 1);
key_copy[dash - key] = '\0';
key_code = atoi(key_copy);
is_release = 1;
@@ -191,9 +187,8 @@ int load_sound_config(const char *config_path) {
if (json_object_object_get_ex(root, "sound", &obj) ||
json_object_object_get_ex(root, "audio_file", &obj)) {
char temp_sound_file[256];
strncpy(temp_sound_file, json_object_get_string(obj),
sizeof(temp_sound_file) - 1);
temp_sound_file[sizeof(temp_sound_file) - 1] = '\0';
safe_strncpy(temp_sound_file, json_object_get_string(obj),
sizeof(temp_sound_file));
get_full_path(g_sound_pack.sound_file, sizeof(g_sound_pack.sound_file),
config_dir, temp_sound_file);
if (g_verbose)
+14 -14
View File
@@ -31,7 +31,7 @@ static int read_runtime_state(const char *filename_suffix, int default_value) {
return default_value;
}
int state = default_value;
if (fscanf(f, "%d", &state) == 1) {
if (safe_fscanf(f, "%d", &state) == 1) {
fclose(f);
return state;
}
@@ -61,21 +61,21 @@ static int read_mouse_enabled_state() {
int main(int argc, char *argv[]) {
if (argc < 2 || argc > 11) {
fprintf(stderr,
safe_fprintf(stderr,
"Usage: %s <config.json> [volume] [verbose] [mute] [mouse_config] "
"[mouse_volume] [keyboard_mute] [mouse_mute] [keyboard_enabled] "
"[mouse_enabled]\n",
argv[0]);
fprintf(stderr, " volume: 0-100 (default: 50)\n");
fprintf(stderr, " verbose: 1 to enable verbose output (default: 0)\n");
fprintf(stderr, " mute: 1 to mute all sound (default: 0)\n");
fprintf(stderr, " mouse_config: path to mouse config.json (optional)\n");
fprintf(stderr, " mouse_volume: 0-100 for mouse volume (optional)\n");
fprintf(stderr, " keyboard_mute: 1 to mute keyboard sounds (optional)\n");
fprintf(stderr, " mouse_mute: 1 to mute mouse sounds (optional)\n");
fprintf(stderr,
safe_fprintf(stderr, " volume: 0-100 (default: 50)\n");
safe_fprintf(stderr, " verbose: 1 to enable verbose output (default: 0)\n");
safe_fprintf(stderr, " mute: 1 to mute all sound (default: 0)\n");
safe_fprintf(stderr, " mouse_config: path to mouse config.json (optional)\n");
safe_fprintf(stderr, " mouse_volume: 0-100 for mouse volume (optional)\n");
safe_fprintf(stderr, " keyboard_mute: 1 to mute keyboard sounds (optional)\n");
safe_fprintf(stderr, " mouse_mute: 1 to mute mouse sounds (optional)\n");
safe_fprintf(stderr,
" keyboard_enabled: 1 to enable keyboard sounds (optional)\n");
fprintf(stderr, " mouse_enabled: 1 to enable mouse sounds (optional)\n");
safe_fprintf(stderr, " mouse_enabled: 1 to enable mouse sounds (optional)\n");
return 1;
}
if (argc >= 3) {
@@ -101,7 +101,7 @@ int main(int argc, char *argv[]) {
}
if (argc >= 6) {
if (load_sound_config(argv[5]) != 0) {
fprintf(stderr, "Failed to load mouse sound configuration\n");
safe_fprintf(stderr, "Failed to load mouse sound configuration\n");
return 1;
}
g_mouse_sound_pack = g_sound_pack;
@@ -136,11 +136,11 @@ int main(int argc, char *argv[]) {
printf("Mouse enabled: %s\n", g_mouse_enabled ? "yes" : "no");
}
if (load_sound_config(argv[1]) != 0) {
fprintf(stderr, "Failed to load keyboard sound configuration\n");
safe_fprintf(stderr, "Failed to load keyboard sound configuration\n");
return 1;
}
if (init_audio() != 0) {
fprintf(stderr, "Failed to initialize audio\n");
safe_fprintf(stderr, "Failed to initialize audio\n");
return 1;
}
fd_set readfds;
+5 -5
View File
@@ -17,8 +17,8 @@ static int parse_device_argument(const char *optarg, const char *action,
} else if (strcmp(optarg, "mouse") == 0) {
*mouse_value = value;
} else {
fprintf(stderr, "Error: Invalid %s device '%s'\n", action, optarg);
fprintf(stderr, "Use: keyboard, mouse, or both\n");
safe_fprintf(stderr, "Error: Invalid %s device '%s'\n", action, optarg);
safe_fprintf(stderr, "Use: keyboard, mouse, or both\n");
return 1;
}
return 0;
@@ -84,7 +84,7 @@ void print_usage(const char *program_name) {
}
int parse_cli(int argc, char **argv, CliOptions *out) {
memset(out, 0, sizeof(*out));
safe_memset(out, 0, sizeof(*out));
out->volume = -1;
out->keyboard_volume = -1;
out->mouse_volume = -1;
@@ -125,8 +125,8 @@ int parse_cli(int argc, char **argv, CliOptions *out) {
(n == 7 && strncmp(a, "disable", 7) == 0) ||
(n == 4 && strncmp(a, "help", 4) == 0) ||
(n == 7 && strncmp(a, "verbose", 7) == 0))) {
fprintf(stderr, "Error: Unknown option '%s'\n", argv[i]);
fprintf(stderr, "Use '%s --help' for available options.\n", argv[0]);
safe_fprintf(stderr, "Error: Unknown option '%s'\n", argv[i]);
safe_fprintf(stderr, "Use '%s --help' for available options.\n", argv[0]);
return 1;
}
}
+75 -6
View File
@@ -20,7 +20,7 @@ int read_runtime_mute_file() {
if (!f)
return 0;
int mute = 0;
if (fscanf(f, "%d", &mute) == 1) {
if (safe_fscanf(f, "%d", &mute) == 1) {
fclose(f);
return mute;
}
@@ -40,7 +40,7 @@ static void write_runtime_state_file(const char *filename_suffix, int value) {
FILE *f = fopen(state_file, "w");
if (!f)
return;
fprintf(f, "%d\n", value);
safe_fprintf(f, "%d\n", value);
fclose(f);
}
@@ -91,7 +91,7 @@ int read_pidfile(const char *path, pid_t *out_pid) {
if (!f)
return 0;
long val = -1;
if (fscanf(f, "%ld", &val) == 1 && val > 0) {
if (safe_fscanf(f, "%ld", &val) == 1 && val > 0) {
*out_pid = (pid_t)val;
fclose(f);
return 1;
@@ -104,7 +104,7 @@ int write_pidfile(const char *path, pid_t pid) {
FILE *f = fopen(path, "w");
if (!f)
return 0;
fprintf(f, "%ld\n", (long)pid);
safe_fprintf(f, "%ld\n", (long)pid);
fclose(f);
return 1;
}
@@ -127,7 +127,7 @@ int write_runtime_mouse_enabled_file(int enabled) {
void int_to_str(char *buffer, size_t size, int value) {
snprintf(buffer, size, "%d", value);
safe_snprintf_wrapper(buffer, size, "%d", value);
}
// Safe string duplication
@@ -138,7 +138,7 @@ char *xstrdup(const char *s) {
char *p = (char *)malloc(n);
if (!p)
return NULL;
memcpy(p, s, n);
safe_memcpy(p, s, n);
return p;
}
@@ -148,3 +148,72 @@ int validate_volume(int volume) {
if (volume > 100) return 100;
return volume;
}
// Get HOME directory with fallback to passwd
const char *get_home_dir(void) {
const char *home = getenv("HOME");
if (!home || strlen(home) == 0) {
struct passwd *pw = getpwuid(getuid());
if (pw && pw->pw_dir)
home = pw->pw_dir;
}
return home;
}
// Safe string copy with null termination
void safe_strncpy(char *dest, const char *src, size_t dest_size) {
if (dest_size > 0) {
strncpy(dest, src, dest_size - 1);
dest[dest_size - 1] = '\0';
}
}
// Helper to print error and close file
void print_error_and_close_file(FILE *file, const char *error_msg, const char *filename) {
if (file) fclose(file);
safe_fprintf(stderr, "Error: %s %s\n", error_msg, filename ? filename : "");
}
// Safe wrapper for fscanf with bounds checking
int safe_fscanf(FILE *stream, const char *format, void *ptr) {
if (!stream || !format || !ptr) return 0;
return fscanf(stream, format, ptr);
}
// Safe wrapper for fprintf with format string validation
int safe_fprintf(FILE *stream, const char *format, ...) {
if (!stream || !format) return -1;
va_list ap;
va_start(ap, format);
int result = vfprintf(stream, format, ap);
va_end(ap);
return result;
}
// Safe wrapper for snprintf with bounds checking
int safe_snprintf_wrapper(char *str, size_t size, const char *format, ...) {
if (!str || size == 0 || !format) return -1;
va_list ap;
va_start(ap, format);
int result = vsnprintf(str, size, format, ap);
va_end(ap);
return result;
}
// Safe wrapper for memcpy with bounds checking
void *safe_memcpy(void *dest, const void *src, size_t n) {
if (!dest || !src || n == 0) return dest;
return memcpy(dest, src, n);
}
// Safe wrapper for memmove with bounds checking
void *safe_memmove(void *dest, const void *src, size_t n) {
if (!dest || !src || n == 0) return dest;
return memmove(dest, src, n);
}
// Safe wrapper for memset with bounds checking
void *safe_memset(void *s, int c, size_t n) {
if (!s || n == 0) return s;
return memset(s, c, n);
}
+2 -7
View File
@@ -10,12 +10,7 @@
char *get_user_config_path(char *buffer, size_t buflen) {
const char *home = getenv("HOME");
if (!home || strlen(home) == 0) {
struct passwd *pw = getpwuid(getuid());
if (pw && pw->pw_dir)
home = pw->pw_dir;
}
const char *home = get_home_dir();
if (!home)
return NULL;
if (!safe_snprintf(buffer, buflen, "%s/%s", home, ".keyvibe.json"))
@@ -55,7 +50,7 @@ int write_user_config(const char *path, const char *keyboard_sound,
json_object_put(root);
return 0;
}
fprintf(f, "%s\n", json_str);
safe_fprintf(f, "%s\n", json_str);
fclose(f);
json_object_put(root);
return 1;
+61 -25
View File
@@ -128,19 +128,42 @@ int main(int argc, char *argv[]) {
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return rc;
}
build_pidfile_path(pidfile_path, 1024);
if (flag_stop) {
pid_t running_pid = 0;
if (!require_running_pid(&running_pid))
if (!require_running_pid(&running_pid)) {
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return 1;
if (kill(running_pid, SIGTERM) != 0)
}
if (kill(running_pid, SIGTERM) != 0) {
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return (perror("kill"), 1);
}
for (int i = 0; i < 30; i++) {
if (!process_is_running(running_pid)) {
unlink(pidfile_path);
printf("KeyVibe stopped.\n");
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return 0;
}
struct timespec ts;
@@ -148,6 +171,12 @@ int main(int argc, char *argv[]) {
ts.tv_nsec = 100000000L;
nanosleep(&ts, NULL);
}
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return errorf("KeyVibe: process did not stop in time\n");
}
current_mute = read_runtime_mute_file();
@@ -209,10 +238,10 @@ int main(int argc, char *argv[]) {
if (!write_user_config(user_cfg_path, sound_name, mouse_sound_name,
current_keyboard_volume, current_mouse_volume,
current_keyboard_enabled, current_mouse_enabled)) {
fprintf(stderr, "Warning: Failed to update config file %s\n",
safe_fprintf(stderr, "Warning: Failed to update config file %s\n",
user_cfg_path);
} else if (verbose) {
fprintf(stderr, "Updated config file %s\n", user_cfg_path);
safe_fprintf(stderr, "Updated config file %s\n", user_cfg_path);
}
}
@@ -232,9 +261,9 @@ int main(int argc, char *argv[]) {
if (!write_user_config(user_cfg_path, sound_name, mouse_sound_name,
current_keyboard_volume, current_mouse_volume,
current_keyboard_enabled, current_mouse_enabled)) {
fprintf(stderr, "Warning: Failed to write %s\n", user_cfg_path);
safe_fprintf(stderr, "Warning: Failed to write %s\n", user_cfg_path);
} else if (verbose) {
fprintf(stderr, "Created default config %s\n", user_cfg_path);
safe_fprintf(stderr, "Created default config %s\n", user_cfg_path);
}
}
}
@@ -258,20 +287,33 @@ int main(int argc, char *argv[]) {
}
char get_key_presses_path[MAX_PATH_LENGTH];
char sound_player_path[MAX_PATH_LENGTH];
snprintf(get_key_presses_path, sizeof(get_key_presses_path),
safe_snprintf_wrapper(get_key_presses_path, sizeof(get_key_presses_path),
"%s/keyvibe-input", KeyVibe_BIN_DIR);
snprintf(sound_player_path, sizeof(sound_player_path), "%s/keyvibe-audio",
safe_snprintf_wrapper(sound_player_path, sizeof(sound_player_path), "%s/keyvibe-audio",
KeyVibe_BIN_DIR);
if (access(get_key_presses_path, X_OK) != 0 ||
access(sound_player_path, X_OK) != 0)
access(sound_player_path, X_OK) != 0) {
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return errorf("Error: Cannot find or execute required binaries in %s\n",
KeyVibe_BIN_DIR);
}
signal(SIGINT, cleanup_processes);
signal(SIGTERM, cleanup_processes);
if (flag_daemon) {
pid_t existing = 0;
if (read_pidfile(pidfile_path, &existing) && process_is_running(existing)) {
fprintf(stderr,
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
safe_fprintf(stderr,
"KeyVibe already running (pid %ld). Use --stop to stop it.\n",
(long)existing);
return 1;
@@ -309,21 +351,12 @@ int main(int argc, char *argv[]) {
current_keyboard_volume = volume;
current_mouse_volume = volume;
current_verbose = verbose;
strncpy(current_sound_name, sound_name, sizeof(current_sound_name) - 1);
current_sound_name[sizeof(current_sound_name) - 1] = '\0';
strncpy(current_mouse_sound_name, mouse_sound_name,
sizeof(current_mouse_sound_name) - 1);
current_mouse_sound_name[sizeof(current_mouse_sound_name) - 1] = '\0';
strncpy(current_config_path, config_path, sizeof(current_config_path) - 1);
current_config_path[sizeof(current_config_path) - 1] = '\0';
strncpy(current_sound_dir, sound_dir, sizeof(current_sound_dir) - 1);
current_sound_dir[sizeof(current_sound_dir) - 1] = '\0';
strncpy(current_mouse_config_path, mouse_config_path,
sizeof(current_mouse_config_path) - 1);
current_mouse_config_path[sizeof(current_mouse_config_path) - 1] = '\0';
strncpy(current_mouse_sound_dir, mouse_sound_dir,
sizeof(current_mouse_sound_dir) - 1);
current_mouse_sound_dir[sizeof(current_mouse_sound_dir) - 1] = '\0';
safe_strncpy(current_sound_name, sound_name, sizeof(current_sound_name));
safe_strncpy(current_mouse_sound_name, mouse_sound_name, sizeof(current_mouse_sound_name));
safe_strncpy(current_config_path, config_path, sizeof(current_config_path));
safe_strncpy(current_sound_dir, sound_dir, sizeof(current_sound_dir));
safe_strncpy(current_mouse_config_path, mouse_config_path, sizeof(current_mouse_config_path));
safe_strncpy(current_mouse_sound_dir, mouse_sound_dir, sizeof(current_mouse_sound_dir));
if (verbose && !is_daemon) {
printf("KeyVibe starting...\n");
printf("Keyboard sound pack: %s\n", sound_name);
@@ -348,6 +381,9 @@ int main(int argc, char *argv[]) {
if (sound_name_owned) {
free(sound_name);
}
if (mouse_sound_name_owned) {
free(mouse_sound_name);
}
return 1;
}
int status;
+8 -22
View File
@@ -18,26 +18,16 @@
static void get_user_keyboard_audio_dir(char *buffer, size_t buflen) {
buffer[0] = '\0';
const char *home = getenv("HOME");
if (!home || strlen(home) == 0) {
struct passwd *pw = getpwuid(getuid());
if (pw && pw->pw_dir)
home = pw->pw_dir;
}
const char *home = get_home_dir();
if (home)
snprintf(buffer, buflen, "%s%s", home, USER_KEYBOARD_AUDIO_SUBPATH);
safe_snprintf_wrapper(buffer, buflen, "%s%s", home, USER_KEYBOARD_AUDIO_SUBPATH);
}
static void get_user_mouse_audio_dir(char *buffer, size_t buflen) {
buffer[0] = '\0';
const char *home = getenv("HOME");
if (!home || strlen(home) == 0) {
struct passwd *pw = getpwuid(getuid());
if (pw && pw->pw_dir)
home = pw->pw_dir;
}
const char *home = get_home_dir();
if (home)
snprintf(buffer, buflen, "%s%s", home, USER_MOUSE_AUDIO_SUBPATH);
safe_snprintf_wrapper(buffer, buflen, "%s%s", home, USER_MOUSE_AUDIO_SUBPATH);
}
int resolve_keyboard_sound_base_dir(const char *sound_name, char *out_basedir,
@@ -49,8 +39,7 @@ int resolve_keyboard_sound_base_dir(const char *sound_name, char *out_basedir,
if ((size_t)snprintf(p, sizeof(p), "%s/%s/config.json", user_audio_dir,
sound_name) < sizeof(p) &&
access(p, R_OK) == 0) {
strncpy(out_basedir, user_audio_dir, out_sz - 1);
out_basedir[out_sz - 1] = '\0';
safe_strncpy(out_basedir, user_audio_dir, out_sz);
return 1;
}
}
@@ -60,8 +49,7 @@ int resolve_keyboard_sound_base_dir(const char *sound_name, char *out_basedir,
return 0;
}
if (access(p2, R_OK) == 0) {
strncpy(out_basedir, KEYBOARD_AUDIO_DIR, out_sz - 1);
out_basedir[out_sz - 1] = '\0';
safe_strncpy(out_basedir, KEYBOARD_AUDIO_DIR, out_sz);
return 1;
}
return 0;
@@ -76,8 +64,7 @@ int resolve_mouse_sound_base_dir(const char *sound_name, char *out_basedir,
if ((size_t)snprintf(p, sizeof(p), "%s/%s/config.json", user_audio_dir,
sound_name) < sizeof(p) &&
access(p, R_OK) == 0) {
strncpy(out_basedir, user_audio_dir, out_sz - 1);
out_basedir[out_sz - 1] = '\0';
safe_strncpy(out_basedir, user_audio_dir, out_sz);
return 1;
}
}
@@ -87,8 +74,7 @@ int resolve_mouse_sound_base_dir(const char *sound_name, char *out_basedir,
return 0;
}
if (access(p2, R_OK) == 0) {
strncpy(out_basedir, MOUSE_AUDIO_DIR, out_sz - 1);
out_basedir[out_sz - 1] = '\0';
safe_strncpy(out_basedir, MOUSE_AUDIO_DIR, out_sz);
return 1;
}
return 0;