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