add compile-time check for correct DHCP packet size
[oweals/busybox.git] / e2fsprogs / util.c
index d4d77b63b92a2dd482b9a4aa1d8fecc908462612..b30c294b8b654c9d79004fc00961c3f75660bbf6 100644 (file)
@@ -1,6 +1,7 @@
+/* vi: set sw=4 ts=4: */
 /*
  * util.c --- helper functions used by tune2fs and mke2fs
- * 
+ *
  * Copyright 1995, 1996, 1997, 1998, 1999, 2000 by Theodore Ts'o.
  *
  * %Begin-Header%
@@ -29,19 +30,15 @@ void proceed_question(void)
                exit(1);
 }
 
-void check_plausibility(const char *device)
+void check_plausibility(const char *device, int force)
 {
        int val;
-#ifdef CONFIG_LFS
-       struct stat64 s;
-       val = stat64(device, &s);
-#else
        struct stat s;
        val = stat(device, &s);
-#endif
-
+       if (force)
+               return;
        if(val == -1)
-               bb_perror_msg_and_die("Could not stat %s", device);
+               bb_perror_msg_and_die("cannot stat %s", device);
        if (!S_ISBLK(s.st_mode)) {
                printf("%s is not a block special device.\n", device);
                proceed_question();
@@ -85,39 +82,38 @@ void check_mount(const char *device, int force, const char *type)
 
        retval = ext2fs_check_if_mounted(device, &mount_flags);
        if (retval) {
-               bb_error_msg("Could not determine if %s is mounted", device);
+               bb_error_msg("cannot determine if %s is mounted", device);
                return;
        }
-       if (!(mount_flags & EXT2_MF_MOUNTED))
-               return;
+       if (mount_flags & EXT2_MF_MOUNTED) {
+               bb_error_msg("%s is mounted !", device);
+force_check:
+               if (force)
+                       bb_error_msg("badblocks forced anyways");
+               else
+                       bb_error_msg_and_die("it's not safe to run badblocks!");
+       }
+
+       if (mount_flags & EXT2_MF_BUSY) {
+               bb_error_msg("%s is apparently in use by the system", device);
+               goto force_check;
+       }
 
-       bb_error_msg("%s is mounted !", device);
-       if (force)
-               bb_error_msg("forcing anyways and ignoring /etc/mtab status");
-       else
-               bb_error_msg_and_die("will not make a %s here!", type);
 }
 
-void parse_journal_opts(char **journal_device, int *journal_flags, 
-                        int *journal_size, const char *opts)
+void parse_journal_opts(char **journal_device, int *journal_flags,
+                       int *journal_size, const char *opts)
 {
        char *buf, *token, *next, *p, *arg;
        int journal_usage = 0;
-#if 0
-       int     len;
-       len = strlen(opts);
-       buf = xmalloc(len+1);
-       strcpy(buf, opts);
-#else
-       buf = bb_xstrdup(opts);
-#endif
+       buf = xstrdup(opts);
        for (token = buf; token && *token; token = next) {
                p = strchr(token, ',');
                next = 0;
                if (p) {
                        *p = 0;
                        next = p+1;
-               } 
+               }
                arg = strchr(token, '=');
                if (arg) {
                        *arg = 0;
@@ -154,13 +150,13 @@ void parse_journal_opts(char **journal_device, int *journal_flags,
                        "\tdevice=<journal device>\n\n"
                        "The journal size must be between "
                        "1024 and 102400 filesystem blocks.\n\n");
-}      
+}
 
 /*
  * Determine the number of journal blocks to use, either via
  * user-specified # of megabytes, or via some intelligently selected
  * defaults.
- * 
+ *
  * Find a reasonable journal file size (in blocks) given the number of blocks
  * in the filesystem.  For very small filesystems, it is not reasonable to
  * have a journal that fills more than half of the filesystem.
@@ -188,10 +184,14 @@ int figure_journal_size(int size, ext2_filsys fs)
 
        if (fs->super->s_blocks_count < 32768)
                j_blocks = 1024;
-       else if (fs->super->s_blocks_count < 262144)
+       else if (fs->super->s_blocks_count < 256*1024)
                j_blocks = 4096;
-       else
+       else if (fs->super->s_blocks_count < 512*1024)
                j_blocks = 8192;
+       else if (fs->super->s_blocks_count < 1024*1024)
+               j_blocks = 16384;
+       else
+               j_blocks = 32768;
 
        return j_blocks;
 }
@@ -205,3 +205,63 @@ void print_check_message(ext2_filsys fs)
               fs->super->s_max_mnt_count,
               (double)fs->super->s_checkinterval / (3600 * 24));
 }
+
+void make_journal_device(char *journal_device, ext2_filsys fs, int quiet, int force)
+{
+       errcode_t       retval;
+       ext2_filsys     jfs;
+       io_manager      io_ptr;
+
+       check_plausibility(journal_device, force);
+       check_mount(journal_device, force, "journal");
+       io_ptr = unix_io_manager;
+       retval = ext2fs_open(journal_device, EXT2_FLAG_RW|
+                                       EXT2_FLAG_JOURNAL_DEV_OK, 0,
+                                       fs->blocksize, io_ptr, &jfs);
+       if (retval)
+               bb_error_msg_and_die("cannot journal device %s", journal_device);
+       if(!quiet)
+               printf("Adding journal to device %s: ", journal_device);
+       fflush(stdout);
+       retval = ext2fs_add_journal_device(fs, jfs);
+       if(retval)
+               bb_error_msg_and_die("\nFailed to add journal to device %s", journal_device);
+       if(!quiet)
+               puts("done");
+       ext2fs_close(jfs);
+}
+
+void make_journal_blocks(ext2_filsys fs, int journal_size, int journal_flags, int quiet)
+{
+       unsigned long journal_blocks;
+       errcode_t       retval;
+
+       journal_blocks = figure_journal_size(journal_size, fs);
+       if (!journal_blocks) {
+               fs->super->s_feature_compat &=
+                       ~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+               return;
+       }
+       if(!quiet)
+               printf("Creating journal (%ld blocks): ", journal_blocks);
+       fflush(stdout);
+       retval = ext2fs_add_journal_inode(fs, journal_blocks,
+                                                 journal_flags);
+       if(retval)
+               bb_error_msg_and_die("cannot create journal");
+       if(!quiet)
+               puts("done");
+}
+
+char *e2fs_set_sbin_path(void)
+{
+       char *oldpath = getenv("PATH");
+       /* Update our PATH to include /sbin  */
+#define PATH_SET "/sbin"
+       if (oldpath)
+               oldpath = xasprintf("%s:%s", PATH_SET, oldpath);
+        else
+               oldpath = PATH_SET;
+       putenv (oldpath);
+       return oldpath;
+}