From: Michael Stapelberg Date: Fri, 10 Feb 2012 00:02:20 +0000 (+0000) Subject: Merge branch 'fix-freebsd-getline' X-Git-Tag: 4.2~86^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=138197f925392b7629c0dd1dc1ccd274179a9c2d;hp=1ddde16895f0eb8c4723d9609baa6011781a27ec;p=i3%2Fi3 Merge branch 'fix-freebsd-getline' --- 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);