1 /*********************************************************************
2 *
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * ===================================================================
15 * Revision History ::
16 * YYYY.MM.DD Change ID Developer
17 * Description
18 * -------------------------------------------------------------------
19 * 2002.04.25 Vlad Skarzhevskyy
20 * Initial implementation.
21 *
22 * ===================================================================
23 *
24 ********************************************************************/
25
26 #include <stdio.h>
27 #include <ctype.h>
28 #include <string.h>
29 #include "par-cmdline/fileops.h"
30 #include "par-cmdline/rwpar.h"
31 #include "par-cmdline/backend.h"
32 #include "par-cmdline/checkpar.h"
33 #include "par-cmdline/makepar.h"
34 #include "pure-sfv.h"
35 #include <math.h>
36
37 struct cmdline cmd;
38
39 /*\ Sanity check \*/
40 static int
check_sizes(void)41 check_sizes(void)
42 {
43 int fail = 0;
44 if (sizeof(u8) != 1) {
45 fprintf(stderr, "u8 isn't 8 bits wide.\n");
46 fail++;
47 }
48 if (sizeof(u16) != 2) {
49 fprintf(stderr, "u16 isn't 16 bits wide.\n");
50 fail++;
51 }
52 if (sizeof(u32) != 4) {
53 fprintf(stderr, "u32 isn't 32 bits wide.\n");
54 fail++;
55 }
56 if (sizeof(i64) != 8) {
57 fprintf(stderr, "u64 isn't 64 bits wide.\n");
58 fail++;
59 }
60 return fail;
61 }
pparCreateN(pure_sfv_params * params,crc_info_type * sfv_info,char * par_name,int from,int to)62 int pparCreateN(pure_sfv_params* params, crc_info_type* sfv_info, char* par_name, int from, int to)
63 {
64 par_t *par = 0;
65 int i;
66 int fail = 0;
67 double v;
68
69 DBUG_PRINT("pparCreateN", ("enter"));
70
71 DBUG_PRINT("pparCreateN", ("par_name [%s][%i-%i]", par_name, from, to));
72
73 if (!params->quiet) {
74 printf("----( Creating: %s )--------\n", par_name);
75 }
76
77 unlink(par_name);
78
79 if (check_sizes()) return -1;
80
81 memset(&cmd, 0, sizeof(cmd));
82 cmd.volumes = 10;
83 cmd.pervol = 1;
84 cmd.pxx = 1;
85 cmd.ctrl = 1;
86 cmd.add = 1;
87 cmd.usecase = 1;
88 cmd.move = 1;
89 if (params->quiet) {
90 cmd.loglevel = 0;
91 }
92
93 if (params->par_recovery_ratio == 0) {
94 cmd.volumes = 0;
95 cmd.pxx = 0;
96 } else {
97 v = ((double)params->par_recovery_ratio * (double)(to - from)) / 100.0;
98 /* The ceil function returns a double value representing the smallest integer that is greater than or equal to x. */
99 cmd.volumes = (int)ceil(v);
100 cmd.pervol = 0;
101 if (cmd.volumes == 0) { cmd.volumes = 1;}
102 }
103
104 DBUG_PRINT("pparCreateN", ("cmd.volumes [%i]", cmd.volumes));
105
106 cmd.action = ACTION_ADD;
107
108 par = read_par_header(unist(par_name), 1, 0, 0);
109 if (!par) return 2;
110
111 cmd.action = ACTION_ADDING;
112
113 for(i = from; ((i < to) && (i < sfv_info->len)); i++) {
114 DBUG_PRINT("pparCreateN", ("add_file[%i] [%s]", i, sfv_info->items[i].file_name));
115 par_add_file(par, find_file_name(unist(sfv_info->items[i].file_name), 1));
116 }
117
118 if (par) {
119 if (cmd.pxx && !par_make_pxx(par))
120 fail |= 1;
121 if (!par->vol_number && !write_par_header(par))
122 fail |= 1;
123 free_par(par);
124 }
125
126 return fail;
127 }
128
pparCreate(pure_sfv_params * params,crc_info_type * sfv_info)129 int pparCreate(pure_sfv_params* params, crc_info_type* sfv_info)
130 {
131 int fail = 0;
132 string par_name;
133 string par_name_set;
134 char *end;
135 int n_set = 1;
136 int i, prev_to;
137 int per_set, from, to;
138 const int max_in_par_set = 255;
139
140 if (sfv_info->len > max_in_par_set) {
141 n_set = sfv_info->len / max_in_par_set + 1;
142 }
143
144 strncpy(par_name, sfv_info->name, MAX_STRING_LEN);
145 end = strrchr(par_name, '.');
146 if (end != NULL) {
147 *end = '\0';
148 }
149
150
151 if ( n_set == 1 ) {
152 strcat(par_name, "." par_extension);
153 DBUG_PRINT("pparCreate", ("par_name [%s] set[%i]", par_name , n_set));
154 fail = pparCreateN(params, sfv_info, par_name, 0, sfv_info->len);
155 } else {
156 per_set = sfv_info->len / n_set;
157 prev_to = 0;
158 for (i = 0; i < n_set; i++) {
159
160 DBUG_PRINT("pparCreate", ("par_name [%s] sets[%i-%i]", par_name, i, n_set));
161
162 from = prev_to;
163 to = (i + 1) * per_set;
164 if (i == (n_set - 1)) {
165 to = sfv_info->len;
166 }
167 prev_to = to;
168
169 sprintf(par_name_set, "%s_%03i-%03i." par_extension, par_name, from+1, to);
170 fail = pparCreateN(params, sfv_info, par_name_set, from, to);
171 if (fail) return fail;
172 }
173 }
174
175 return fail;
176 }
177