Andy Whitcroft <apw@xxxxxxxxxxxx> writes: > The call was intended to replace a common idiom: > > if (xwrite(fd, buf, size) != size) > error > > write_in_full() is intended as a drop in replacement for that. On a > short write we will return a short count and that will fail such a test. > The call basically implements the standard write() call semantic with > maximum attempts to complete. You are both right ;-). I would have these fixups on top of Linus's. --- diff --git a/config.c b/config.c index 2cd0263..733fb1a 100644 --- a/config.c +++ b/config.c @@ -694,11 +694,9 @@ int git_config_set_multivar(const char* key, const char* value, store.key = (char*)key; if (!store_write_section(fd, key) || - !store_write_pair(fd, key, value)) { - ret = write_error(); - goto out_free; - } - } else{ + !store_write_pair(fd, key, value)) + goto write_err_out; + } else { struct stat st; char* contents; int i, copy_begin, copy_end, new_line = 0; @@ -777,31 +775,33 @@ int git_config_set_multivar(const char* key, const char* value, /* write the first part of the config */ if (copy_end > copy_begin) { - write_in_full(fd, contents + copy_begin, - copy_end - copy_begin); - if (new_line) - write_in_full(fd, "\n", 1); + if (write_in_full(fd, contents + copy_begin, + copy_end - copy_begin) < + copy_end - copy_begin) + goto write_err_out; + if (new_line && + write_in_full(fd, "\n", 1) != 1) + goto write_err_out; } copy_begin = store.offset[i]; } /* write the pair (value == NULL means unset) */ if (value != NULL) { - if (store.state == START) - if (!store_write_section(fd, key)) { - ret = write_error(); - goto out_free; - } - if (!store_write_pair(fd, key, value)) { - ret = write_error(); - goto out_free; + if (store.state == START) { + if (!store_write_section(fd, key)) + goto write_err_out; } + if (!store_write_pair(fd, key, value)) + goto write_err_out; } /* write the rest of the config */ if (copy_begin < st.st_size) - write_in_full(fd, contents + copy_begin, - st.st_size - copy_begin); + if (write_in_full(fd, contents + copy_begin, + st.st_size - copy_begin) < + st.st_size - copy_begin) + goto write_err_out; munmap(contents, st.st_size); unlink(config_filename); @@ -824,6 +824,11 @@ out_free: free(lock_file); } return ret; + +write_err_out: + ret = write_error(); + goto out_free; + } int git_config_rename_section(const char *old_name, const char *new_name) diff --git a/index-pack.c b/index-pack.c index 8d10d6b..72e0962 100644 --- a/index-pack.c +++ b/index-pack.c @@ -814,7 +814,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, char buf[48]; int len = snprintf(buf, sizeof(buf), "%s\t%s\n", report, sha1_to_hex(sha1)); - write_in_full(1, buf, len); + write_or_die(1, buf, len); /* * Let's just mimic git-unpack-objects here and write - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html