/* Extended dump command */ int xdump(void) { char *p; char buf[1024]; struct xdstr xd; struct natstr *natp; int type; int meta = 0; p = getstarg(player->argp[1], "Table name, or meta? ", buf); if (p && strcmp(p, "meta") == 0) { meta = 1; p = getstarg(player->argp[2], "Table name? ", buf); } if (!p || !*p) return RET_SYN; xdinit(&xd, player->cnum, 0, 0, pr); natp = getnatp(player->cnum); type = isdigit(p[0]) ? atoi(p) : ef_byname(p); if (type < 0 || type >= EF_MAX) return RET_SYN; if (meta) return xdmeta(&xd, type); if ((EF_IS_GAME_STATE(type) || EF_IS_VIEW(type)) && !(natp->nat_stat == STAT_ACTIVE || player->god)) { pr("Access to table %s denied\n", ef_nameof(type)); return RET_FAIL; } return xditem(&xd, type, player->argp[2]); }
/* * Verify game configuration is sane. * Return 0 on success, -1 on failure. */ int ef_verify_config(void) { int retval = 0; int i; for (i = 0; i < EF_MAX; i++) { if (!EF_IS_GAME_STATE(i) && !EF_IS_VIEW(i)) retval |= verify_table(i); } /* Special checks */ retval |= verify_ship_chr(); retval |= verify_plane_chr(); retval |= verify_products(); return retval; }
/* * Verify game state is sane. * Correct minor problems, but write corrections to backing files only * if @may_put is non-zero. * Return -1 if uncorrected problems remain, else 0. */ int ef_verify_state(int may_put) { int retval = 0; int i; for (i = 0; i < EF_MAX; i++) { if (EF_IS_GAME_STATE(i) || EF_IS_VIEW(i)) retval |= verify_table(i); } /* Special checks */ retval |= verify_sectors(may_put); retval |= verify_planes(may_put); retval |= verify_lands(may_put); retval |= verify_nukes(may_put); return retval; }
static int verify_row(int type, int row) { struct castr *ca = ef_cadef(type); struct empobj *row_ref; int i, j, n; struct valstr val; int ret_val = 0; int flags = ef_flags(type); if (flags & EFF_MEM) row_ref = ef_ptr(type, row); else { row_ref = malloc(empfile[type].size); ef_read(type, row, row_ref); } if ((flags & EFF_TYPED) && !EF_IS_VIEW(type)) { if (row_ref->ef_type != type || row_ref->uid != row) { verify_fail(type, row, NULL, 0, "header corrupt"); ret_val = -1; } } if (!empobj_in_use(type, row_ref)) goto out; for (i = 0; ca[i].ca_name; ++i) { if (ca[i].ca_get) continue; /* virtual */ n = CA_ARRAY_LEN(&ca[i]); j = 0; do { if (ca[i].ca_table == EF_BAD) continue; nstr_mksymval(&val, &ca[i], j); nstr_eval(&val, 0, row_ref, NSC_NOTYPE); if (CANT_HAPPEN(val.val_type != NSC_LONG)) { ret_val = -1; continue; } if (ca[i].ca_table == type && i == 0) { /* uid */ if (val.val_as.lng != row) { verify_fail(type, row, &ca[i], j, "value is %ld instead of %d", val.val_as.lng, row); ret_val = -1; } } else { if (verify_tabref(type, row, &ca[i], j, val.val_as.lng) < 0) ret_val = -1; } } while (++j < n); } out: if (!(flags & EFF_MEM)) free(row_ref); return ret_val; }