bool peerman_write(struct peer_manager *peers, void *peer_file, const struct chain_info *chain) { char *filename = peer_file; if (!filename) return false; char tmpfn[strlen(filename) + 32]; strcpy(tmpfn, filename); strcat(tmpfn, ".XXXXXX"); int fd = mkstemp(tmpfn); if (fd < 0) return false; if (!ser_peerman(peers, fd, chain)) goto err_out; close(fd); fd = -1; if (rename(tmpfn, filename)) { log_error("peerman: %s rename: %s", tmpfn, strerror(errno)); goto err_out; } return true; err_out: if (fd >= 0) close(fd); unlink(tmpfn); return false; }
bool peerman_write(struct peer_manager *peers) { char *filename = setting("peers"); if (!filename) return false; char tmpfn[strlen(filename) + 32]; strcpy(tmpfn, filename); strcat(tmpfn, ".XXXXXX"); int fd = mkstemp(tmpfn); if (fd < 0) return false; if (!ser_peerman(peers, fd)) goto err_out; close(fd); fd = -1; if (rename(tmpfn, filename)) { strcat(tmpfn, " rename"); perror(tmpfn); goto err_out; } return true; err_out: if (fd >= 0) close(fd); unlink(tmpfn); return false; }