06b1764dd4e261d3631eb16fe288e67d028b7bb8
1 /* All directory related stuff goes here. */
5 *\brief OS/8 directory operations
10 #include "structures.h"
11 #include "directory.h"
18 #define INST(TYPE) ((TYPE *)malloc(sizeof(TYPE)))
19 #define INSTN(TYPE,NUM)(TYPE *) malloc(NUM* sizeof(TYPE))
23 * \brief Read OS/8 directory from partition image
25 directory_t
* directory_read(os8_partition_t
* image
){
28 directory_t
* result
=INST(directory_t
);
32 os8_direntry_t
* list_head
=INST(os8_direntry_t
);
33 os8_direntry_t
* current_entry
=list_head
;
34 os8_direntry_t
* tmp_entry
;
36 os8_partition_header_t
* header
= &image
->header
;
37 os8_directory_segment_t
* segs
=header
->directory
;
40 list_head
->prev
=NULL
; //Mark first element
43 /* Data from the segment we're working on: */
44 os8_directory_segment_t
* seg
=segs
+seg_no
;
45 int additional_info
=p8_neg(seg
->additional_info_neg
);
46 int first_file_start
=seg
->first_file_start
;
47 int next_segment
=seg
->next_segment
;
48 int no_entries
=p8_neg(seg
->neg_entries
);
50 DBG ("Segment %i, Entries: %i, First Block: 0%o, additional info: 0%o, Next segment: 0%o\n",seg_no
,
59 result
->entries
+=no_entries
;
60 result
->additional_info
=additional_info
;
62 /* Pointer to current entry */
63 p8word
* entry
=seg
->entry_data
;
66 for (entry_no
=0;entry_no
< p8_neg(seg
->neg_entries
);entry_no
++){
68 /* Link a new entry at the end of the list */
69 current_entry
->next
=INST(os8_direntry_t
);
70 tmp_entry
=current_entry
;
71 current_entry
=current_entry
->next
;
72 current_entry
->prev
=tmp_entry
;
73 current_entry
->next
=NULL
;
75 if (entry
[0]){ // No empty file!
76 int size
=p8_neg(entry
[4+additional_info
]);
77 current_entry
->size_blocks
=size
;
78 if (size
==0) current_entry
->type
=FT_TENTATIVE
;
79 else current_entry
->type
=FT_PERMANENT
;
81 os8_file_name_extract((os8_file_name_t
*) entry
, current_entry
->name
);
82 DBG("File: %9s %i\n",current_entry
->name
,size
);
83 entry
+= 5+additional_info
;
84 } else { // Empty file
85 int size
=p8_neg(entry
[1]);
86 current_entry
->size_blocks
=size
;
87 current_entry
->type
=FT_EMPTY
;
88 DBG("File: <empty> %i\n",size
);
93 } while (segs
[seg_no
-1].next_segment
);
95 result
->entries
=list_head
->next
;