summaryrefslogtreecommitdiffstats
path: root/design.txt
blob: 844e9cb7e507a96fb3d6d33e7bf593fde5a51614 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
file_read(buffer, size, user_data)
	file = user_data
	return fread(buffer, 1, size, file)

extract(file_name, outer_member, inner_action)
	file = fopen(file_name, "rb")
	outer_gzip  = gzip_init(&file_read, file)
	outer_ustar = ustar_init(outer_gzip)
	ustar_seek(outer_ustar, outer_member)
	inner_gzip  = gzip_init(ustar_next_data_record, outer_ustar)
	inner_ustar = ustar_init(inner_gzip)
	inner_action(inner_ustar)

print_data(data, size)
	fwrite(data, 1, size, stdout)

read_control(inner_ustar)
	ustar_seek(inner_ustar, "control")
	ustar_read(inner_ustar, &print_data)

print_member(member)
	printf("%s", member->name)

list_members(inner_ustar)
	ustar_list(inner_ustar, &print_member)

main()
	if -I
		extract(argv[1], "control.tar.gz", &read_control)
	else if -c
		extract(argv[1], "data.tar.gz", &list_members)