xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/mtdutils/rk29.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #define _GNU_SOURCE
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #include <dirent.h>
4*4882a593Smuzhiyun #include <libgen.h>
5*4882a593Smuzhiyun #include <stdio.h>
6*4882a593Smuzhiyun #include <stdlib.h>
7*4882a593Smuzhiyun #include <string.h>
8*4882a593Smuzhiyun #include <unistd.h>
9*4882a593Smuzhiyun #include <sys/stat.h>
10*4882a593Smuzhiyun #include <sys/types.h>
11*4882a593Smuzhiyun #include <sys/wait.h>
12*4882a593Smuzhiyun #include <sys/mount.h>
13*4882a593Smuzhiyun #include <errno.h>
14*4882a593Smuzhiyun #include "mtdutils.h"
15*4882a593Smuzhiyun #include "rk29.h"
16*4882a593Smuzhiyun 
run(const char * filename,char * const argv[])17*4882a593Smuzhiyun int run(const char *filename, char *const argv[])
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun     struct stat s;
20*4882a593Smuzhiyun     int status;
21*4882a593Smuzhiyun     pid_t pid;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun     if (stat(filename, &s) != 0) {
24*4882a593Smuzhiyun         fprintf(stderr, "cannot find '%s'", filename);
25*4882a593Smuzhiyun         return -1;
26*4882a593Smuzhiyun     }
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun     printf("executing '%s'\n", filename);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun     pid = fork();
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun     if (pid == 0) {
33*4882a593Smuzhiyun         setpgid(0, getpid());
34*4882a593Smuzhiyun         /* execute */
35*4882a593Smuzhiyun         execv(filename, argv);
36*4882a593Smuzhiyun         fprintf(stderr, "can't run %s (%s)\n", filename, strerror(errno));
37*4882a593Smuzhiyun         /* exit */
38*4882a593Smuzhiyun         _exit(0);
39*4882a593Smuzhiyun     }
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun     if (pid < 0) {
42*4882a593Smuzhiyun         fprintf(stderr, "failed to fork and start '%s'\n", filename);
43*4882a593Smuzhiyun         return -1;
44*4882a593Smuzhiyun     }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun     if (-1 == waitpid(pid, &status, WCONTINUED | WUNTRACED)) {
47*4882a593Smuzhiyun         fprintf(stderr, "wait for child error\n");
48*4882a593Smuzhiyun         return -1;
49*4882a593Smuzhiyun     }
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun     if (WIFEXITED(status)) {
52*4882a593Smuzhiyun         printf("executed '%s' done\n", filename);
53*4882a593Smuzhiyun     }
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun     printf("executed '%s' return %d\n", filename, WEXITSTATUS(status));
56*4882a593Smuzhiyun     return 0;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun //int rk_make_ext4fs(const char *filename, s64 len)
60*4882a593Smuzhiyun //{
61*4882a593Smuzhiyun //    const char *const mke2fs_argv[] = { "/sbin/mke2fs", "-t", "ext4", "-O", "^huge_file", "-m", "0", "-q", filename, NULL };
62*4882a593Smuzhiyun //    printf("format '%s' to ext4 filesystem\n", filename);
63*4882a593Smuzhiyun //    return run(mke2fs_argv[0], (char **) mke2fs_argv);
64*4882a593Smuzhiyun //}
65*4882a593Smuzhiyun 
rk_make_ext4fs(const char * filename,long long len,const char * mountpoint)66*4882a593Smuzhiyun int rk_make_ext4fs(const char *filename,long long len, const char *mountpoint)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun     int result;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun     const char *const mke2fs_argv[] = { "/usr/sbin/mke2fs", "-t", "ext4", "-b", "4096", "-O", "^huge_file", "-m", "0", "-q", "-F", filename, NULL };
71*4882a593Smuzhiyun     const char *const e2fsck_argv[] = { "/usr/sbin/e2fsck", "-fy", filename, NULL };
72*4882a593Smuzhiyun     printf("format '%s' to ext4 filesystem\n", filename);
73*4882a593Smuzhiyun     result = run(mke2fs_argv[0], (char **) mke2fs_argv);
74*4882a593Smuzhiyun     if(result) {
75*4882a593Smuzhiyun         printf("format '%s' to ext4 error!\n", filename);
76*4882a593Smuzhiyun         return result;
77*4882a593Smuzhiyun     }
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun     result = run(e2fsck_argv[0], (char **) e2fsck_argv);
80*4882a593Smuzhiyun     if(result) {
81*4882a593Smuzhiyun         printf("e2fsck check '%s' fail!\n", filename);
82*4882a593Smuzhiyun         return result;
83*4882a593Smuzhiyun     }
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun     if(mountpoint != NULL) {
86*4882a593Smuzhiyun         int result2 = mount(filename, mountpoint, "ext4",
87*4882a593Smuzhiyun                                    MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
88*4882a593Smuzhiyun         if(result2) {
89*4882a593Smuzhiyun             printf("mount '%s' to %s fail!\n", filename, mountpoint);
90*4882a593Smuzhiyun         }
91*4882a593Smuzhiyun     }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     return result;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
rk_check_and_resizefs(const char * filename)96*4882a593Smuzhiyun int rk_check_and_resizefs(const char *filename) {
97*4882a593Smuzhiyun     int result;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun     const char *const e2fsck_argv[] = { "/usr/sbin/e2fsck", "-fy", filename, NULL };
100*4882a593Smuzhiyun     const char *const resizefs_argv[] = { "/usr/sbin/resize2fs", filename, NULL  };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     result = run(e2fsck_argv[0], (char **) e2fsck_argv);
103*4882a593Smuzhiyun     if(result) {
104*4882a593Smuzhiyun         printf("e2fsck check '%s' failed!\n", filename);
105*4882a593Smuzhiyun         return result;
106*4882a593Smuzhiyun     }
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     result = run(resizefs_argv[0], (char **) resizefs_argv);
109*4882a593Smuzhiyun     if(result) {
110*4882a593Smuzhiyun         printf("resizefs '%s' failed!\n", filename);
111*4882a593Smuzhiyun     }
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun     return result;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
rk_check_and_resizefs_f2fs(const char * filename)116*4882a593Smuzhiyun int rk_check_and_resizefs_f2fs(const char *filename) {
117*4882a593Smuzhiyun 	int result;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	const char *const e2fsck_argv[] = { "fsck_f2fs", filename, NULL };
120*4882a593Smuzhiyun 	const char *const resizefs_argv[] = { "resize.f2fs", filename, NULL  };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	result = run(e2fsck_argv[0], (char **) e2fsck_argv);
123*4882a593Smuzhiyun 	if(result) {
124*4882a593Smuzhiyun 		printf("fsck_f2fs check '%s' failed!\n", filename);
125*4882a593Smuzhiyun 		return result;
126*4882a593Smuzhiyun 	}
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	result = run(resizefs_argv[0], (char **) resizefs_argv);
129*4882a593Smuzhiyun 	if(result) {
130*4882a593Smuzhiyun 		printf("resize.f2fs '%s' failed!\n", filename);
131*4882a593Smuzhiyun 	}
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	return result;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 
rk_make_ext3fs(const char * filename)137*4882a593Smuzhiyun int rk_make_ext3fs(const char *filename)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun     int result;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun     const char *const mke2fs_argv[] = { "mke2fs", "-t", "ext3", "-b", "4096", "-O", "^huge_file", "-m", "0", "-q", filename, NULL };
142*4882a593Smuzhiyun     const char *const e2fsck_argv[] = { "e2fsck", "-fy", filename, NULL };
143*4882a593Smuzhiyun     printf("format '%s' to ext3 filesystem\n", filename);
144*4882a593Smuzhiyun     result = run(mke2fs_argv[0], (char **) mke2fs_argv);
145*4882a593Smuzhiyun     if(result) {
146*4882a593Smuzhiyun         printf("format '%s' to ext3 fail!\n", filename);
147*4882a593Smuzhiyun         return result;
148*4882a593Smuzhiyun     }
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun     result = run(e2fsck_argv[0], (char **) e2fsck_argv);
151*4882a593Smuzhiyun     if(result) {
152*4882a593Smuzhiyun         printf("e2fsck check '%s' fail!\n", filename);
153*4882a593Smuzhiyun     }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun     return result;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
rk_make_ext2fs(const char * filename)158*4882a593Smuzhiyun int rk_make_ext2fs(const char *filename)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun     int result;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun     const char *const mke2fs_argv[] = { "/sbin/mke2fs", "-t", "ext2", "-b", "4096", "-O", "^huge_file", "-m", "0", "-q", filename, NULL };
163*4882a593Smuzhiyun     const char *const e2fsck_argv[] = { "/sbin/e2fsck", "-fy", filename, NULL };
164*4882a593Smuzhiyun     printf("format '%s' to ext2 filesystem\n", filename);
165*4882a593Smuzhiyun     result = run(mke2fs_argv[0], (char **) mke2fs_argv);
166*4882a593Smuzhiyun     if(result) {
167*4882a593Smuzhiyun         printf("format '%s' to ext2 fail!\n", filename);
168*4882a593Smuzhiyun         return result;
169*4882a593Smuzhiyun     }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     result = run(e2fsck_argv[0], (char **) e2fsck_argv);
172*4882a593Smuzhiyun     if(result) {
173*4882a593Smuzhiyun         printf("e2fsck check '%s' fail!\n", filename);
174*4882a593Smuzhiyun     }
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun     return result;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun 
make_vfat(const char * filename,const char * volumelabel)179*4882a593Smuzhiyun int make_vfat(const char *filename,const char* volumelabel)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun     printf("format '%s' to vfat filesystem\n", filename);
182*4882a593Smuzhiyun     if(volumelabel == NULL){
183*4882a593Smuzhiyun          const char *const mke2fs_argv[] = { "/sbin/mkdosfs", filename, NULL };
184*4882a593Smuzhiyun          return run(mke2fs_argv[0], (char **) mke2fs_argv);
185*4882a593Smuzhiyun     }else{
186*4882a593Smuzhiyun          const char *const mke2fs_withLabel_argv[] = { "/sbin/mkdosfs", "-n", volumelabel, filename, NULL };
187*4882a593Smuzhiyun          return run(mke2fs_withLabel_argv[0], (char **) mke2fs_withLabel_argv);
188*4882a593Smuzhiyun     }
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
make_ntfs(const char * filename,const char * volumelabel)191*4882a593Smuzhiyun int make_ntfs(const char *filename,const char* volumelabel) {
192*4882a593Smuzhiyun     printf("format '%s' to NTFS filesystem.\n", filename);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun     if(volumelabel == NULL){
195*4882a593Smuzhiyun          const char *const mkntfs_argv[] = { "mkntfs", "-f", filename, NULL };
196*4882a593Smuzhiyun          return run(mkntfs_argv[0], (char **) mkntfs_argv);
197*4882a593Smuzhiyun     }else{
198*4882a593Smuzhiyun          const char *const mkntfs_withLabel_argv[] = { "mkntfs", "-f", "-L", volumelabel, filename, NULL };
199*4882a593Smuzhiyun          return run(mkntfs_withLabel_argv[0], (char **) mkntfs_withLabel_argv);
200*4882a593Smuzhiyun     }
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #ifndef min
204*4882a593Smuzhiyun #define min(a,b) ((a)<(b)?(a):(b))
205*4882a593Smuzhiyun #endif
206*4882a593Smuzhiyun 
rk29_fread(void * ptr,size_t size,size_t nmemb,FILE * stream)207*4882a593Smuzhiyun size_t rk29_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun     char buf[READ_SIZE];
210*4882a593Smuzhiyun     int fd;
211*4882a593Smuzhiyun     long begin, end;
212*4882a593Smuzhiyun     off_t offset;
213*4882a593Smuzhiyun     ssize_t sz;
214*4882a593Smuzhiyun     size_t count = 0, total;
215*4882a593Smuzhiyun     char *p = ptr;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun     if (!ptr)
218*4882a593Smuzhiyun         return 0;
219*4882a593Smuzhiyun     if (!size || !nmemb)
220*4882a593Smuzhiyun         return 0;
221*4882a593Smuzhiyun     if (!stream)
222*4882a593Smuzhiyun         return 0;
223*4882a593Smuzhiyun     fd = fileno(stream);
224*4882a593Smuzhiyun     if (fd < 0)
225*4882a593Smuzhiyun         return 0;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun     begin = ftell(stream);
228*4882a593Smuzhiyun     if (begin < 0)
229*4882a593Smuzhiyun         begin = 0;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun     total = size * nmemb;
232*4882a593Smuzhiyun     if (!total)
233*4882a593Smuzhiyun         return 0;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun     end = begin + total;
236*4882a593Smuzhiyun     offset = begin & ~READ_MASK;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun     if (begin & READ_MASK) {
239*4882a593Smuzhiyun         sz = pread(fd, buf, READ_SIZE, offset);
240*4882a593Smuzhiyun         if (sz < READ_SIZE)
241*4882a593Smuzhiyun             goto out;
242*4882a593Smuzhiyun         count = min(end, offset + READ_SIZE) - begin;
243*4882a593Smuzhiyun         memcpy(p, buf + (begin & READ_MASK), count);
244*4882a593Smuzhiyun         p += count;
245*4882a593Smuzhiyun         offset += READ_SIZE;
246*4882a593Smuzhiyun     }
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     for (; offset < (end & ~READ_MASK); offset += READ_SIZE) {
249*4882a593Smuzhiyun         sz = pread(fd, buf, READ_SIZE, offset);
250*4882a593Smuzhiyun         if (sz < READ_SIZE)
251*4882a593Smuzhiyun             goto out;
252*4882a593Smuzhiyun         count += READ_SIZE;
253*4882a593Smuzhiyun         memcpy(p, buf, READ_SIZE);
254*4882a593Smuzhiyun         p += READ_SIZE;
255*4882a593Smuzhiyun     }
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun     if (count < total && (end & READ_MASK)) {
258*4882a593Smuzhiyun         offset = end & ~READ_MASK;
259*4882a593Smuzhiyun         sz = pread(fd, buf, READ_SIZE, offset);
260*4882a593Smuzhiyun         if (sz < READ_SIZE)
261*4882a593Smuzhiyun             goto out;
262*4882a593Smuzhiyun         memcpy(p, buf, end - offset);
263*4882a593Smuzhiyun         count += end - offset;
264*4882a593Smuzhiyun     }
265*4882a593Smuzhiyun out:
266*4882a593Smuzhiyun     count /= size;
267*4882a593Smuzhiyun     fseek(stream, begin + count * size, SEEK_SET);
268*4882a593Smuzhiyun     return count;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
rk29_fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)271*4882a593Smuzhiyun size_t rk29_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun     char buf[WRITE_SIZE];
274*4882a593Smuzhiyun     int fd;
275*4882a593Smuzhiyun     long begin, end;
276*4882a593Smuzhiyun     off_t offset;
277*4882a593Smuzhiyun     ssize_t sz;
278*4882a593Smuzhiyun     size_t count = 0, total;
279*4882a593Smuzhiyun     char *p = (char *)ptr;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun     if (!ptr)
282*4882a593Smuzhiyun         return 0;
283*4882a593Smuzhiyun     if (!size || !nmemb)
284*4882a593Smuzhiyun         return 0;
285*4882a593Smuzhiyun     if (!stream)
286*4882a593Smuzhiyun         return 0;
287*4882a593Smuzhiyun     fd = fileno(stream);
288*4882a593Smuzhiyun     if (fd < 0)
289*4882a593Smuzhiyun         return 0;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun     begin = ftell(stream);
292*4882a593Smuzhiyun     if (begin < 0)
293*4882a593Smuzhiyun         begin = 0;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun     total = size * nmemb;
296*4882a593Smuzhiyun     if (!total)
297*4882a593Smuzhiyun         return 0;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun     end = begin + total;
300*4882a593Smuzhiyun     offset = begin & ~WRITE_MASK;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun     if (begin & WRITE_MASK) {
303*4882a593Smuzhiyun         sz = pread(fd, buf, WRITE_SIZE, offset);
304*4882a593Smuzhiyun         if (sz < WRITE_SIZE)
305*4882a593Smuzhiyun             goto out;
306*4882a593Smuzhiyun         count = min(end, offset + WRITE_SIZE) - begin;
307*4882a593Smuzhiyun         memcpy(buf + (begin & WRITE_MASK), p, count);
308*4882a593Smuzhiyun         sz = pwrite(fd, buf, WRITE_SIZE, offset);
309*4882a593Smuzhiyun         if (sz < WRITE_SIZE)
310*4882a593Smuzhiyun             goto out;
311*4882a593Smuzhiyun         p += count;
312*4882a593Smuzhiyun         offset += WRITE_SIZE;
313*4882a593Smuzhiyun     }
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun     for (; offset < (end & ~WRITE_MASK); offset += WRITE_SIZE) {
316*4882a593Smuzhiyun         sz = pwrite(fd, p, WRITE_SIZE, offset);
317*4882a593Smuzhiyun         if (sz < WRITE_SIZE)
318*4882a593Smuzhiyun             goto out;
319*4882a593Smuzhiyun         count += WRITE_SIZE;
320*4882a593Smuzhiyun         p += WRITE_SIZE;
321*4882a593Smuzhiyun     }
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun     if (count < total && (end & WRITE_MASK)) {
324*4882a593Smuzhiyun         offset = end & ~WRITE_MASK;
325*4882a593Smuzhiyun         sz = pread(fd, buf, WRITE_SIZE, offset);
326*4882a593Smuzhiyun         if (sz < WRITE_SIZE)
327*4882a593Smuzhiyun             goto out;
328*4882a593Smuzhiyun         memcpy(buf, p, end - offset);
329*4882a593Smuzhiyun         sz = pwrite(fd, buf, WRITE_SIZE, offset);
330*4882a593Smuzhiyun         if (sz < WRITE_SIZE)
331*4882a593Smuzhiyun             goto out;
332*4882a593Smuzhiyun         count += end - offset;
333*4882a593Smuzhiyun     }
334*4882a593Smuzhiyun out:
335*4882a593Smuzhiyun     count /= size;
336*4882a593Smuzhiyun     fseek(stream, begin + count * size, SEEK_SET);
337*4882a593Smuzhiyun     return count;
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
340