1a39269e7c4adc48dad5e2690c6078bbba61327c
[debian/amanda] / server-src / taper-source-test.c
1 #include "taper-source.h"
2
3 typedef struct {
4     guint64 tape_size;
5     guint64 tape_used;
6     ConsumerFunctor consumer;
7     gpointer consumer_data;
8 } tape_info_t;
9
10 /* A ConsumerFunctor. */
11 static ssize_t size_limited_consumer(gpointer user_data, queue_buffer_t * buffer) {
12     tape_info_t * info = user_data;
13     ssize_t result;
14     
15     result = info->consumer(info->consumer_data, buffer);
16
17     info->tape_used += result;
18     if (info->tape_size < info->tape_used)
19         return -1;
20     else
21         return result;
22 }
23
24 int main(int argc, char ** argv) {
25     TaperSource * source;
26     tape_info_t info;
27     
28     glib_init();
29
30     switch (argc) {
31     default:
32         g_fprintf(stderr, "USAGE: %16s volume-size ( holding-disk-file splitsize | \n"
33                "                                          "
34                "split-disk-buffer splitsize\n"
35                "                                          "
36                "fallback-splitsize )\n",
37                basename(argv[0]));
38         return EXIT_FAILURE;
39     case 4: {
40         /* FILE-WRITE */
41         guint64 splitsize = strtod(argv[3], NULL);
42         
43         source = taper_source_new("", FILE_WRITE, argv[2], -1, NULL, 
44                                   splitsize, 0);
45     }
46         break;
47     case 5: {
48         guint64 splitsize, fallback_splitsize;
49         splitsize = strtod(argv[3], NULL);
50         fallback_splitsize = strtod(argv[4], NULL);
51         
52         source = taper_source_new("", PORT_WRITE, NULL, STDIN_FILENO,
53                                   argv[2][0] == '\0' ? NULL : argv[2],
54                                   splitsize, fallback_splitsize);
55     }
56         break;
57     }
58
59     if (source == NULL)
60         return EXIT_FAILURE;
61
62     info.tape_used = 0;
63     info.tape_size = strtod(argv[1], NULL);
64     info.consumer = fd_write_consumer;
65     info.consumer_data = GINT_TO_POINTER(STDOUT_FILENO);
66
67     for (;;) {
68         gboolean success = do_consumer_producer_queue(taper_source_producer,
69                                                       source,
70                                                       size_limited_consumer,
71                                                       &info);
72
73         if (success) {
74             if (taper_source_get_end_of_data(source)) {
75                 g_fprintf(stderr, "Got end of data.\n");
76                 return EXIT_SUCCESS;
77             } else if (taper_source_get_end_of_part(source)) {
78                 taper_source_start_new_part(source);
79                 g_fprintf(stderr, "Finished part. Starting new one.\n");
80                 continue;
81             } else {
82                 g_fprintf(stderr, "Read error.\n");
83                 return EXIT_FAILURE;
84             }
85         } else {
86             /* Write or read error. (we can't tell) */
87             info.tape_used = 0;
88             if (taper_source_seek_to_part_start(source)) {
89                 g_fprintf(stderr, "Retrying a part.\n");
90                 continue;
91             } else {
92                 g_fprintf(stderr, "Couldn't seek. Dying.\n");
93                 return EXIT_FAILURE;
94             }
95         }
96     }
97
98     g_assert_not_reached();
99 }