Changeset 33
- Timestamp:
- 07/17/05 15:03:02 (19 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/void_stack.h
r31 r33 44 44 void_stack_iterator* void_stack_iterator_new(void_stack* stack); 45 45 void void_stack_iterator_destroy(void_stack_iterator* iter); 46 void* void_stack_iterator_next(void_stack_iterator* iter);46 const void* void_stack_iterator_next(void_stack_iterator* iter); -
trunk/lib/regfio.c
r32 r33 254 254 /******************************************************************* 255 255 *******************************************************************/ 256 static bool prs_nk_rec( const char *desc, prs_struct *ps, int depth, REGF_NK_REC *nk ) 256 static bool prs_nk_rec( const char *desc, prs_struct *ps, 257 int depth, REGF_NK_REC *nk ) 257 258 { 258 259 uint16 class_length, name_length; … … 266 267 depth++; 267 268 268 /* back up and get the data_size */ 269 269 /* back up and get the data_size */ 270 270 if ( !prs_set_offset( ps, ps->data_offset-sizeof(uint32)) ) 271 271 return false; … … 274 274 return false; 275 275 276 if ( !prs_uint8s( true, "header", ps, depth, nk->header, sizeof( nk->header )))276 if (!prs_uint8s(true, "header", ps, depth, nk->header, sizeof(nk->header))) 277 277 return false; 278 278 … … 307 307 return false; 308 308 309 if ( !prs_uint32( "max_bytes_subkeyname", ps, depth, &nk->max_bytes_subkeyname)) 310 return false; 311 if ( !prs_uint32( "max_bytes_subkeyclassname", ps, depth, &nk->max_bytes_subkeyclassname)) 312 return false; 309 if (!prs_uint32("max_bytes_subkeyname", ps, depth, &nk->max_bytes_subkeyname)) 310 return false; 311 if ( !prs_uint32( "max_bytes_subkeyclassname", ps, 312 depth, &nk->max_bytes_subkeyclassname)) 313 { return false; } 313 314 if ( !prs_uint32( "max_bytes_valuename", ps, depth, &nk->max_bytes_valuename)) 314 315 return false; … … 325 326 return false; 326 327 327 if ( class_length ) { 328 if ( class_length ) 329 { 328 330 ;; 329 331 } 330 332 331 if ( name_length ) {332 if ( ps->io ){333 if ( !(nk->keyname = (char*)zcalloc(sizeof(char), name_length+1 )))333 if ( name_length ) 334 { 335 if(ps->io && !(nk->keyname = (char*)zcalloc(sizeof(char), name_length+1))) 334 336 return false; 335 }336 337 337 338 if ( !prs_uint8s( true, "name", ps, depth, nk->keyname, name_length) ) … … 344 345 end_off = ps->data_offset; 345 346 346 /* data_size must be divisible by 8 and large enough to hold the original record */ 347 /* data_size must be divisible by 8 and large enough to hold 348 the original record */ 347 349 348 350 data_size = ((start_off - end_off) & 0xfffffff8 ); 349 if ( data_size > nk->rec_size ) 350 /*DEBUG(10,("Encountered reused record (0x%x < 0x%x)\n", data_size, nk->rec_size));*/ 351 352 if ( !ps->io ) 353 nk->hbin->dirty = true; 354 351 /*if ( data_size > nk->rec_size ) 352 DEBUG(10,("Encountered reused record (0x%x < 0x%x)\n", data_size, nk->rec_size));*/ 353 354 if ( !ps->io ) 355 nk->hbin->dirty = true; 356 357 nk->subkey_index = 0; 355 358 return true; 356 359 } … … 627 630 628 631 data_size = ((start_off - end_off) & 0xfffffff8 ); 629 if ( data_size > lf->rec_size )632 /* if ( data_size > lf->rec_size )*/ 630 633 /*DEBUG(10,("Encountered reused record (0x%x < 0x%x)\n", data_size, lf->rec_size));*/ 631 634 632 633 635 if ( !hbin->ps.io ) 636 hbin->dirty = true; 634 637 635 638 return true; … … 681 684 682 685 data_size = ((start_off - end_off) & 0xfffffff8 ); 683 if ( data_size > sk->rec_size )686 /* if ( data_size > sk->rec_size )*/ 684 687 /*DEBUG(10,("Encountered reused record (0x%x < 0x%x)\n", data_size, sk->rec_size));*/ 685 688 686 687 689 if ( !hbin->ps.io ) 690 hbin->dirty = true; 688 691 689 692 return true; … … 937 940 938 941 /* get the initial nk record */ 939 940 if ( !prs_nk_rec( "nk_rec", &hbin->ps, depth, nk )) 942 if (!prs_nk_rec("nk_rec", &hbin->ps, depth, nk)) 941 943 return false; 942 944 943 945 /* fill in values */ 944 945 946 if ( nk->num_values && (nk->values_off!=REGF_OFFSET_NONE) ) 946 947 { … … 1224 1225 1225 1226 1227 /* XXX: An interator struct should be used instead, and this function 1228 * should operate on it, so the state of iteration isn't stored in the 1229 * REGF_NK_REC struct itself. 1230 */ 1226 1231 /******************************************************************* 1227 1232 This acts as an interator over the subkeys defined for a given -
trunk/lib/void_stack.c
r31 r33 56 56 free(stack->elements[i]); 57 57 free(stack); 58 } 59 60 61 unsigned short void_stack_size(void_stack* stack) 62 { 63 return stack->top; 58 64 } 59 65 … … 121 127 122 128 123 void* void_stack_iterator_next(void_stack_iterator* iter)129 const void* void_stack_iterator_next(void_stack_iterator* iter) 124 130 { 125 131 if(iter->cur < iter->stack->top) -
trunk/test/lib-regfio.c
r32 r33 24 24 #include <stdio.h> 25 25 #include <string.h> 26 #include <strings.h> 26 27 #include "../include/regfio.h" 27 28 #include "../include/void_stack.h" 28 29 29 30 30 char* getStackPath(void_stack* nk_stack) 31 { 32 REGF_NK_REC* cur; 31 void_stack* path2Stack(const char* s) 32 { 33 void_stack* ret_val = void_stack_new(1024); 34 char* cur = strdup(s); 35 char* next = NULL; 36 37 while((next = strrchr(cur, '/')) != NULL) 38 { 39 next[0] = '\0'; 40 if(strlen(next+1) > 0) 41 void_stack_push(ret_val, next+1); 42 } 43 if(strlen(cur) > 0) 44 void_stack_push(ret_val, cur); 45 46 return ret_val; 47 } 48 49 50 char* stack2Path(void_stack* nk_stack) 51 { 52 const REGF_NK_REC* cur; 33 53 unsigned int buf_left = 127; 34 54 unsigned int buf_len = buf_left+1; … … 51 71 } 52 72 73 /* skip root element */ 74 cur = void_stack_iterator_next(iter); 75 53 76 while((cur = void_stack_iterator_next(iter)) != NULL) 54 77 { 78 buf[buf_len-buf_left-1] = '/'; 79 buf_left -= 1; 55 80 name_len = strlen(cur->keyname); 56 81 if(name_len+1 > buf_left) 57 82 { 58 grow_amt = (unsigned int)(buf_len/ 3);83 grow_amt = (unsigned int)(buf_len/2); 59 84 buf_len += name_len+1+grow_amt-buf_left; 60 85 if((new_buf = realloc(buf, buf_len)) == NULL) … … 69 94 strncpy(buf+(buf_len-buf_left-1), cur->keyname, name_len); 70 95 buf_left -= name_len; 71 buf[buf_len-buf_left-1] = '/';72 buf_left -= 1;73 96 buf[buf_len-buf_left-1] = '\0'; 74 97 } 75 98 76 /* Cut trailing slash */77 if(buf[buf_len-buf_left-2] == '/')78 buf[buf_len-buf_left-2] = '\0';79 80 99 return buf; 81 100 } 82 101 83 102 84 void printKeyList(REGF_NK_REC* nk, char* prefix) 103 void printValue(REGF_VK_REC* vk, char* prefix) 104 { 105 const char* str_type; 106 107 str_type = type_val2str(vk->type); 108 printf("%s/%s:%s=\n", prefix, vk->valuename, str_type); 109 } 110 111 112 void printValueList(REGF_NK_REC* nk, char* prefix) 85 113 { 86 114 unsigned int i; 87 const char* str_type;88 115 89 116 for(i=0; i < nk->num_values; i++) 90 { 91 str_type = type_val2str(nk->values[i].type); 92 printf("%s/%s:%s=\n", prefix, nk->values[i].valuename, str_type); 93 } 94 } 95 96 97 void printKeyTree(REGF_FILE* f, void_stack* nk_stack) 117 printValue(&nk->values[i], prefix); 118 } 119 120 /* XXX: this function is god-awful. Needs to be re-designed. */ 121 void printKeyTree(REGF_FILE* f, void_stack* nk_stack, char* prefix) 98 122 { 99 123 REGF_NK_REC* cur; 100 124 REGF_NK_REC* sub; 101 125 char* path; 126 char* val_path; 102 127 103 128 if((cur = (REGF_NK_REC*)void_stack_cur(nk_stack)) != NULL) 104 129 { 105 printf("%s:KEY\n", cur->keyname); 130 cur->subkey_index = 0; 131 path = stack2Path(nk_stack); 132 133 if(strlen(path) > 0) 134 printf("%s%s:KEY\n", prefix, path); 135 printValueList(cur, path); 106 136 while((cur = (REGF_NK_REC*)void_stack_cur(nk_stack)) != NULL) 107 137 { 108 138 if((sub = regfio_fetch_subkey(f, cur)) != NULL) 109 139 { 140 sub->subkey_index = 0; 110 141 void_stack_push(nk_stack, sub); 111 path = getStackPath(nk_stack);142 path = stack2Path(nk_stack); 112 143 if(path != NULL) 113 144 { 114 printKeyList(cur, path); 115 printf("%s:KEY\n", path); 145 val_path = (char*)malloc(strlen(prefix)+strlen(path)+1); 146 sprintf(val_path, "%s%s", prefix, path); 147 printf("%s:KEY\n", val_path); 148 printValueList(sub, val_path); 149 free(val_path); 116 150 free(path); 117 151 } … … 123 157 * routines to replace the Samba code for this. 124 158 */ 125 if(cur != NULL) 126 free(cur); 127 } 128 } 129 } 159 /* if(cur != NULL) 160 free(cur);*/ 161 } 162 } 163 } 164 } 165 166 167 /* 168 * Returns 0 if path was found. 169 * Returns 1 if path was not found. 170 * Returns less than 0 on other error. 171 */ 172 int retrievePath(REGF_FILE* f, void_stack* nk_stack, 173 void_stack* path_stack) 174 { 175 REGF_NK_REC* sub; 176 REGF_NK_REC* cur; 177 void_stack* sub_nk_stack; 178 char* prefix; 179 char* cur_str = NULL; 180 bool found_cur = true; 181 unsigned int i; 182 unsigned short path_depth; 183 if(path_stack == NULL) 184 return -1; 185 186 path_depth = void_stack_size(path_stack); 187 if(path_depth < 1) 188 return -2; 189 190 if(void_stack_size(nk_stack) < 1) 191 return -3; 192 cur = (REGF_NK_REC*)void_stack_cur(nk_stack); 193 194 while(void_stack_size(path_stack) > 1) 195 { 196 /* Search key records only */ 197 cur_str = (char*)void_stack_pop(path_stack); 198 199 found_cur = false; 200 while(!found_cur && 201 (sub = regfio_fetch_subkey(f, cur)) != NULL) 202 { 203 if(strcasecmp(sub->keyname, cur_str) == 0) 204 { 205 cur = sub; 206 void_stack_push(nk_stack, sub); 207 found_cur = true; 208 } 209 } 210 211 if(!found_cur) 212 return 0; 213 } 214 215 /* Last round, search value and key records */ 216 cur_str = (char*)void_stack_pop(path_stack); 217 218 for(i=0; (i < cur->num_values); i++) 219 { 220 if(strcasecmp(sub->values[i].valuename, cur_str) == 0) 221 { 222 printValue(&sub->values[i], stack2Path(nk_stack)); 223 return 0; 224 } 225 } 226 227 while((sub = regfio_fetch_subkey(f, cur)) != NULL) 228 { 229 if(strcasecmp(sub->keyname, cur_str) == 0) 230 { 231 sub_nk_stack = void_stack_new(1024); 232 void_stack_push(sub_nk_stack, sub); 233 void_stack_push(nk_stack, sub); 234 prefix = stack2Path(nk_stack); 235 printKeyTree(f, sub_nk_stack, prefix); 236 return 0; 237 } 238 } 239 240 return 1; 130 241 } 131 242 … … 134 245 { 135 246 void_stack* nk_stack; 247 void_stack* path_stack; 136 248 REGF_FILE* f; 137 249 REGF_NK_REC* root; 250 int retr_path_ret; 251 char* path = "/ControlSet002/Services/Eventlog/"; 138 252 139 253 if(argc < 2) … … 148 262 nk_stack = void_stack_new(1024); 149 263 if(void_stack_push(nk_stack, root)) 150 printKeyTree(f, nk_stack); 264 { 265 path_stack = path2Stack(path); 266 if(void_stack_size(path_stack) < 1) 267 printKeyTree(f, nk_stack, ""); 268 else 269 { 270 retr_path_ret = retrievePath(f, nk_stack, 271 path_stack); 272 if(retr_path_ret == 1) 273 printf("WARNING: specified path not found.\n"); 274 else if(retr_path_ret != 0) 275 printf("ERROR\n"); 276 } 277 } 151 278 void_stack_destroy(nk_stack); 152 279 153 280 regfio_close(f); 154 /*155 REGF_NK_REC* regfio_rootkey( REGF_FILE *file );156 REGF_NK_REC* regfio_fetch_subkey( REGF_FILE *file, REGF_NK_REC *nk );157 */158 281 159 282 return 0;
Note: See TracChangeset
for help on using the changeset viewer.