1 #include <stdlib.h>
2 #include <stdint.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdbool.h>
6 
7 #include <arcan_shmif.h>
8 
9 struct __attribute__((packed)) tui_raster_header {
arcan_frameserver_avfeed_run(const char * resource,const char * keyfile)10 	uint32_t data_sz;
11 	uint16_t lines;
12 	uint16_t cells;
13 	uint8_t direction;
14 	uint16_t flags;
15 	uint8_t bgc[4];
16 };
17 
18 int main(int argc, char** argv)
19 {
20 	if (argc <= 1){
21 		fprintf(stderr, "use:\n\ttpack full.tpack [delta or full.tpack]*\n\n");
22 		return EXIT_FAILURE;
23 	}
24 
25 	FILE* fin = fopen(argv[1], "r");
26 	if (!fin){
27 		fprintf(stderr, "couldn't open %s\n", argv[1]);
28 		return EXIT_FAILURE;
29 	}
30 
31 /* grab header and dimensions for the resize call */
32 	struct tui_raster_header hdr;
33 	if (1 != fread(&hdr, sizeof(hdr), 1, fin)){
34 		fprintf(stderr, "couldn't grab header from input\n");
35 		return EXIT_FAILURE;
36 	}
37 	fclose(fin);
38 
39 	struct arcan_shmif_cont conn =
40 		arcan_shmif_open(SEGID_TUI, SHMIF_ACQUIRE_FATALFAIL, NULL);
41 	conn.hints = SHMIF_RHINT_TPACK;
42 	arcan_shmif_resize_ext(&conn, conn.w, conn.h,
43 		(struct shmif_resize_ext){
44 		.vbuf_cnt = -1, .abuf_cnt = -1,
45 		.rows = hdr.lines, hdr.cells
46 	});
47 
48 	while(1){
49 		for (size_t i = 1; i < argc; i++){
50 			fin = fopen(argv[i], "r");
51 			fseek(fin, 0, SEEK_END);
52 /* assumes the first package sets the right size */
53 			size_t nb = ftell(fin);
54 			rewind(fin);
55 			if (1 != fread(conn.vidb, nb, 1, fin))
56 				return EXIT_FAILURE;
57 			fclose(fin);
58 		}
59 		arcan_shmif_signal(&conn, SHMIF_SIGVID);
60 	}
61 	/* grab the dimensions from the main file */
62 /* iterate the list of inputs and send them along */
63 /* possibly add a raster mode where we do the rasterization ourselves for fuzzing */
64 
65 	return EXIT_SUCCESS;
66 }
67