Fixed the fgetln workaround

next
beauby 2012-02-10 00:21:26 +01:00 committed by Michael Stapelberg
parent 1ddde16895
commit 891831be3a
1 changed files with 26 additions and 4 deletions

View File

@ -8,6 +8,19 @@
* keysyms.
*
*/
#if defined(__FreeBSD__)
#include <sys/param.h>
#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 <ev.h>
#include <stdio.h>
#include <sys/types.h>
@ -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);