xref: /aosp_15_r20/external/e2fsprogs/e2fsck/extend.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker  * extend.c --- extend a file so that it has at least a specified
3*6a54128fSAndroid Build Coastguard Worker  * 	number of blocks.
4*6a54128fSAndroid Build Coastguard Worker  *
5*6a54128fSAndroid Build Coastguard Worker  * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
6*6a54128fSAndroid Build Coastguard Worker  *
7*6a54128fSAndroid Build Coastguard Worker  * This file may be redistributed under the terms of the GNU Public
8*6a54128fSAndroid Build Coastguard Worker  * License.
9*6a54128fSAndroid Build Coastguard Worker  */
10*6a54128fSAndroid Build Coastguard Worker 
11*6a54128fSAndroid Build Coastguard Worker #include "config.h"
12*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
13*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
14*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
15*6a54128fSAndroid Build Coastguard Worker #include <string.h>
16*6a54128fSAndroid Build Coastguard Worker #include <sys/types.h>
17*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
18*6a54128fSAndroid Build Coastguard Worker #include "../misc/nls-enable.h"
19*6a54128fSAndroid Build Coastguard Worker 
usage(char * progname)20*6a54128fSAndroid Build Coastguard Worker static void usage(char *progname)
21*6a54128fSAndroid Build Coastguard Worker {
22*6a54128fSAndroid Build Coastguard Worker 	fprintf(stderr, _("%s: %s filename nblocks blocksize\n"),
23*6a54128fSAndroid Build Coastguard Worker 		progname, progname);
24*6a54128fSAndroid Build Coastguard Worker 	exit(1);
25*6a54128fSAndroid Build Coastguard Worker }
26*6a54128fSAndroid Build Coastguard Worker 
27*6a54128fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)28*6a54128fSAndroid Build Coastguard Worker int main(int argc, char **argv)
29*6a54128fSAndroid Build Coastguard Worker {
30*6a54128fSAndroid Build Coastguard Worker 	char	*filename;
31*6a54128fSAndroid Build Coastguard Worker 	int	nblocks, blocksize;
32*6a54128fSAndroid Build Coastguard Worker 	int	fd;
33*6a54128fSAndroid Build Coastguard Worker 	char	*block;
34*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
35*6a54128fSAndroid Build Coastguard Worker 	int	ret;
36*6a54128fSAndroid Build Coastguard Worker 
37*6a54128fSAndroid Build Coastguard Worker 	if (argc != 4)
38*6a54128fSAndroid Build Coastguard Worker 		usage(argv[0]);
39*6a54128fSAndroid Build Coastguard Worker 
40*6a54128fSAndroid Build Coastguard Worker 	filename = argv[1];
41*6a54128fSAndroid Build Coastguard Worker 	nblocks = strtoul(argv[2], 0, 0) - 1;
42*6a54128fSAndroid Build Coastguard Worker 	blocksize = strtoul(argv[3], 0, 0);
43*6a54128fSAndroid Build Coastguard Worker 
44*6a54128fSAndroid Build Coastguard Worker 	if (nblocks < 0) {
45*6a54128fSAndroid Build Coastguard Worker 		fprintf(stderr, _("Illegal number of blocks!\n"));
46*6a54128fSAndroid Build Coastguard Worker 		exit(1);
47*6a54128fSAndroid Build Coastguard Worker 	}
48*6a54128fSAndroid Build Coastguard Worker 
49*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_get_memzero(blocksize, &block);
50*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
51*6a54128fSAndroid Build Coastguard Worker 		fprintf(stderr, _("Couldn't allocate block buffer (size=%d)\n"),
52*6a54128fSAndroid Build Coastguard Worker 			blocksize);
53*6a54128fSAndroid Build Coastguard Worker 		exit(1);
54*6a54128fSAndroid Build Coastguard Worker 	}
55*6a54128fSAndroid Build Coastguard Worker 
56*6a54128fSAndroid Build Coastguard Worker 	fd = open(filename, O_RDWR);
57*6a54128fSAndroid Build Coastguard Worker 	if (fd < 0) {
58*6a54128fSAndroid Build Coastguard Worker 		perror(filename);
59*6a54128fSAndroid Build Coastguard Worker 		exit(1);
60*6a54128fSAndroid Build Coastguard Worker 	}
61*6a54128fSAndroid Build Coastguard Worker 	ret = lseek(fd, nblocks*blocksize, SEEK_SET);
62*6a54128fSAndroid Build Coastguard Worker 	if (ret < 0) {
63*6a54128fSAndroid Build Coastguard Worker 		perror("lseek");
64*6a54128fSAndroid Build Coastguard Worker 		exit(1);
65*6a54128fSAndroid Build Coastguard Worker 	}
66*6a54128fSAndroid Build Coastguard Worker 	ret = read(fd, block, blocksize);
67*6a54128fSAndroid Build Coastguard Worker 	if (ret < 0) {
68*6a54128fSAndroid Build Coastguard Worker 		perror("read");
69*6a54128fSAndroid Build Coastguard Worker 		exit(1);
70*6a54128fSAndroid Build Coastguard Worker 	}
71*6a54128fSAndroid Build Coastguard Worker 	ret = lseek(fd, nblocks*blocksize, SEEK_SET);
72*6a54128fSAndroid Build Coastguard Worker 	if (ret < 0) {
73*6a54128fSAndroid Build Coastguard Worker 		perror("lseek #2");
74*6a54128fSAndroid Build Coastguard Worker 		exit(1);
75*6a54128fSAndroid Build Coastguard Worker 	}
76*6a54128fSAndroid Build Coastguard Worker 	ret = write(fd, block, blocksize);
77*6a54128fSAndroid Build Coastguard Worker 	if (ret < 0) {
78*6a54128fSAndroid Build Coastguard Worker 		perror("read");
79*6a54128fSAndroid Build Coastguard Worker 		exit(1);
80*6a54128fSAndroid Build Coastguard Worker 	}
81*6a54128fSAndroid Build Coastguard Worker 	ext2fs_free_mem(&block);
82*6a54128fSAndroid Build Coastguard Worker 	return(0);
83*6a54128fSAndroid Build Coastguard Worker }
84