--- irssi-0.8.11/src/lib-config/write.c.bak 2007-04-25 21:15:07.000000000 +0300 +++ irssi-0.8.11/src/lib-config/write.c 2007-08-07 19:01:03.922515714 +0300 @@ -32,7 +32,8 @@ static int config_write_indent(CONFIG_RE int n; for (n = 0; n < rec->tmp_indent_level/CONFIG_INDENT_SIZE; n++) { - if (write(rec->handle, indent_block, CONFIG_INDENT_SIZE) == -1) + if (write(rec->handle, indent_block, CONFIG_INDENT_SIZE) + != CONFIG_INDENT_SIZE) return -1; } @@ -42,6 +43,7 @@ static int config_write_indent(CONFIG_RE static int config_write_str(CONFIG_REC *rec, const char *str) { const char *strpos, *p; + int len; g_return_val_if_fail(rec != NULL, -1); g_return_val_if_fail(str != NULL, -1); @@ -57,12 +59,13 @@ static int config_write_str(CONFIG_REC * p = strchr(strpos, '\n'); if (p == NULL) { - if (write(rec->handle, strpos, strlen(strpos)) == -1) + len = strlen(strpos); + if (write(rec->handle, strpos, len) != len) return -1; strpos = ""; rec->tmp_last_lf = FALSE; } else { - if (write(rec->handle, strpos, (int) (p-strpos)+1) == -1) + if (write(rec->handle, strpos, (int) (p-strpos)+1) != (p-strpos)+1) return -1; strpos = p+1; rec->tmp_last_lf = TRUE; @@ -328,13 +331,24 @@ int config_write(CONFIG_REC *rec, const rec->tmp_indent_level = 0; rec->tmp_last_lf = TRUE; - ret = config_write_block(rec, rec->mainnode, FALSE, TRUE); + errno = 0; + ret = config_write_block(rec, rec->mainnode, FALSE, TRUE); if (ret == -1) { /* write error */ config_error(rec, errno == 0 ? "bug" : g_strerror(errno)); } - close(rec->handle); + if (fsync(rec->handle) == -1) { + ret = -1; + /* fsync error */ + config_error(rec, g_strerror(errno)); + close(rec->handle); + } else if (close(rec->handle) == -1) { + ret = -1; + /* close error */ + config_error(rec, g_strerror(errno)); + } + rec->handle = -1; return ret;