struct peer_manager *peerman_read(void *peers_file) { char *filename = peers_file; if (!filename) return NULL; struct peer_manager *peers; peers = peerman_new(); if (!peers) return NULL; int fd = file_seq_open(filename); if (fd < 0) { log_error("peerman: %s: %s", filename, strerror(errno)); goto err_out; } struct p2p_message msg = {}; bool read_ok = true; while (fread_message(fd, &msg, &read_ok)) { if (!peerman_read_rec(peers, &msg)) { log_error("peerman: read record failed"); goto err_out_fd; } } if (!read_ok) { log_error("peerman: read I/O failed"); goto err_out_fd; } free(msg.data); close(fd); return peers; err_out_fd: free(msg.data); close(fd); err_out: peerman_free(peers); return NULL; }
struct peer_manager *peerman_read(void) { char *filename = setting("peers"); if (!filename) return NULL; struct peer_manager *peers; peers = peerman_new(); if (!peers) return NULL; int fd = file_seq_open(filename); if (fd < 0) { perror(filename); goto err_out; } struct p2p_message msg = {}; bool read_ok = true; while (fread_message(fd, &msg, &read_ok)) { if (!peerman_read_rec(peers, &msg)) { fprintf(stderr, "peerman: read record failed\n"); goto err_out; } } if (!read_ok) { fprintf(stderr, "peerman: read I/O failed\n"); goto err_out; } free(msg.data); close(fd); return peers; err_out: peerman_free(peers); return NULL; }