static int save_blocklist(char *path) { if (path == NULL) return -1; int len = sizeof(BlockedFriend) * Blocked.num_blocked; char data[len]; int i, count = 0; for (i = 0; i < Blocked.max_idx; ++i) { if (count > Blocked.num_blocked) return -1; if (Blocked.list[i].active) { BlockedFriend tmp; memset(&tmp, 0, sizeof(BlockedFriend)); tmp.namelength = htons(Blocked.list[i].namelength); memcpy(tmp.name, Blocked.list[i].name, Blocked.list[i].namelength + 1); memcpy(tmp.pub_key, Blocked.list[i].pub_key, TOX_PUBLIC_KEY_SIZE); uint8_t lastonline[sizeof(uint64_t)]; memcpy(lastonline, &Blocked.list[i].last_on, sizeof(uint64_t)); hst_to_net(lastonline, sizeof(uint64_t)); memcpy(&tmp.last_on, lastonline, sizeof(uint64_t)); memcpy(data + count * sizeof(BlockedFriend), &tmp, sizeof(BlockedFriend)); ++count; } } /* Blocklist is empty, we can remove the empty file */ if (count == 0) { if (remove(path) != 0) return -1; return 0; } FILE *fp = fopen(TEMP_BLOCKLIST_SAVE_NAME, "wb"); if (fp == NULL) return -1; if (fwrite(data, len, 1, fp) != 1) { fclose(fp); return -1; } fclose(fp); if (rename(TEMP_BLOCKLIST_SAVE_NAME, path) != 0) return -1; return 0; }
static int save_blocklist(char *path) { if (arg_opts.ignore_data_file) return 0; if (path == NULL) return -1; int len = sizeof(BlockedFriend) * Blocked.num_blocked; char *data = malloc(len); if (data == NULL) exit_toxic_err("Failed in save_blocklist", FATALERR_MEMORY); int i; int count = 0; for (i = 0; i < Blocked.max_idx; ++i) { if (count > Blocked.num_blocked) goto on_error; if (Blocked.list[i].active) { BlockedFriend tmp; memset(&tmp, 0, sizeof(BlockedFriend)); tmp.namelength = htons(Blocked.list[i].namelength); memcpy(tmp.name, Blocked.list[i].name, Blocked.list[i].namelength + 1); memcpy(tmp.pub_key, Blocked.list[i].pub_key, TOX_CLIENT_ID_SIZE); uint8_t lastonline[sizeof(uint64_t)]; memcpy(lastonline, &Blocked.list[i].last_on, sizeof(uint64_t)); hst_to_net(lastonline, sizeof(uint64_t)); memcpy(&tmp.last_on, lastonline, sizeof(uint64_t)); memcpy(data + count * sizeof(BlockedFriend), &tmp, sizeof(BlockedFriend)); ++count; } } FILE *fp = fopen(path, "wb"); if (fp == NULL) goto on_error; if (fwrite(data, len, 1, fp) != 1) goto on_error; fclose(fp); free(data); return 0; on_error: free(data); return -1; }
static int save_blocklist(char *path) { if (path == NULL) { return -1; } int len = sizeof(BlockedFriend) * Blocked.num_blocked; char *data = malloc(len * sizeof(char)); if (data == NULL) { return -1; } int i, count = 0; for (i = 0; i < Blocked.max_idx; ++i) { if (count > Blocked.num_blocked) { free(data); return -1; } if (Blocked.list[i].active) { BlockedFriend tmp; memset(&tmp, 0, sizeof(BlockedFriend)); tmp.namelength = htons(Blocked.list[i].namelength); memcpy(tmp.name, Blocked.list[i].name, Blocked.list[i].namelength + 1); memcpy(tmp.pub_key, Blocked.list[i].pub_key, TOX_PUBLIC_KEY_SIZE); uint8_t lastonline[sizeof(uint64_t)]; memcpy(lastonline, &Blocked.list[i].last_on, sizeof(uint64_t)); hst_to_net(lastonline, sizeof(uint64_t)); memcpy(&tmp.last_on, lastonline, sizeof(uint64_t)); memcpy(data + count * sizeof(BlockedFriend), &tmp, sizeof(BlockedFriend)); ++count; } } /* Blocklist is empty, we can remove the empty file */ if (count == 0) { free(data); if (remove(path) != 0) { return -1; } return 0; } char temp_path[strlen(path) + strlen(TEMP_BLOCKLIST_EXT) + 1]; snprintf(temp_path, sizeof(temp_path), "%s%s", path, TEMP_BLOCKLIST_EXT); FILE *fp = fopen(temp_path, "wb"); if (fp == NULL) { free(data); return -1; } if (fwrite(data, len, 1, fp) != 1) { fprintf(stderr, "Failed to write blocklist data.\n"); fclose(fp); free(data); return -1; } fclose(fp); free(data); if (rename(temp_path, path) != 0) { return -1; } return 0; }