/* We don't use our include/crc32.h, but crc32 from zlib!
*
- * The zlib implemenation performs pre/post-conditioning. The util-linux
+ * The zlib implementation performs pre/post-conditioning. The util-linux
* imlemenation requires post-conditioning (xor) in the applications.
*/
#include <zlib.h>
+#include "blkdev.h"
#include "c.h"
#include "cramfs.h"
#include "md5.h"
/* stats */
unsigned char *name;
unsigned int mode, size, uid, gid;
- unsigned char md5sum[MD5LENGTH];
+ unsigned char md5sum[UL_MD5LENGTH];
unsigned char flags; /* CRAMFS_EFLAG_* */
/* FS data */
static void __attribute__((__noreturn__)) usage(void)
{
- printf(
- _("usage: %s [-h] [-v] [-b blksize] [-e edition] [-N endian] [-i file] "
- "[-n name] dirname outfile\n"
- " -v be verbose\n"
- " -E make all warnings errors "
- "(non-zero exit status)\n"
- " -b blksize use this blocksize, must equal page size\n"
- " -e edition set edition number (part of fsid)\n"
- " -N endian set cramfs endianness (big|little|host), default host\n"
- " -i file insert a file image into the filesystem\n"
- " -n name set name of cramfs filesystem\n"
- " -p pad by %d bytes for boot code\n"
- " -s sort directory entries (old option, ignored)\n"
- " -z make explicit holes\n"
- " dirname root of the filesystem to be compressed\n"
- " outfile output file\n"),
- program_invocation_short_name, PAD_SIZE);
-
+ fputs(USAGE_HEADER, stdout);
+ fprintf(stdout, _(" %s [-h] [-v] [-b blksize] [-e edition] [-N endian] [-i file] [-n name] dirname outfile\n"),
+ program_invocation_short_name);
+ fputs(USAGE_SEPARATOR, stdout);
+ fputs(_("Make compressed ROM file system."), stdout);
+ fputs(USAGE_OPTIONS, stdout);
+ fputs(_( " -v be verbose"), stdout);
+ fputs(_( " -E make all warnings errors (non-zero exit status)"), stdout);
+ fputs(_( " -b blksize use this blocksize, must equal page size"), stdout);
+ fputs(_( " -e edition set edition number (part of fsid)"), stdout);
+ fprintf(stdout, _(" -N endian set cramfs endianness (%s|%s|%s), default %s\n"), "big", "little", "host", "host");
+ fputs(_( " -i file insert a file image into the filesystem"), stdout);
+ fputs(_( " -n name set name of cramfs filesystem"), stdout);
+ fprintf(stdout, _(" -p pad by %d bytes for boot code\n"), PAD_SIZE);
+ fputs(_( " -s sort directory entries (old option, ignored)"), stdout);
+ fputs(_( " -z make explicit holes"), stdout);
+ fputs(_( " -l[=<mode>] use exclusive device lock (yes, no or nonblock)"), stdout);
+ fputs(_( " dirname root of the filesystem to be compressed"), stdout);
+ fputs(_( " outfile output file"), stdout);
fputs(USAGE_SEPARATOR, stdout);
- print_usage_help_options(16);
- printf(USAGE_MAN_TAIL("mkfs.cramfs(8)"));
+ fprintf(stdout, USAGE_HELP_OPTIONS(16));
+ fprintf(stdout, USAGE_MAN_TAIL("mkfs.cramfs(8)"));
exit(MKFS_EX_OK);
}
return NULL;
if (S_ISLNK(mode)) {
+ /* The link buffer is unnecessary to terminate by null as it's
+ * always used as buffer rather than a string */
start = xmalloc(size);
if (readlink(path, start, size) < 0) {
warn(_("readlink failed: %s"), path);
/* compute md5sums, so that we do not have to compare every pair of files */
static void
mdfile(struct entry *e) {
- MD5_CTX ctx;
char *start;
start = do_mmap(e->path, e->size, e->mode);
if (start == NULL) {
e->flags |= CRAMFS_EFLAG_INVALID;
} else {
- MD5Init(&ctx);
- MD5Update(&ctx, (unsigned char *) start, e->size);
- MD5Final(e->md5sum, &ctx);
+ UL_MD5_CTX ctx;
+
+ ul_MD5Init(&ctx);
+ ul_MD5Update(&ctx, (unsigned char *) start, e->size);
+ ul_MD5Final(e->md5sum, &ctx);
do_munmap(start, e->size, e->mode);
if ((orig->flags & CRAMFS_EFLAG_MD5) &&
(new->flags & CRAMFS_EFLAG_MD5) &&
- !memcmp(orig->md5sum, new->md5sum, MD5LENGTH) &&
+ !memcmp(orig->md5sum, new->md5sum, UL_MD5LENGTH) &&
identical_file(orig, new)) {
new->same = orig;
*fslen_ub -= new->size;
entry->size = parse_directory(root_entry, path, &entry->child, fslen_ub);
} else if (S_ISREG(st.st_mode)) {
entry->path = xstrdup(path);
- if (entry->size && entry->size >= (1 << CRAMFS_SIZE_WIDTH)) {
+ if (entry->size >= (1 << CRAMFS_SIZE_WIDTH)) {
warn_size = 1;
entry->size = (1 << CRAMFS_SIZE_WIDTH) - 1;
}
memset(super->name, 0x00, sizeof(super->name));
if (opt_name)
- strncpy((char *)super->name, opt_name, sizeof(super->name));
+ str2memcpy((char *)super->name, opt_name, sizeof(super->name));
else
- strncpy((char *)super->name, "Compressed", sizeof(super->name));
+ str2memcpy((char *)super->name, "Compressed", sizeof(super->name));
super->root.mode = root->mode;
super->root.uid = root->uid;
if (entry->child) {
if (stack_entries >= stack_size) {
stack_size *= 2;
- entry_stack = xrealloc(entry_stack, stack_size * sizeof(struct entry *));
+ entry_stack = xreallocarray(entry_stack, stack_size, sizeof(struct entry *));
}
entry_stack[stack_entries] = entry;
stack_entries++;
(len-- == 0 ||
(begin[3] == '\0' &&
memcmp(begin, begin + 4, len) == 0))))))));
- else
- /* Never create holes. */
- return 0;
+
+ /* Never create holes. */
+ return 0;
}
/*
loff_t fslen_ub = sizeof(struct cramfs_super);
unsigned int fslen_max;
char const *dirname, *outfile;
+ char *lockmode = 0;
uint32_t crc = crc32(0L, NULL, 0);
int c;
cramfs_is_big_endian = HOST_IS_BIG_ENDIAN; /* default is to use host order */
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- atexit(close_stdout);
+ close_stdout_atexit();
if (argc > 1) {
/* first arg may be one of our standard longopts */
if (!strcmp(argv[1], "--help"))
usage();
if (!strcmp(argv[1], "--version")) {
- printf(UTIL_LINUX_VERSION);
+ print_version(EXIT_SUCCESS);
exit(MKFS_EX_OK);
}
}
strutils_set_exitcode(MKFS_EX_USAGE);
/* command line options */
- while ((c = getopt(argc, argv, "hb:Ee:i:n:N:psVvz")) != EOF) {
+ while ((c = getopt(argc, argv, "hb:Ee:i:n:N:l::psVvz")) != EOF) {
switch (c) {
case 'h':
usage();
image_length = st.st_size; /* may be padded later */
fslen_ub += (image_length + 3); /* 3 is for padding */
break;
+ case 'l':
+ lockmode = "1";
+ if (optarg) {
+ if (*optarg == '=')
+ optarg++;
+ lockmode = optarg;
+ }
+ break;
case 'n':
opt_name = optarg;
break;
/* old option, ignored */
break;
case 'V':
- printf(UTIL_LINUX_VERSION);
- exit(MKFS_EX_OK);
+ print_version(MKFS_EX_OK);
case 'v':
verbose = 1;
break;
if (fd < 0)
err(MKFS_EX_USAGE, _("cannot open %s"), outfile);
+ if (blkdev_lock(fd, outfile, lockmode) != 0)
+ exit(MKFS_EX_ERROR);
+
root_entry = xcalloc(1, sizeof(struct entry));
root_entry->mode = st.st_mode;
root_entry->uid = st.st_uid;