From 891831be3a751ce7700099e3de5048ab50a2867b Mon Sep 17 00:00:00 2001 From: beauby Date: Fri, 10 Feb 2012 00:21:26 +0100 Subject: [PATCH] Fixed the fgetln workaround --- i3-config-wizard/main.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c index cdce0653..8f245e44 100644 --- a/i3-config-wizard/main.c +++ b/i3-config-wizard/main.c @@ -8,6 +8,19 @@ * keysyms. * */ +#if defined(__FreeBSD__) +#include +#endif + +/* For systems without getline, fall back to fgetln */ +#if defined(__APPLE__) || (defined(__FreeBSD__) && __FreeBSD_version < 800000) +#define USE_FGETLN +#elif defined(__FreeBSD__) +/* Defining this macro before including stdio.h is necessary in order to have + * a prototype for getline in FreeBSD. */ +#define _WITH_GETLINE +#endif + #include #include #include @@ -283,7 +296,7 @@ static void finish() { char *line = NULL; size_t len = 0; -#if !defined(__APPLE__) +#ifndef USE_FGETLN ssize_t read; #endif bool head_of_file = true; @@ -296,10 +309,16 @@ static void finish() { fputs("# this file and re-run i3-config-wizard(1).\n", ks_config); fputs("#\n", ks_config); -#if defined(__APPLE__) - while ((line = fgetln(kc_config, &len)) != NULL) { +#ifdef USE_FGETLN + char *buf = NULL; + while ((buf = fgetln(kc_config, &len)) != NULL) { + /* fgetln does not return null-terminated strings */ + FREE(line); + sasprintf(&line, "%.*s", len, buf); #else - while ((read = getline(&line, &len, kc_config)) != -1) { + size_t linecap = 0; + while ((read = getline(&line, &linecap, kc_config)) != -1) { + len = strlen(line); #endif /* skip the warning block at the beginning of the input file */ if (head_of_file && @@ -336,7 +355,10 @@ static void finish() { fflush(ks_config); fsync(fileno(ks_config)); +#ifndef USE_FGETLN free(line); +#endif + fclose(kc_config); fclose(ks_config); -- 2.39.5