newdir.c revision d1154eb460efe588eaed3d439c1caaca149fa362
1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * newdir.c --- create a new directory block 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Copyright (C) 1994, 1995 Theodore Ts'o. 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * %Begin-Header% 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * This file may be redistributed under the terms of the GNU Library 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * General Public License, version 2. 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * %End-Header% 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "config.h" 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <stdio.h> 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <string.h> 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#if HAVE_UNISTD_H 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <unistd.h> 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#endif 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "ext2_fs.h" 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "ext2fs.h" 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#ifndef EXT2_FT_DIR 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#define EXT2_FT_DIR 2 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#endif 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* 27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Create new directory block 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoerrcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino, 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao ext2_ino_t parent_ino, char **block) 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao{ 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao struct ext2_dir_entry *dir = NULL; 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao errcode_t retval; 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao char *buf; 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao int rec_len; 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao int filetype = 0; 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao retval = ext2fs_get_mem(fs->blocksize, &buf); 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (retval) 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return retval; 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao memset(buf, 0, fs->blocksize); 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir = (struct ext2_dir_entry *) buf; 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao retval = ext2fs_set_rec_len(fs, fs->blocksize, dir); 47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (retval) 48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return retval; 49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (dir_ino) { 51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (fs->super->s_feature_incompat & 52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao EXT2_FEATURE_INCOMPAT_FILETYPE) 53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao filetype = EXT2_FT_DIR << 8; 54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao /* 55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Set up entry for '.' 56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->inode = dir_ino; 58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->name_len = 1 | filetype; 59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->name[0] = '.'; 60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao rec_len = fs->blocksize - EXT2_DIR_REC_LEN(1); 61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->rec_len = EXT2_DIR_REC_LEN(1); 62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao /* 64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Set up entry for '..' 65e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 66e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir = (struct ext2_dir_entry *) (buf + dir->rec_len); 67e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao retval = ext2fs_set_rec_len(fs, rec_len, dir); 68e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (retval) 69e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return retval; 70e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->inode = parent_ino; 71e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->name_len = 2 | filetype; 72e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->name[0] = '.'; 73e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dir->name[1] = '.'; 74e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 75e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 76e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao *block = buf; 77e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return 0; 78e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 79e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao