xref: /minix3/minix/fs/isofs/utility.c (revision 4f89addcc198bff2fc614da2f8f4a7beb4b6cb7d)
1 #include "inc.h"
2 
3 static struct dir_extent dir_extents[NR_DIR_EXTENT_RECORDS];
4 
5 struct dir_extent* alloc_extent(void)
6 {
7 	/* Return a free extent from the pool. */
8 	int i;
9 	struct dir_extent *extent;
10 
11 	for (i = 0; i < NR_DIR_EXTENT_RECORDS; i++) {
12 		extent = &dir_extents[i];
13 
14 		if (extent->in_use == 0) {
15 			memset(extent, 0, sizeof(*extent));
16 			extent->in_use = 1;
17 
18 			return extent;
19 		}
20 	}
21 
22 	panic("No free extents in cache");
23 }
24 
25 void free_extent(struct dir_extent *e)
26 {
27 	if (e == NULL)
28 		return;
29 
30 	if (e->in_use == 0)
31 		panic("Trying to free unused extent");
32 
33 	free_extent(e->next);
34 	e->in_use = 0;
35 }
36 
37 struct buf* read_extent_block(struct dir_extent *e, size_t block)
38 {
39 	size_t block_id = get_extent_absolute_block_id(e, block);
40 
41 	if (block_id == 0 || block_id >= v_pri.volume_space_size_l)
42 		return NULL;
43 
44 	return lmfs_get_block(fs_dev, block_id, NORMAL);
45 }
46 
47 size_t get_extent_absolute_block_id(struct dir_extent *e, size_t block)
48 {
49 	size_t extent_offset = 0;
50 
51 	if (e == NULL)
52 		return 0;
53 
54 	/* Retrieve the extent on which the block lies. */
55 	while(block > extent_offset + e->length) {
56 		if (e->next == NULL)
57 			return 0;
58 
59 		extent_offset += e->length;
60 		e = e->next;
61 	}
62 
63 	return e->location + block - extent_offset;
64 }
65 
66 time_t date7_to_time_t(const u8_t *date)
67 {
68 	/* This function converts from the ISO 9660 7-byte time format to a
69 	 * time_t.
70 	 */
71 	struct tm ltime;
72 	signed char time_zone = (signed char)date[6];
73 
74 	ltime.tm_year = date[0];
75 	ltime.tm_mon = date[1] - 1;
76 	ltime.tm_mday = date[2];
77 	ltime.tm_hour = date[3];
78 	ltime.tm_min = date[4];
79 	ltime.tm_sec = date[5];
80 	ltime.tm_isdst = 0;
81 
82 	/* Offset from Greenwich Mean Time */
83 	if (time_zone >= -52 && time_zone <= 52)
84 		ltime.tm_hour += time_zone;
85 
86 	return mktime(&ltime);
87 }
88