/* * Copyright (C) 2008 Nokia Corporation. * Copyright (C) 2008 University of Szeged, Hungary * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: Artem Bityutskiy * Adrian Hunter * Zoltan Sogor */ #ifndef __MKFS_UBIFS_H__ #define __MKFS_UBIFS_H__ #include #include #include #include #include #include #include #include #include #ifdef __linux__ #include # if defined(__x86_64__) && defined(__ILP32__) # define llseek lseek64 # endif #else # ifndef O_LARGEFILE # define O_LARGEFILE 0 # endif # define llseek lseek #endif #include #include #include #include #include #include #include #include #include #include #include #ifdef WITH_CRYPTO #include #endif #include /* common.h requires the PROGRAM_NAME macro */ #define PROGRAM_NAME "mkfs.ubifs" #include "common.h" #include "libubi.h" #include "defs.h" #include "crc16.h" #include "ubifs.h" #include "key.h" #include "lpt.h" #include "compr.h" /* * Compression flags are duplicated so that compr.c can compile without ubifs.h. * Here we make sure they are the same. */ #if MKFS_UBIFS_COMPR_NONE != UBIFS_COMPR_NONE #error MKFS_UBIFS_COMPR_NONE != UBIFS_COMPR_NONE #endif #if MKFS_UBIFS_COMPR_LZO != UBIFS_COMPR_LZO #error MKFS_UBIFS_COMPR_LZO != UBIFS_COMPR_LZO #endif #if MKFS_UBIFS_COMPR_ZLIB != UBIFS_COMPR_ZLIB #error MKFS_UBIFS_COMPR_ZLIB != UBIFS_COMPR_ZLIB #endif #if MKFS_UBIFS_COMPR_ZSTD != UBIFS_COMPR_ZSTD #error MKFS_UBIFS_COMPR_ZSTD != UBIFS_COMPR_ZSTD #endif extern int verbose; extern int debug_level; #define dbg_msg(lvl, fmt, ...) do {if (debug_level >= lvl) \ printf("mkfs.ubifs: %s: " fmt "\n", __FUNCTION__, ##__VA_ARGS__); \ } while(0) #define err_msg(fmt, ...) ({ \ fprintf(stderr, "Error: " fmt "\n", ##__VA_ARGS__); \ -1; \ }) #define sys_err_msg(fmt, ...) ({ \ int err_ = errno; \ fprintf(stderr, "Error: " fmt "\n", ##__VA_ARGS__); \ fprintf(stderr, " %s (error %d)\n", strerror(err_), err_); \ -1; \ }) /** * struct path_htbl_element - an element of the path hash table. * @path: the UBIFS path the element describes (the key of the element) * @name_htbl: one more (nested) hash table containing names of all * files/directories/device nodes which should be created at this * path * * See device table handling for more information. */ struct path_htbl_element { const char *path; struct hashtable *name_htbl; }; /** * struct name_htbl_element - an element in the name hash table * @name: name of the file/directory/device node (the key of the element) * @mode: accsess rights and file type * @uid: user ID * @gid: group ID * @major: device node major number * @minor: device node minor number * * This is an element of the name hash table. Name hash table sits in the path * hash table elements and describes file names which should be created/changed * at this path. */ struct name_htbl_element { const char *name; unsigned int mode; unsigned int uid; unsigned int gid; dev_t dev; }; extern struct ubifs_info info_; struct hashtable_itr; int write_leb(int lnum, int len, void *buf); int parse_devtable(const char *tbl_file); struct path_htbl_element *devtbl_find_path(const char *path); struct name_htbl_element *devtbl_find_name(struct path_htbl_element *ph_elt, const char *name); int override_attributes(struct stat *st, struct path_htbl_element *ph_elt, struct name_htbl_element *nh_elt); struct name_htbl_element * first_name_htbl_element(struct path_htbl_element *ph_elt, struct hashtable_itr **itr); struct name_htbl_element * next_name_htbl_element(struct path_htbl_element *ph_elt, struct hashtable_itr **itr); void free_devtable_info(void); #endif