dupfs.c revision 9f8046fc6dfc13eee2f5c363214e60b533872cac
1/*
2 * dupfs.c --- duplicate a ext2 filesystem handle
3 *
4 * Copyright (C) 1997 Theodore Ts'o.
5 *
6 * %Begin-Header%
7 * This file may be redistributed under the terms of the GNU Public
8 * License.
9 * %End-Header%
10 */
11
12#include <stdio.h>
13#if HAVE_UNISTD_H
14#include <unistd.h>
15#endif
16#include <time.h>
17#include <string.h>
18
19#include "ext2_fs.h"
20#include "ext2fsP.h"
21
22errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest)
23{
24	ext2_filsys	fs;
25	errcode_t	retval;
26
27	EXT2_CHECK_MAGIC(src, EXT2_ET_MAGIC_EXT2FS_FILSYS);
28
29	retval = ext2fs_get_mem(sizeof(struct struct_ext2_filsys),
30				(void **) &fs);
31	if (retval)
32		return retval;
33
34	*fs = *src;
35	fs->device_name = 0;
36	fs->super = 0;
37	fs->group_desc = 0;
38	fs->inode_map = 0;
39	fs->block_map = 0;
40	fs->badblocks = 0;
41	fs->dblist = 0;
42
43	io_channel_bumpcount(fs->io);
44	if (fs->icache)
45		fs->icache->refcount++;
46
47	retval = ext2fs_get_mem(strlen(src->device_name)+1,
48				(void **) &fs->device_name);
49	if (retval)
50		goto errout;
51	strcpy(fs->device_name, src->device_name);
52
53	retval = ext2fs_get_mem(SUPERBLOCK_SIZE, (void **) &fs->super);
54	if (retval)
55		goto errout;
56	memcpy(fs->super, src->super, SUPERBLOCK_SIZE);
57
58	retval = ext2fs_get_mem((size_t) fs->desc_blocks * fs->blocksize,
59				(void **) &fs->group_desc);
60	if (retval)
61		goto errout;
62	memcpy(fs->group_desc, src->group_desc,
63	       (size_t) fs->desc_blocks * fs->blocksize);
64
65	if (src->inode_map) {
66		retval = ext2fs_copy_bitmap(src->inode_map, &fs->inode_map);
67		if (retval)
68			goto errout;
69	}
70	if (src->block_map) {
71		retval = ext2fs_copy_bitmap(src->block_map, &fs->block_map);
72		if (retval)
73			goto errout;
74	}
75	if (src->badblocks) {
76		retval = ext2fs_badblocks_copy(src->badblocks, &fs->badblocks);
77		if (retval)
78			goto errout;
79	}
80	if (src->dblist) {
81		retval = ext2fs_copy_dblist(src->dblist, &fs->dblist);
82		if (retval)
83			goto errout;
84	}
85	*dest = fs;
86	return 0;
87errout:
88	ext2fs_free(fs);
89	return retval;
90
91}
92
93