[BusyBox] [PATCH] e2fs patch

Tito farmatito at tiscali.it
Thu May 5 12:22:09 UTC 2005


Hi,
This is a first attempt to reduce the size of the new
e2fs stuff.
This is not heavily tested.
Size reduction is:
root at localhost:/dev/pts/5:/root/Desktop/busybox# size e2fsprogs/*.o
   text    data     bss     dec     hex filename
   1072       0      24    1096     448 e2fsprogs/chattr.o
   1044  168        0     1212     4bc e2fsprogs/e2p.o
     727       0        4       731     2db e2fsprogs/lsattr.o
   text    data     bss     dec     hex filename
   1049       0       24    1073     431 e2fsprogs/chattr.o
     976   168        0     1144     478 e2fsprogs/e2p.o
     687       0         4       691     2b3 e2fsprogs/lsattr.o
Please test it and apply if you think it is ok.

Ciao,
Tito
-------------- next part --------------
diff -uNr busybox_orig/e2fsprogs/chattr.c busybox/e2fsprogs/chattr.c
--- busybox_orig/e2fsprogs/chattr.c	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/chattr.c	2005-05-05 14:01:16.000000000 +0200
@@ -118,9 +118,10 @@
 
 static void change_attributes(const char * name)
 {
+	char *err_fmt="while %s flags on %s";
 	unsigned long fsflags;
 	STRUCT_STAT	st;
-
+	
 	if (LSTAT(name, &st) == -1) {
 		bb_error_msg("while trying to stat %s", name);
 		return;
@@ -136,14 +137,14 @@
 		return;
 
 	if (flags & OPT_SET_VER)
-		if (fsetversion(name, version) == -1)
+		if (fgetsetversion(name, version, NULL) == -1)
 			bb_error_msg("while setting version on %s", name);
 
 	if (flags & OPT_SET) {
 		fsflags = sf;
 	} else {
 		if (fgetflags(name, &fsflags) == -1) {
-			bb_error_msg("while reading flags on %s", name);
+			bb_error_msg(err_fmt, "reading", name);
 			goto skip_setflags;
 		}
 		if (flags & OPT_REM)
@@ -154,7 +155,7 @@
 			fsflags &= ~EXT2_DIRSYNC_FL;
 	}
 	if (fsetflags(name, fsflags) == -1)
-		bb_error_msg("while setting flags on %s", name);
+		bb_error_msg(err_fmt, "setting", name);
 
 skip_setflags:
 	if (S_ISDIR(st.st_mode) && recursive)
@@ -164,12 +165,11 @@
 static int chattr_dir_proc(const char *dir_name, struct dirent *de, 
                            void *private EXT2FS_ATTR((unused)))
 {
-	/*if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) {*/
-	if (de->d_name[0] == '.' && (de->d_name[1] == '\0' || \
-	   (de->d_name[1] == '.' && de->d_name[2] == '\0'))) {
+	if (de->d_name[0] != '.' && (de->d_name[1] != '\0' || 
+		(de->d_name[1] != '.' && de->d_name[2] != '\0'))) {
 		char *path;
-		if (asprintf(&path, "%s/%s", dir_name, de->d_name) == -1)
-			bb_error_msg_and_die(bb_msg_memory_exhausted);
+		
+		bb_xasprintf(&path, "%s/%s", dir_name, de->d_name);
 		change_attributes(path);
 		free(path);
 	}
diff -uNr busybox_orig/e2fsprogs/e2p/e2p.h busybox/e2fsprogs/e2p/e2p.h
--- busybox_orig/e2fsprogs/e2p/e2p.h	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/e2p/e2p.h	2005-05-02 21:29:31.000000000 +0200
@@ -15,9 +15,10 @@
 
 
 int fgetflags (const char * name, unsigned long * flags);
-int fgetversion (const char * name, unsigned long * version);
+/*int fgetversion (const char * name, unsigned long * version);*/
 int fsetflags (const char * name, unsigned long flags);
-int fsetversion (const char * name, unsigned long version);
+/*int fsetversion (const char * name, unsigned long version);*/
+int fgetsetversion (const char * name, unsigned long version, unsigned long * ptr_version);
 int getflags (int fd, unsigned long * flags);
 int getversion (int fd, unsigned long * version);
 int iterate_on_dir (const char * dir_name,
@@ -50,3 +51,4 @@
 
 char *e2p_os2string(int os_type);
 int e2p_string2os(char *str);
+char *skip_over_word(char *cp);
diff -uNr busybox_orig/e2fsprogs/e2p/fgetsetversion.c busybox/e2fsprogs/e2p/fgetsetversion.c
--- busybox_orig/e2fsprogs/e2p/fgetsetversion.c	1970-01-01 01:00:00.000000000 +0100
+++ busybox/e2fsprogs/e2p/fgetsetversion.c	2005-05-02 22:17:46.000000000 +0200
@@ -0,0 +1,82 @@
+/*
+ * fgetversion.c	- Get a file version on an ext2 file system
+ * fsetversion.c	- Set a file version on an ext2 file system
+ *
+ *
+ * Copyright (C) 1993, 1994  Remy Card <card at masi.ibp.fr>
+ *                           Laboratoire MASI, Institut Blaise Pascal
+ *                           Universite Pierre et Marie Curie (Paris VI)
+ *
+ * This file can be redistributed under the terms of the GNU Library General
+ * Public License
+ */
+
+/*
+ * History:
+ * 93/10/30	- Creation
+ */
+
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "e2p.h"
+
+#ifdef O_LARGEFILE
+#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
+#else
+#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
+#endif
+
+/* 
+   To do fsetversion:     unsigned long *ptr_version must be set to NULL.
+                      and unsigned long version must be set to a value   
+   To do fgetversion:     unsigned long *ptr_version must NOT be set to NULL
+                      and unsigned long version is ignored.
+	TITO.
+*/
+
+int fgetsetversion (const char * name, unsigned long version, unsigned long *ptr_version)
+{
+#if HAVE_EXT2_IOCTLS
+#if !APPLE_DARWIN
+	int fd, r, ver, save_errno = 0;
+
+	fd = open (name, OPEN_FLAGS);
+	if (fd == -1)
+		return -1;
+	if (!ptr_version) {
+		ver = (int) version;
+		r = ioctl (fd, EXT2_IOC_SETVERSION, &ver);
+	} else {
+		r = ioctl (fd, EXT2_IOC_GETVERSION, &ver);
+		*ptr_version = ver;
+	}
+	if (r == -1)
+		save_errno = errno;
+	close (fd);
+	if (save_errno)
+		errno = save_errno;
+	return r;
+#else
+	if (!ptr_version) {
+		int ver = (int)version;
+		return syscall(SYS_fsctl, name, EXT2_IOC_SETVERSION, &ver, 0);
+	} else {
+		int ver=-1, err;
+		err = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
+		*ptr_version = ver;
+		return(err);	
+	}
+#endif
+#else /* ! HAVE_EXT2_IOCTLS */
+	extern int errno;
+	errno = EOPNOTSUPP;
+	return -1;
+#endif /* ! HAVE_EXT2_IOCTLS */
+}
diff -uNr busybox_orig/e2fsprogs/e2p/fgetversion.c busybox/e2fsprogs/e2p/fgetversion.c
--- busybox_orig/e2fsprogs/e2p/fgetversion.c	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/e2p/fgetversion.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,62 +0,0 @@
-/*
- * fgetversion.c	- Get a file version on an ext2 file system
- *
- * Copyright (C) 1993, 1994  Remy Card <card at masi.ibp.fr>
- *                           Laboratoire MASI, Institut Blaise Pascal
- *                           Universite Pierre et Marie Curie (Paris VI)
- *
- * This file can be redistributed under the terms of the GNU Library General
- * Public License
- */
-
-/*
- * History:
- * 93/10/30	- Creation
- */
-
-#if HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-#include "e2p.h"
-
-#ifdef O_LARGEFILE
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
-#else
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
-#endif
-
-int fgetversion (const char * name, unsigned long * version)
-{
-#if HAVE_EXT2_IOCTLS
-#if !APPLE_DARWIN
-	int fd, r, ver, save_errno = 0;
-
-	fd = open (name, OPEN_FLAGS);
-	if (fd == -1)
-		return -1;
-	r = ioctl (fd, EXT2_IOC_GETVERSION, &ver);
-	if (r == -1)
-		save_errno = errno;
-	*version = ver;
-	close (fd);
-	if (save_errno)
-		errno = save_errno;
-	return r;
-#else
-   int ver=-1, err;
-   err = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
-   *version = ver;
-   return(err);
-#endif
-#else /* ! HAVE_EXT2_IOCTLS */
-	extern int errno;
-	errno = EOPNOTSUPP;
-	return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-}
diff -uNr busybox_orig/e2fsprogs/e2p/fsetversion.c busybox/e2fsprogs/e2p/fsetversion.c
--- busybox_orig/e2fsprogs/e2p/fsetversion.c	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/e2p/fsetversion.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,60 +0,0 @@
-/*
- * fsetversion.c	- Set a file version on an ext2 file system
- *
- * Copyright (C) 1993, 1994  Remy Card <card at masi.ibp.fr>
- *                           Laboratoire MASI, Institut Blaise Pascal
- *                           Universite Pierre et Marie Curie (Paris VI)
- *
- * This file can be redistributed under the terms of the GNU Library General
- * Public License
- */
-
-/*
- * History:
- * 93/10/30	- Creation
- */
-
-#if HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-#include "e2p.h"
-
-#ifdef O_LARGEFILE
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK|O_LARGEFILE)
-#else
-#define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
-#endif
-
-int fsetversion (const char * name, unsigned long version)
-{
-#if HAVE_EXT2_IOCTLS
-#if !APPLE_DARWIN
-	int fd, r, ver, save_errno = 0;
-
-	fd = open (name, OPEN_FLAGS);
-	if (fd == -1)
-		return -1;
-	ver = (int) version;
-	r = ioctl (fd, EXT2_IOC_SETVERSION, &ver);
-	if (r == -1)
-		save_errno = errno;
-	close (fd);
-	if (save_errno)
-		errno = save_errno;
-	return r;
-#else
-   int ver = (int)version;
-   return syscall(SYS_fsctl, name, EXT2_IOC_SETVERSION, &ver, 0);
-#endif
-#else /* ! HAVE_EXT2_IOCTLS */
-	extern int errno;
-	errno = EOPNOTSUPP;
-	return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-}
diff -uNr busybox_orig/e2fsprogs/e2p/README busybox/e2fsprogs/e2p/README
--- busybox_orig/e2fsprogs/e2p/README	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/e2p/README	2005-05-05 13:53:47.000000000 +0200
@@ -2,3 +2,6 @@
 files we don't need (Makefile.in, e2p.pc.in, etc...).  Remove all of the 
 _LARGEFILE* define's from the few source files that use it since we'll be 
 appending it ourselves to CFLAGS when we compile.  All done ! :)
+
+Some of the files in this dir are unused.
+Take a look at /busybox/e2fsprogs/Makefile.in.
\ No newline at end of file
diff -uNr busybox_orig/e2fsprogs/lsattr.c busybox/e2fsprogs/lsattr.c
--- busybox_orig/e2fsprogs/lsattr.c	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/lsattr.c	2005-05-02 22:19:14.000000000 +0200
@@ -58,15 +58,15 @@
 {
 	unsigned long fsflags;
 	unsigned long generation;
-
+	char *err = "flags";
+	
 	if (fgetflags(name, &fsflags) == -1) {
-		bb_perror_msg("While reading flags on %s", name);
-		return;
+		goto ERROR;
 	}
 	if (flags & OPT_GENERATION) {
-		if (fgetversion(name, &generation) == -1) {
-			bb_perror_msg("While reading version on %s", name);
-			return;
+		if (fgetsetversion(name,0, &generation) == -1) {
+			err = "version";
+			goto ERROR;
 		}
 		printf("%5lu ", generation);
 	}
@@ -78,6 +78,9 @@
 		print_flags(stdout, fsflags, 0);
 		printf(" %s\n", name);
 	}
+	return;
+ERROR:
+	bb_perror_msg("While reading %s on %s", err, name);
 }
 
 static int lsattr_dir_proc(const char *, struct dirent *, void *);
@@ -86,13 +89,14 @@
 {
 	STRUCT_STAT	st;
 
-	if (LSTAT(name, &st) == -1)
+	if (LSTAT(name, &st) == -1) {
 		bb_perror_msg("while trying to stat %s", name);
-	else {
-		if (S_ISDIR(st.st_mode) && !(flags & OPT_DIRS_OPT))
+	} else {
+		if (S_ISDIR(st.st_mode) && !(flags & OPT_DIRS_OPT)) {
 			iterate_on_dir(name, lsattr_dir_proc, NULL);
-		else
+		} else {
 			list_attributes(name);
+		}
 	}
 }
 
@@ -104,19 +108,18 @@
 	int i = strlen(dir_name);
 
 	if (i && dir_name[i-1] == '/')
-		i = asprintf(&path, "%s%s", dir_name, de->d_name);
+		bb_xasprintf(&path, "%s%s", dir_name, de->d_name);
 	else
-		i = asprintf(&path, "%s/%s", dir_name, de->d_name);
-	if (i == -1)
-		bb_error_msg_and_die(bb_msg_memory_exhausted);
-
+		bb_xasprintf(&path, "%s/%s", dir_name, de->d_name);
+	
 	if (LSTAT(path, &st) == -1)
 		bb_perror_msg(path);
 	else {
 		if (de->d_name[0] != '.' || (flags & OPT_ALL)) {
 			list_attributes(path);
 			if (S_ISDIR(st.st_mode) && (flags & OPT_RECUR) &&
-			    strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) {
+				(de->d_name[0] != '.' && (de->d_name[1] != '\0' || 
+				(de->d_name[1] != '.' && de->d_name[2] != '\0')))) {
 				printf("\n%s:\n", path);
 				iterate_on_dir(path, lsattr_dir_proc, NULL);
 				printf("\n");
diff -uNr busybox_orig/e2fsprogs/Makefile.in busybox/e2fsprogs/Makefile.in
--- busybox_orig/e2fsprogs/Makefile.in	2005-05-03 08:20:10.000000000 +0200
+++ busybox/e2fsprogs/Makefile.in	2005-05-02 21:24:28.000000000 +0200
@@ -37,7 +37,7 @@
 
 E2P_SRC_LIST := \
 	fgetflags.c fsetflags.c \
-	fgetversion.c fsetversion.c \
+	fgetsetversion.c \
 	pf.c iod.c
 E2P_SRC := $(patsubst %, $(E2FSPROGS_DIR)/e2p/%, $(E2P_SRC_LIST))
 $(E2FSPROGS_DIR)e2p.o: $(E2P_SRC)


More information about the busybox mailing list