/*
 * 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__

#define _GNU_SOURCE
#define _LARGEFILE64_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <byteswap.h>
#include <linux/types.h>
#include <linux/fs.h>

#include <getopt.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <libgen.h>
#include <ctype.h>
#include <uuid/uuid.h>
#include <sys/file.h>

#include "libubi.h"
#include "crc32.h"
#include "defs.h"
#include "crc16.h"
#include "ubifs-media.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

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 dtype);
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
