diff --git a/src/util/mdb-prop.c b/src/util/mdb-prop.c index e9466cd..05cdb52 100644 --- a/src/util/mdb-prop.c +++ b/src/util/mdb-prop.c @@ -23,7 +23,7 @@ #undef MDB_DEBUG //#define MDB_DEBUG 1 -void dump_kkd(MdbHandle *mdb, gchar *kkd, int len); +void dump_kkd(MdbHandle *mdb, void *kkd, size_t len); int main(int argc, char **argv) @@ -31,27 +31,43 @@ main(int argc, char **argv) MdbHandle *mdb; MdbTableDef *table; gchar name[256]; - gchar buf[MDB_BIND_SIZE]; + void *buf; int col_num; int found = 0; - if (argc < 2) { - fprintf(stderr,"Usage: %s []\n",argv[0]); + if (argc < 4) { + fprintf(stderr,"Usage: %s \n", + argv[0]); return 1; } mdb_init(); - if (!(mdb = mdb_open(argv[1], MDB_NOFLAGS))) { + mdb = mdb_open(argv[1], MDB_NOFLAGS); + if (!mdb) { mdb_exit(); return 1; } + table = mdb_read_table_by_name(mdb, "MSysObjects", MDB_ANY); + if (!table) { + mdb_close(mdb); + mdb_exit(); + return 1; + } mdb_read_columns(table); mdb_rewind_table(table); - col_num = mdb_bind_column_by_name(table, argv[3], buf, NULL); mdb_bind_column_by_name(table, "Name", name, NULL); + buf = g_malloc(MDB_BIND_SIZE); + col_num = mdb_bind_column_by_name(table, argv[3], buf, NULL); + if (col_num < 1) { + g_free(buf); + mdb_free_tabledef(table); + mdb_close(mdb); + mdb_exit(); + return 1; + } while(mdb_fetch_row(table)) { if (!strcmp(name, argv[2])) { @@ -63,8 +79,8 @@ main(int argc, char **argv) if (found) { MdbColumn *col; gchar kkd_ptr[MDB_MEMO_OVERHEAD]; - gchar *kkd_pg = g_malloc(200000); - int len, pos; + void *kkd_pg = g_malloc(200000); + size_t len, pos; memcpy(kkd_ptr, buf, MDB_MEMO_OVERHEAD); col = g_ptr_array_index(table->columns, col_num - 1); @@ -75,11 +91,11 @@ main(int argc, char **argv) memcpy(kkd_pg + pos, buf, len); pos += len; } - len = pos; - dump_kkd(mdb, kkd_pg, len); + dump_kkd(mdb, kkd_pg, pos); g_free(kkd_pg); } + g_free(buf); mdb_free_tabledef(table); mdb_close(mdb); mdb_exit(); @@ -90,10 +106,11 @@ void print_keyvalue(gpointer key, gpointer value, gpointer user_data) { printf("%s = %s\n", (gchar *)key, (gchar *)value); } -void dump_kkd(MdbHandle *mdb, gchar *kkd, int len) +void dump_kkd(MdbHandle *mdb, void *kkd, size_t len) { - guint32 record_len, record_type; - int pos = 0; + guint32 record_len; + guint16 record_type; + size_t pos; GPtrArray *names = NULL; MdbProperties *props; @@ -113,14 +130,14 @@ void dump_kkd(MdbHandle *mdb, gchar *kkd, int len) //printf("len = %d type = %d\n", record_len, record_type); switch (record_type) { case 0x80: - names = mdb_read_props_list(&kkd[pos+6], record_len - 6); + names = mdb_read_props_list(kkd+pos+6, record_len - 6); break; case 0x00: if (!names) { printf("sequence error!\n"); break; } - props = mdb_read_props(mdb, names, &kkd[pos+6], record_len - 6); + props = mdb_read_props(mdb, names, kkd+pos+6, record_len - 6); printf("type 0x00 name %s\n", props->name ? props->name : "(none)"); g_hash_table_foreach(props->hash, print_keyvalue, NULL); mdb_free_props(props); @@ -130,7 +147,7 @@ void dump_kkd(MdbHandle *mdb, gchar *kkd, int len) printf("sequence error!\n"); break; } - props = mdb_read_props(mdb, names, &kkd[pos+6], record_len - 6); + props = mdb_read_props(mdb, names, kkd+pos+6, record_len - 6); printf("type 0x01 name %s\n", props->name ? props->name : "(none)"); g_hash_table_foreach(props->hash, print_keyvalue, NULL); mdb_free_props(props);