diff options
author | Theodore Ts'o <tytso@mit.edu> | 1997-04-29 14:53:37 +0000 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 1997-04-29 14:53:37 +0000 |
commit | 1e3472c5f37ca3686dd69b079d4d02a302f5798d (patch) | |
tree | f8c01b8e3875f425d9de9b3ef6171f739d1273e8 /lib | |
parent | fc6d9d519aef67735918bf02c0fa8c9222008f76 (diff) | |
download | e2fsprogs-1e3472c5f37ca3686dd69b079d4d02a302f5798d.tar.gz |
Many files:
Checked in e2fsprogs 1.05
Diffstat (limited to 'lib')
62 files changed, 1854 insertions, 507 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 682e10c5..fe60daff 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,16 @@ +Wed Aug 28 15:20:26 1996 Miles Bader <miles@gnu.ai.mit.edu> + + * Makefile.elf-lib (installdirs-elf-lib): Renamed from installdirs + to avoid making random directories only neeeded when installing + normal libraries. + (install-shlibs): Use installdirs-elf-lib instead of installdirs. + +Thu May 23 12:40:12 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * Makefile.elf-lib: Install the .so files in /usr/lib, since the + .a files are stored there. (We were installing the .so + files in the wrong place before.) + Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> * Release of E2fsprogs version 1.04 diff --git a/lib/Makefile.elf-lib b/lib/Makefile.elf-lib index 83b59fc4..ff19bc91 100644 --- a/lib/Makefile.elf-lib +++ b/lib/Makefile.elf-lib @@ -31,15 +31,19 @@ $(ELF_LIB): $(OBJS) $(LN) ../$(ELF_LIB) ../$(ELF_IMAGE).so $(LN) ../$(ELF_LIB) ../$(ELF_SONAME) -installdirs:: - $(top_srcdir)/mkinstalldirs $(DESTDIR)$(ELF_INSTALL_DIR) +installdirs-elf-lib:: + $(top_srcdir)/mkinstalldirs $(DESTDIR)$(ELF_INSTALL_DIR) \ + $(DESTDIR)$(ulibdir) -install-shlibs install:: $(ELF_LIB) installdirs +installdirs:: installdirs-elf-lib + +install-shlibs install:: $(ELF_LIB) installdirs-elf-lib $(INSTALL_PROGRAM) $(ELF_LIB) $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB) $(STRIP) --strip-debug \ $(DESTDIR)$(DLL_INSTALL_DIR)/$(ELF_LIB) - $(LN) -sf $(ELF_LIB) $(DESTDIR)$(DLL_INSTALL_DIR)/$(ELF_SONAME) - $(LN) -sf $(ELF_SONAME) $(DESTDIR)$(DLL_INSTALL_DIR)/$(ELF_IMAGE).so + $(LN_S) -f $(ELF_LIB) $(DESTDIR)$(DLL_INSTALL_DIR)/$(ELF_SONAME) + $(LN_S) -f $(DLL_INSTALL_DIR)/$(ELF_SONAME) \ + $(DESTDIR)$(ulibdir)/$(ELF_IMAGE).so -ldconfig clean:: diff --git a/lib/do_substitute b/lib/do_substitute index 262609d2..e18c3f4b 100644 --- a/lib/do_substitute +++ b/lib/do_substitute @@ -10,6 +10,7 @@ $SED -e "s%@AWK@%$AWK%g" \ -e "s%@E2FSPROGS_MONTH@%$E2FSPROGS_MONTH%g" \ -e "s%@E2FSPROGS_YEAR@%$E2FSPROGS_YEAR%g" \ -e "s%@E2FSPROGS_VERSION@%$E2FSPROGS_VERSION%g" \ + -e "s%@SIZEOF_LONG_LONG@%$SIZEOF_LONG_LONG%g" \ -e "s%@SIZEOF_LONG@%$SIZEOF_LONG%g" \ -e "s%@SIZEOF_INT@%$SIZEOF_INT%g" \ -e "s%@SIZEOF_SHORT@%$SIZEOF_SHORT%g" \ diff --git a/lib/e2p/ChangeLog b/lib/e2p/ChangeLog index 2422e73d..fe4fa5e9 100644 --- a/lib/e2p/ChangeLog +++ b/lib/e2p/ChangeLog @@ -1,3 +1,20 @@ +Sat Sep 7 14:48:35 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ls.c (interval_string): Pretty print the check interval. + +Tue Aug 6 14:12:36 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ls.c (list_super): Display the OS, volume label, last mounted, + and UUID field if present. + +Mon Jun 24 09:55:58 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ps.c, pf.c, pe.c, ls.c, setversion.c, setflags.c, getversion.c, + fsetversion.c, fsetflags.c, fgetversion.c, fgetflags.c, + getflags.c: Remove include of ext2_fs.h, since it's + included by e2p.h; this also solves a sys/types.h vs + linux/types.h inclusion ordering problem with the GNU libc. + Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> * Release of E2fsprogs version 1.04 diff --git a/lib/e2p/MAKELOG b/lib/e2p/MAKELOG deleted file mode 100644 index 27e4420d..00000000 --- a/lib/e2p/MAKELOG +++ /dev/null @@ -1,181 +0,0 @@ -gcc -O2 -fomit-frame-pointer -I.. -c pe.c -In file included from pe.c:19: -/usr/include/linux/ext2_fs.h:127: parse error before `__u32' -/usr/include/linux/ext2_fs.h:127: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:128: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:129: parse error before `aclh_acle_count' -/usr/include/linux/ext2_fs.h:129: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:130: parse error before `aclh_first_acle' -/usr/include/linux/ext2_fs.h:130: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:135: parse error before `__u32' -/usr/include/linux/ext2_fs.h:135: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:136: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:137: parse error before `acle_type' -/usr/include/linux/ext2_fs.h:137: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:138: parse error before `acle_tag' -/usr/include/linux/ext2_fs.h:138: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:139: parse error before `acle_pad1' -/usr/include/linux/ext2_fs.h:139: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:140: parse error before `acle_next' -/usr/include/linux/ext2_fs.h:140: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:149: parse error before `__u32' -/usr/include/linux/ext2_fs.h:149: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:150: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:151: parse error before `bg_inode_table' -/usr/include/linux/ext2_fs.h:151: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:152: parse error before `bg_free_blocks_count' -/usr/include/linux/ext2_fs.h:152: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:153: parse error before `bg_free_inodes_count' -/usr/include/linux/ext2_fs.h:153: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:158: parse error before `__u32' -/usr/include/linux/ext2_fs.h:158: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:159: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:160: parse error before `bg_inode_table' -/usr/include/linux/ext2_fs.h:160: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:161: parse error before `bg_free_blocks_count' -/usr/include/linux/ext2_fs.h:161: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:162: parse error before `bg_free_inodes_count' -/usr/include/linux/ext2_fs.h:162: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:163: parse error before `bg_used_dirs_count' -/usr/include/linux/ext2_fs.h:163: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:164: parse error before `bg_pad' -/usr/include/linux/ext2_fs.h:164: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:165: parse error before `bg_reserved' -/usr/include/linux/ext2_fs.h:165: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:166: parse error before `}' -/usr/include/linux/ext2_fs.h:213: parse error before `__u16' -/usr/include/linux/ext2_fs.h:213: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:214: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:215: parse error before `i_size' -/usr/include/linux/ext2_fs.h:215: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:216: parse error before `i_atime' -/usr/include/linux/ext2_fs.h:216: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:217: parse error before `i_ctime' -/usr/include/linux/ext2_fs.h:217: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:218: parse error before `i_mtime' -/usr/include/linux/ext2_fs.h:218: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:219: parse error before `i_dtime' -/usr/include/linux/ext2_fs.h:219: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:220: parse error before `i_gid' -/usr/include/linux/ext2_fs.h:220: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:221: parse error before `i_links_count' -/usr/include/linux/ext2_fs.h:221: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:222: parse error before `i_blocks' -/usr/include/linux/ext2_fs.h:222: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:223: parse error before `i_flags' -/usr/include/linux/ext2_fs.h:223: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:226: parse error before `__u32' -/usr/include/linux/ext2_fs.h:226: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:226: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:227: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:229: parse error before `__u32' -/usr/include/linux/ext2_fs.h:229: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:230: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:232: parse error before `__u32' -/usr/include/linux/ext2_fs.h:232: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:233: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:234: parse error before `}' -/usr/include/linux/ext2_fs.h:234: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:235: parse error before `i_block' -/usr/include/linux/ext2_fs.h:235: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:236: parse error before `i_version' -/usr/include/linux/ext2_fs.h:236: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:237: parse error before `i_file_acl' -/usr/include/linux/ext2_fs.h:237: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:238: parse error before `i_dir_acl' -/usr/include/linux/ext2_fs.h:238: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:239: parse error before `i_faddr' -/usr/include/linux/ext2_fs.h:239: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:242: parse error before `__u8' -/usr/include/linux/ext2_fs.h:242: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:242: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:243: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:244: parse error before `i_pad1' -/usr/include/linux/ext2_fs.h:244: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:245: parse error before `l_i_reserved2' -/usr/include/linux/ext2_fs.h:245: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:246: parse error before `}' -/usr/include/linux/ext2_fs.h:246: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:248: parse error before `__u8' -/usr/include/linux/ext2_fs.h:248: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:249: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:250: parse error before `h_i_mode_high' -/usr/include/linux/ext2_fs.h:250: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:251: parse error before `h_i_uid_high' -/usr/include/linux/ext2_fs.h:251: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:252: parse error before `h_i_gid_high' -/usr/include/linux/ext2_fs.h:252: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:253: parse error before `h_i_author' -/usr/include/linux/ext2_fs.h:253: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:254: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:256: parse error before `__u8' -/usr/include/linux/ext2_fs.h:256: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:257: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:258: parse error before `m_pad1' -/usr/include/linux/ext2_fs.h:258: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:259: parse error before `m_i_reserved2' -/usr/include/linux/ext2_fs.h:259: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:260: parse error before `}' -/usr/include/linux/ext2_fs.h:260: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:261: parse error before `}' -/usr/include/linux/ext2_fs.h:261: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:262: parse error before `}' -/usr/include/linux/ext2_fs.h:329: parse error before `__u32' -/usr/include/linux/ext2_fs.h:329: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:330: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:331: parse error before `s_r_blocks_count' -/usr/include/linux/ext2_fs.h:331: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:332: parse error before `s_free_blocks_count' -/usr/include/linux/ext2_fs.h:332: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:333: parse error before `s_free_inodes_count' -/usr/include/linux/ext2_fs.h:333: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:334: parse error before `s_first_data_block' -/usr/include/linux/ext2_fs.h:334: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:335: parse error before `s_log_block_size' -/usr/include/linux/ext2_fs.h:335: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:336: parse error before `s_log_frag_size' -/usr/include/linux/ext2_fs.h:336: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:337: parse error before `s_blocks_per_group' -/usr/include/linux/ext2_fs.h:337: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:338: parse error before `s_frags_per_group' -/usr/include/linux/ext2_fs.h:338: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:339: parse error before `s_inodes_per_group' -/usr/include/linux/ext2_fs.h:339: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:340: parse error before `s_mtime' -/usr/include/linux/ext2_fs.h:340: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:341: parse error before `s_wtime' -/usr/include/linux/ext2_fs.h:341: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:342: parse error before `s_mnt_count' -/usr/include/linux/ext2_fs.h:342: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:343: parse error before `s_max_mnt_count' -/usr/include/linux/ext2_fs.h:343: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:344: parse error before `s_magic' -/usr/include/linux/ext2_fs.h:344: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:345: parse error before `s_state' -/usr/include/linux/ext2_fs.h:345: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:346: parse error before `s_errors' -/usr/include/linux/ext2_fs.h:346: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:347: parse error before `s_pad' -/usr/include/linux/ext2_fs.h:347: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:348: parse error before `s_lastcheck' -/usr/include/linux/ext2_fs.h:348: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:349: parse error before `s_checkinterval' -/usr/include/linux/ext2_fs.h:349: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:350: parse error before `s_creator_os' -/usr/include/linux/ext2_fs.h:350: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:351: parse error before `s_rev_level' -/usr/include/linux/ext2_fs.h:351: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:352: parse error before `s_def_resuid' -/usr/include/linux/ext2_fs.h:352: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:353: parse error before `s_def_resgid' -/usr/include/linux/ext2_fs.h:353: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:354: parse error before `s_reserved' -/usr/include/linux/ext2_fs.h:354: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:355: parse error before `}' -/usr/include/linux/ext2_fs.h:372: parse error before `__u32' -/usr/include/linux/ext2_fs.h:372: warning: no semicolon at end of struct or union -/usr/include/linux/ext2_fs.h:373: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:374: parse error before `name_len' -/usr/include/linux/ext2_fs.h:374: warning: data definition has no type or storage class -/usr/include/linux/ext2_fs.h:376: parse error before `}' -make: *** [pe.o] Error 1 diff --git a/lib/e2p/Makefile.in b/lib/e2p/Makefile.in index 97f3fbcc..4c433dcd 100644 --- a/lib/e2p/Makefile.in +++ b/lib/e2p/Makefile.in @@ -9,6 +9,7 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ top_builddir = ../.. +my_dir = lib/e2p INSTALL = @INSTALL@ @MCONFIG@ @@ -17,14 +18,15 @@ all:: OBJS= fgetflags.o fsetflags.o fgetversion.o fsetversion.o \ getflags.o getversion.o iod.o ls.o pe.o pf.o ps.o \ - setflags.o setversion.o + setflags.o setversion.o uuid.o SRCS= $(srcdir)/fgetflags.c $(srcdir)/fsetflags.c \ $(srcdir)/fgetversion.c $(srcdir)/fsetversion.c \ $(srcdir)/getflags.c $(srcdir)/getversion.c \ $(srcdir)/iod.c $(srcdir)/ls.c $(srcdir)/pe.c \ $(srcdir)/pf.c $(srcdir)/ps.c \ - $(srcdir)/setflags.c $(srcdir)/setversion.c + $(srcdir)/setflags.c $(srcdir)/setversion.c \ + $(srcdir)/uuid.c LIBRARY= libe2p LIBDIR= e2p @@ -38,7 +40,7 @@ DLL_STUB = libe2p DLL_MYDIR = e2p DLL_INSTALL_DIR = $(libdir) -ELF_VERSION = 2.1 +ELF_VERSION = 2.2 ELF_SO_VERSION = 2 ELF_IMAGE = libe2p ELF_MYDIR = e2p @@ -90,15 +92,16 @@ distclean:: clean # the Makefile.in file # fgetflags.o: $(srcdir)/fgetflags.c $(srcdir)/e2p.h -fsetflags.o: $(srcdir)/fsetflags.c $(srcdir)/e2p.h +fsetflags.o: $(srcdir)/fsetflags.c $(srcdir)/e2p.h fgetversion.o: $(srcdir)/fgetversion.c $(srcdir)/e2p.h fsetversion.o: $(srcdir)/fsetversion.c $(srcdir)/e2p.h getflags.o: $(srcdir)/getflags.c $(srcdir)/e2p.h getversion.o: $(srcdir)/getversion.c $(srcdir)/e2p.h iod.o: $(srcdir)/iod.c $(srcdir)/e2p.h -ls.o: $(srcdir)/ls.c $(srcdir)/e2p.h +ls.o: $(srcdir)/ls.c $(srcdir)/e2p.h pe.o: $(srcdir)/pe.c $(srcdir)/e2p.h pf.o: $(srcdir)/pf.c $(srcdir)/e2p.h ps.o: $(srcdir)/ps.c $(srcdir)/e2p.h setflags.o: $(srcdir)/setflags.c $(srcdir)/e2p.h setversion.o: $(srcdir)/setversion.c $(srcdir)/e2p.h +uuid.o: $(srcdir)/uuid.c diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h index dc2dbe57..fa4a03bd 100644 --- a/lib/e2p/e2p.h +++ b/lib/e2p/e2p.h @@ -19,3 +19,6 @@ void print_flags (FILE * f, unsigned long flags, int long_format); void print_fs_state (FILE * f, unsigned short state); int setflags (int fd, unsigned long flags); int setversion (int fd, unsigned long version); + +int e2p_is_null_uuid(void *uu); +void e2p_uuid_to_str(void *uu, char *out); diff --git a/lib/e2p/fgetflags.c b/lib/e2p/fgetflags.c index 099446d0..f01de269 100644 --- a/lib/e2p/fgetflags.c +++ b/lib/e2p/fgetflags.c @@ -27,8 +27,6 @@ #include <sys/ioctl.h> #endif -#include <linux/ext2_fs.h> - #include "e2p.h" int fgetflags (const char * name, unsigned long * flags) diff --git a/lib/e2p/fgetversion.c b/lib/e2p/fgetversion.c index ba4eec44..fea376b0 100644 --- a/lib/e2p/fgetversion.c +++ b/lib/e2p/fgetversion.c @@ -23,8 +23,6 @@ #include <fcntl.h> #include <sys/ioctl.h> -#include <linux/ext2_fs.h> - #include "e2p.h" int fgetversion (const char * name, unsigned long * version) diff --git a/lib/e2p/fsetflags.c b/lib/e2p/fsetflags.c index 06aabba4..92e558be 100644 --- a/lib/e2p/fsetflags.c +++ b/lib/e2p/fsetflags.c @@ -27,8 +27,6 @@ #include <sys/ioctl.h> #endif -#include <linux/ext2_fs.h> - #include "e2p.h" int fsetflags (const char * name, unsigned long flags) diff --git a/lib/e2p/fsetversion.c b/lib/e2p/fsetversion.c index 1443fb50..49c7c364 100644 --- a/lib/e2p/fsetversion.c +++ b/lib/e2p/fsetversion.c @@ -23,8 +23,6 @@ #include <fcntl.h> #include <sys/ioctl.h> -#include <linux/ext2_fs.h> - #include "e2p.h" int fsetversion (const char * name, unsigned long version) diff --git a/lib/e2p/getflags.c b/lib/e2p/getflags.c index ac014a70..8c476a37 100644 --- a/lib/e2p/getflags.c +++ b/lib/e2p/getflags.c @@ -23,8 +23,6 @@ #include <sys/ioctl.h> #endif -#include <linux/ext2_fs.h> - #include "e2p.h" int getflags (int fd, unsigned long * flags) diff --git a/lib/e2p/getversion.c b/lib/e2p/getversion.c index 309dfb6f..be76b60a 100644 --- a/lib/e2p/getversion.c +++ b/lib/e2p/getversion.c @@ -19,8 +19,6 @@ #endif #include <sys/ioctl.h> -#include <linux/ext2_fs.h> - #include "e2p.h" int getversion (int fd, unsigned long * version) diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c index 0bd217bc..55e0bbe6 100644 --- a/lib/e2p/ls.c +++ b/lib/e2p/ls.c @@ -9,16 +9,71 @@ * Public License */ +#include <stdio.h> #include <sys/types.h> +#include <string.h> #include <grp.h> #include <pwd.h> -#include <stdio.h> #include <time.h> -#include <linux/ext2_fs.h> - #include "e2p.h" +/* + * The ext2fs library private definition of the ext2 superblock, so we + * don't have to depend on the kernel's definition of the superblock, + * which might not have the latest features. + */ +struct ext2fs_sb { + __u32 s_inodes_count; /* Inodes count */ + __u32 s_blocks_count; /* Blocks count */ + __u32 s_r_blocks_count; /* Reserved blocks count */ + __u32 s_free_blocks_count; /* Free blocks count */ + __u32 s_free_inodes_count; /* Free inodes count */ + __u32 s_first_data_block; /* First Data Block */ + __u32 s_log_block_size; /* Block size */ + __s32 s_log_frag_size; /* Fragment size */ + __u32 s_blocks_per_group; /* # Blocks per group */ + __u32 s_frags_per_group; /* # Fragments per group */ + __u32 s_inodes_per_group; /* # Inodes per group */ + __u32 s_mtime; /* Mount time */ + __u32 s_wtime; /* Write time */ + __u16 s_mnt_count; /* Mount count */ + __s16 s_max_mnt_count; /* Maximal mount count */ + __u16 s_magic; /* Magic signature */ + __u16 s_state; /* File system state */ + __u16 s_errors; /* Behaviour when detecting errors */ + __u16 s_minor_rev_level; /* minor revision level */ + __u32 s_lastcheck; /* time of last check */ + __u32 s_checkinterval; /* max. time between checks */ + __u32 s_creator_os; /* OS */ + __u32 s_rev_level; /* Revision level */ + __u16 s_def_resuid; /* Default uid for reserved blocks */ + __u16 s_def_resgid; /* Default gid for reserved blocks */ + /* + * These fields are for EXT2_DYNAMIC_REV superblocks only. + * + * Note: the difference between the compatible feature set and + * the incompatible feature set is that if there is a bit set + * in the incompatible feature set that the kernel doesn't + * know about, it should refuse to mount the filesystem. + * + * e2fsck's requirements are more strict; if it doesn't know + * about a feature in either the compatible or incompatible + * feature set, it must abort and not try to meddle with + * things it doesn't understand... + */ + __u32 s_first_ino; /* First non-reserved inode */ + __u16 s_inode_size; /* size of inode structure */ + __u16 s_block_group_nr; /* block group # of this superblock */ + __u32 s_feature_compat; /* compatible feature set */ + __u32 s_feature_incompat; /* incompatible feature set */ + __u32 s_feature_ro_compat; /* readonly-compatible feature set */ + __u8 s_uuid[16]; /* 128-bit uuid for volume */ + char s_volume_name[16]; /* volume name */ + char s_last_mounted[64]; /* directory where last mounted */ + __u32 s_reserved[206]; /* Padding to the end of the block */ +}; + static void print_user (unsigned short uid) { struct passwd *pw; @@ -43,6 +98,51 @@ static void print_group (unsigned short gid) printf ("(group %s)\n", gr->gr_name); } +#define MONTH_INT (86400 * 30) +#define WEEK_INT (86400 * 7) +#define DAY_INT (86400) +#define HOUR_INT (60 * 60) +#define MINUTE_INT (60) + +static char *interval_string(unsigned int secs) +{ + static char buf[256], tmp[80]; + int hr, min, num; + + buf[0] = 0; + + if (secs >= MONTH_INT) { + num = secs / MONTH_INT; + secs -= num*MONTH_INT; + sprintf(buf, "%d month%s", num, (num>1) ? "s" : ""); + } + if (secs >= WEEK_INT) { + num = secs / WEEK_INT; + secs -= num*WEEK_INT; + sprintf(tmp, "%s%d week%s", buf[0] ? ", " : "", + num, (num>1) ? "s" : ""); + strcat(buf, tmp); + } + if (secs >= DAY_INT) { + num = secs / DAY_INT; + secs -= num*DAY_INT; + sprintf(tmp, "%s%d day%s", buf[0] ? ", " : "", + num, (num>1) ? "s" : ""); + strcat(buf, tmp); + } + if (secs > 0) { + hr = secs / HOUR_INT; + secs -= hr*HOUR_INT; + min = secs / MINUTE_INT; + secs -= min*MINUTE_INT; + sprintf(tmp, "%s%d:%02d:%02d", buf[0] ? ", " : "", + hr, min, secs); + strcat(buf, tmp); + } + return buf; +} + + #ifndef EXT2_INODE_SIZE #define EXT2_INODE_SIZE(s) sizeof(struct ext2_inode) #endif @@ -50,20 +150,43 @@ static void print_group (unsigned short gid) void list_super (struct ext2_super_block * s) { int inode_blocks_per_group; + struct ext2fs_sb *sb = (struct ext2fs_sb *) s; + char buf[80]; + const char *os; inode_blocks_per_group = (((s->s_inodes_per_group * EXT2_INODE_SIZE(s)) + EXT2_BLOCK_SIZE(s) - 1) / EXT2_BLOCK_SIZE(s)); - printf ("Filesystem magic number: 0x%04X\n", s->s_magic); printf ("Filesystem revision #: %d\n", s->s_rev_level); + if (sb->s_volume_name[0]) { + memset(buf, 0, sizeof(buf)); + strncpy(buf, sb->s_volume_name, sizeof(sb->s_volume_name)); + printf("Filesystem volume name: %s\n", buf); + } + if (sb->s_last_mounted[0]) { + memset(buf, 0, sizeof(buf)); + strncpy(buf, sb->s_last_mounted, sizeof(sb->s_last_mounted)); + printf("Last mounted on: %s\n", buf); + } + if (!e2p_is_null_uuid(sb->s_uuid)) { + e2p_uuid_to_str(sb->s_uuid, buf); + printf("Filesystem UUID: %s\n", buf); + } printf ("Filesystem state: "); print_fs_state (stdout, s->s_state); printf ("\n"); printf ("Errors behavior: "); print_fs_errors (stdout, s->s_errors); printf ("\n"); + switch (s->s_creator_os) { + case EXT2_OS_LINUX: os = "Linux"; break; + case EXT2_OS_HURD: os = "GNU"; break; + case EXT2_OS_MASIX: os = "Masix"; break; + default: os = "unknown"; break; + } + printf ("Filesystem OS type: %s\n", os); printf ("Inode count: %u\n", s->s_inodes_count); printf ("Block count: %u\n", s->s_blocks_count); printf ("Reserved block count: %u\n", s->s_r_blocks_count); @@ -81,7 +204,8 @@ void list_super (struct ext2_super_block * s) printf ("Mount count: %u\n", s->s_mnt_count); printf ("Maximum mount count: %d\n", s->s_max_mnt_count); printf ("Last checked: %s", ctime ((time_t *) &s->s_lastcheck)); - printf ("Check interval: %u\n", s->s_checkinterval); + printf ("Check interval: %u (%s)\n", s->s_checkinterval, + interval_string(s->s_checkinterval)); if (s->s_checkinterval) { time_t next; @@ -102,3 +226,7 @@ void list_super (struct ext2_super_block * s) } #endif } + + + + diff --git a/lib/e2p/pe.c b/lib/e2p/pe.c index efc74b3a..4cce6911 100644 --- a/lib/e2p/pe.c +++ b/lib/e2p/pe.c @@ -16,8 +16,6 @@ #include <stdio.h> -#include <linux/ext2_fs.h> - #include "e2p.h" void print_fs_errors (FILE * f, unsigned short errors) diff --git a/lib/e2p/pf.c b/lib/e2p/pf.c index e4f072f2..ec18dcb8 100644 --- a/lib/e2p/pf.c +++ b/lib/e2p/pf.c @@ -15,7 +15,6 @@ */ #include <stdio.h> -#include <linux/ext2_fs.h> #include "e2p.h" diff --git a/lib/e2p/ps.c b/lib/e2p/ps.c index 441d6dc8..bec8b419 100644 --- a/lib/e2p/ps.c +++ b/lib/e2p/ps.c @@ -16,8 +16,6 @@ #include <stdio.h> -#include <linux/ext2_fs.h> - #include "e2p.h" void print_fs_state (FILE * f, unsigned short state) diff --git a/lib/e2p/setflags.c b/lib/e2p/setflags.c index 06f127f2..654ec9dc 100644 --- a/lib/e2p/setflags.c +++ b/lib/e2p/setflags.c @@ -24,8 +24,6 @@ #include <sys/ioctl.h> #endif -#include <linux/ext2_fs.h> - #include "e2p.h" int setflags (int fd, unsigned long flags) diff --git a/lib/e2p/setversion.c b/lib/e2p/setversion.c index f2c48cd9..3210f514 100644 --- a/lib/e2p/setversion.c +++ b/lib/e2p/setversion.c @@ -19,8 +19,6 @@ #endif #include <sys/ioctl.h> -#include <linux/ext2_fs.h> - #include "e2p.h" int setversion (int fd, unsigned long version) diff --git a/lib/e2p/uuid.c b/lib/e2p/uuid.c new file mode 100644 index 00000000..82462e83 --- /dev/null +++ b/lib/e2p/uuid.c @@ -0,0 +1,65 @@ +/* + * uuid.c -- utility routines for manipulating UUID's. + */ + +#include <stdio.h> +#include <linux/types.h> + +struct uuid { + __u32 time_low; + __u16 time_mid; + __u16 time_hi_and_version; + __u16 clock_seq; + __u8 node[6]; +}; + +/* Returns 1 if the uuid is the NULL uuid */ +int e2p_is_null_uuid(void *uu) +{ + __u8 *cp; + int i; + + for (i=0, cp = uu; i < 16; i++) + if (*cp) + return 0; + return 1; +} + +static void e2p_unpack_uuid(void *in, struct uuid *uu) +{ + __u8 *ptr = in; + __u32 tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_low = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_mid = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_hi_and_version = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->clock_seq = tmp; + + memcpy(uu->node, ptr, 6); +} + +void e2p_uuid_to_str(void *uu, char *out) +{ + struct uuid uuid; + + e2p_unpack_uuid(uu, &uuid); + sprintf(out, + "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, + uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, + uuid.node[0], uuid.node[1], uuid.node[2], + uuid.node[3], uuid.node[4], uuid.node[5]); +} diff --git a/lib/et/Makefile.in b/lib/et/Makefile.in index 49c4fca9..627ef4d9 100644 --- a/lib/et/Makefile.in +++ b/lib/et/Makefile.in @@ -6,6 +6,7 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ top_builddir = ../.. +my_dir = lib/ss INSTALL = @INSTALL@ @MCONFIG@ diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 90de2b5e..41c9c54e 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,87 @@ +Sat Sep 7 07:36:03 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * initialize.c: Override the kernel's idea of default + checkinterval from 0 (never) to 180 days. + +Wed Aug 28 03:20:03 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * namei.c (ext2fs_namei_follow): New function which follows + symbolic link (if any) at the target. + +Tue Aug 27 01:48:43 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * inode.c (ext2fs_read_inode, ext2fs_write_inode): Add support + for shortcut function fs->read_inode() and fs->write_inode(). + Added inode_cache to reduce CPU time spent in doing + byte swapping. + + * swapfs.c (ext2fs_swap_super): Swap the new fields in a V2 + superblock. + + * namei.c (ext2fs_follow_link): New function. + (ext2fs_namei): Extended to have support for chasing + symbolic links. ext2fs_namei() still returns an inode + which is a symbolic link. Symbolic links are only chased + while resolving the containing directory. To chase + symbolic links of the final result, use + ext2fs_follow_link(). + +Mon Aug 26 23:46:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ext2_err.et.in: Added new error code EXT2_ET_SYMLINK_LOOP. + + * bitops.h (ext2fs_set_bit, ext2fs_celar_bit): Use asm inlines + provided by Pete A. Zaitcev (zaitcev@lab.sun.mcst.ru). + +Thu Aug 22 00:40:18 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * initialize.c (ext2fs_initialize): On systems where the byte + order is not i386 compatible, set the swap_byte flag. + + * inode.c (inocpy_with_swap): Check to see if inode contains a + fast symlink before swapping the inode block fields. This + required adding a new argument to inocpy_with_swap to + determine whether the mode field is in host order or not. + +Wed Aug 21 00:45:42 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * bitops.h (ext2fs_set_bit, ext2fs_clear_bit, ext2fs_test_bit): On + the sparc, if EXT2_STD_BITOPS set, use the standard + i386-compatible bitmask operations, instead on the + non-standard native bitmask operators. + +Fri Aug 9 11:11:35 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * block.c (ext2fs_block_iterate): Cause block iterator to return + the HURD translator block (along with everything else). + If the flag BLOCK_FLAG_DATA_ONLY is passed to the block + iterator, then don't return any meta data blocks + (including the HURD translator). + +Wed Jul 17 17:13:34 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * gen_uuid.c: New file, which generates DCE-compatible UUIDs. + + * uuid.c: New file, containing UUID utility functions. + +Tue Jul 16 10:19:16 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ext2fs.h: Add a definition of the "real" ext2 superblock. + +Fri May 24 14:54:55 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * ext2fs.h: Fix erroneous ino_t type used in block_bitmap type. + +Sun May 19 15:39:03 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * openfs.c (ext2fs_open): If the blocksize in the superblock is + zero, return the error EXT2_ET_CORRUPT_SUPERBLOCK, since + that's a basic value that must be correct for the rest of + the library to work. + + * ext2_err.et.in (EXT2_ET_CORRUPT_SUPERBLOCK): Added new error + code. + Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> * Release of E2fsprogs version 1.04 diff --git a/lib/ext2fs/Makefile.in b/lib/ext2fs/Makefile.in index 26669779..5319ce51 100644 --- a/lib/ext2fs/Makefile.in +++ b/lib/ext2fs/Makefile.in @@ -2,6 +2,7 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ top_builddir = ../.. +my_dir = lib/ext2fs INSTALL = @INSTALL@ @MCONFIG@ @@ -29,6 +30,7 @@ OBJS= ext2_err.o \ llseek.o \ mkdir.o \ namei.o \ + native.o \ newdir.o \ openfs.o \ read_bb.o \ @@ -60,6 +62,7 @@ SRCS= ext2_err.c \ $(srcdir)/llseek.c \ $(srcdir)/mkdir.c \ $(srcdir)/namei.c \ + $(srcdir)/native.c \ $(srcdir)/newdir.c \ $(srcdir)/openfs.c \ $(srcdir)/read_bb.c \ @@ -83,7 +86,7 @@ DLL_LIBS = -L../.. -lcom_err DLL_MYDIR = ext2fs DLL_INSTALL_DIR = $(libdir) -ELF_VERSION = 2.0 +ELF_VERSION = 2.1 ELF_SO_VERSION = 2 ELF_IMAGE = libext2fs ELF_MYDIR = ext2fs @@ -154,88 +157,90 @@ distclean:: clean # the Makefile.in file # ext2_err.o: ext2_err.c -alloc.o: $(srcdir)/alloc.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h +alloc.o: $(srcdir)/alloc.c $(srcdir)/ext2fs.h $(top_srcdir)/lib/et/com_err.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h badblocks.o: $(srcdir)/badblocks.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h bb_inode.o: $(srcdir)/bb_inode.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h bitmaps.o: $(srcdir)/bitmaps.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h bitops.o: $(srcdir)/bitops.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h block.o: $(srcdir)/block.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h check_desc.o: $(srcdir)/check_desc.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h closefs.o: $(srcdir)/closefs.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h cmp_bitmaps.o: $(srcdir)/cmp_bitmaps.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h dirblock.o: $(srcdir)/dirblock.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h expanddir.o: $(srcdir)/expanddir.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h freefs.o: $(srcdir)/freefs.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h get_pathname.o: $(srcdir)/get_pathname.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h getsize.o: $(srcdir)/getsize.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h initialize.o: $(srcdir)/initialize.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h inline.o: $(srcdir)/inline.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h inode.o: $(srcdir)/inode.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h ismounted.o: $(srcdir)/ismounted.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h link.o: $(srcdir)/link.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h -llseek.o: $(srcdir)/llseek.c $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h +llseek.o: $(srcdir)/llseek.c $(top_srcdir)/lib/et/com_err.h \ + $(srcdir)/io.h mkdir.o: $(srcdir)/mkdir.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h namei.o: $(srcdir)/namei.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h +native.o: $(srcdir)/native.c $(srcdir)/ext2fs.h \ + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h newdir.o: $(srcdir)/newdir.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h openfs.o: $(srcdir)/openfs.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h read_bb.o: $(srcdir)/read_bb.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h read_bb_file.o: $(srcdir)/read_bb_file.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h rw_bitmaps.o: $(srcdir)/rw_bitmaps.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h swapfs.o: $(srcdir)/swapfs.c $(srcdir)/ext2fs.h \ - $(top_srcdir)/lib/et/com_err.h $(srcdir)/io.h \ - $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/bitops.h + $(top_srcdir)/lib/et/com_err.h $(srcdir)/bitops.h \ + $(srcdir)/io.h $(top_builddir)/lib/ext2fs/ext2_err.h unix_io.o: $(srcdir)/unix_io.c $(top_srcdir)/lib/et/com_err.h \ $(top_builddir)/lib/ext2fs/ext2_err.h $(srcdir)/io.h - diff --git a/lib/ext2fs/bitmaps.c b/lib/ext2fs/bitmaps.c index d5ef0ec7..7aaf5496 100644 --- a/lib/ext2fs/bitmaps.c +++ b/lib/ext2fs/bitmaps.c @@ -22,27 +22,25 @@ #include "ext2fs.h" -errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, - const char *descr, - ext2fs_inode_bitmap *ret) +errcode_t ext2fs_allocate_generic_bitmap(__u32 start, + __u32 end, + __u32 real_end, + const char *descr, + ext2fs_generic_bitmap *ret) { ext2fs_inode_bitmap bitmap; int size; - EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); - - fs->write_bitmaps = ext2fs_write_bitmaps; - - bitmap = malloc(sizeof(struct ext2fs_struct_inode_bitmap)); + bitmap = malloc(sizeof(struct ext2fs_struct_generic_bitmap)); if (!bitmap) return ENOMEM; - bitmap->magic = EXT2_ET_MAGIC_INODE_BITMAP; - bitmap->fs = fs; - bitmap->start = 1; - bitmap->end = fs->super->s_inodes_count; - bitmap->real_end = (EXT2_INODES_PER_GROUP(fs->super) - * fs->group_desc_count); + bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP; + bitmap->fs = NULL; + bitmap->start = start; + bitmap->end = end; + bitmap->real_end = real_end; + bitmap->base_error_code = EXT2_ET_BAD_GENERIC_MARK; if (descr) { bitmap->description = malloc(strlen(descr)+1); if (!bitmap->description) { @@ -66,46 +64,61 @@ errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, return 0; } +errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, + const char *descr, + ext2fs_inode_bitmap *ret) +{ + ext2fs_inode_bitmap bitmap; + errcode_t retval; + __u32 start, end, real_end; + + EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + + fs->write_bitmaps = ext2fs_write_bitmaps; + + start = 1; + end = fs->super->s_inodes_count; + real_end = (EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count); + + retval = ext2fs_allocate_generic_bitmap(start, end, real_end, + descr, &bitmap); + if (retval) + return retval; + + bitmap->magic = EXT2_ET_MAGIC_INODE_BITMAP; + bitmap->fs = fs; + bitmap->base_error_code = EXT2_ET_BAD_INODE_MARK; + + *ret = bitmap; + return 0; +} + errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs, const char *descr, ext2fs_block_bitmap *ret) { ext2fs_block_bitmap bitmap; - int size; + errcode_t retval; + __u32 start, end, real_end; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); fs->write_bitmaps = ext2fs_write_bitmaps; - bitmap = malloc(sizeof(struct ext2fs_struct_inode_bitmap)); - if (!bitmap) - return ENOMEM; + start = fs->super->s_first_data_block; + end = fs->super->s_blocks_count-1; + real_end = (EXT2_BLOCKS_PER_GROUP(fs->super) + * fs->group_desc_count)-1 + start; + + retval = ext2fs_allocate_generic_bitmap(start, end, real_end, + descr, &bitmap); + if (retval) + return retval; bitmap->magic = EXT2_ET_MAGIC_BLOCK_BITMAP; bitmap->fs = fs; - bitmap->start = fs->super->s_first_data_block; - bitmap->end = fs->super->s_blocks_count-1; - bitmap->real_end = (EXT2_BLOCKS_PER_GROUP(fs->super) - * fs->group_desc_count)-1 + bitmap->start; - if (descr) { - bitmap->description = malloc(strlen(descr)+1); - if (!bitmap->description) { - free(bitmap); - return ENOMEM; - } - strcpy(bitmap->description, descr); - } else - bitmap->description = 0; - - size = ((bitmap->real_end - bitmap->start) / 8) + 1; - bitmap->bitmap = malloc(size); - if (!bitmap->bitmap) { - free(bitmap->description); - free(bitmap); - return ENOMEM; - } - - memset(bitmap->bitmap, 0, size); + bitmap->base_error_code = EXT2_ET_BAD_BLOCK_MARK; + *ret = bitmap; return 0; } diff --git a/lib/ext2fs/bitops.c b/lib/ext2fs/bitops.c index da69e3b2..6f256e5c 100644 --- a/lib/ext2fs/bitops.c +++ b/lib/ext2fs/bitops.c @@ -72,3 +72,13 @@ void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg, com_err(0, errcode, "#%u", arg); } +void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap, + int code, unsigned long arg) +{ + if (bitmap->description) + com_err(0, bitmap->base_error_code+code, + "#%u for %s", arg, bitmap->description); + else + com_err(0, bitmap->base_error_code + code, "#%u", arg); +} + diff --git a/lib/ext2fs/bitops.h b/lib/ext2fs/bitops.h index e98e2d26..e967c876 100644 --- a/lib/ext2fs/bitops.h +++ b/lib/ext2fs/bitops.h @@ -27,6 +27,8 @@ extern const char *ext2fs_unmark_string; extern const char *ext2fs_test_string; extern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg, const char *description); +extern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap, + int code, unsigned long arg); extern void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block); extern void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, @@ -172,6 +174,84 @@ _INLINE_ int ext2fs_test_bit(int nr, const void * addr) #define _EXT2_HAVE_ASM_BITOPS_ +#ifndef EXT2_OLD_BITOPS + +/* + * Do the bitops so that we are compatible with the standard i386 + * convention. + */ + +_INLINE_ int ext2fs_set_bit(int nr,void * addr) +{ +#if 1 + int mask; + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + mask = 1 << (nr & 0x07); + __asm__ __volatile__("ldub [%0], %%g6\n\t" + "or %%g6, %2, %%g5\n\t" + "stb %%g5, [%0]\n\t" + "and %%g6, %2, %0\n" + : "=&r" (ADDR) + : "0" (ADDR), "r" (mask) + : "g5", "g6"); + return (int) ADDR; +#else + int mask, retval; + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + mask = 1 << (nr & 0x07); + retval = (mask & *ADDR) != 0; + *ADDR |= mask; + return retval; +#endif +} + +_INLINE_ int ext2fs_clear_bit(int nr, void * addr) +{ +#if 1 + int mask; + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + mask = 1 << (nr & 0x07); + __asm__ __volatile__("ldub [%0], %%g6\n\t" + "andn %%g6, %2, %%g5\n\t" + "stb %%g5, [%0]\n\t" + "and %%g6, %2, %0\n" + : "=&r" (ADDR) + : "0" (ADDR), "r" (mask) + : "g5", "g6"); + return (int) ADDR; + +#else + int mask, retval; + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + mask = 1 << (nr & 0x07); + retval = (mask & *ADDR) != 0; + *ADDR &= ~mask; + return retval; +#endif +} + +_INLINE_ int ext2fs_test_bit(int nr, const void * addr) +{ + int mask; + const unsigned char *ADDR = (const unsigned char *) addr; + + ADDR += nr >> 3; + mask = 1 << (nr & 0x07); + return ((mask & *ADDR) != 0); +} + +#else + +/* Do things the old, unplesant way. */ + _INLINE_ int ext2fs_set_bit(int nr, void *addr) { int mask, retval; @@ -205,6 +285,7 @@ _INLINE_ int ext2fs_test_bit(int nr, const void *addr) mask = 1 << (nr & 31); return ((mask & *ADDR) != 0); } +#endif #endif /* __sparc__ */ @@ -223,70 +304,72 @@ _INLINE_ __u32 ext2fs_swab32(__u32 val) #endif /* !_EXT2_HAVE_ASM_SWAB */ -_INLINE_ void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, - blk_t block) +_INLINE_ void ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap, + __u32 bitno) { - if ((block < bitmap->start) || (block > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block, - bitmap->description); + if ((bitno < bitmap->start) || (bitno > bitmap->end)) { + ext2fs_warn_bitmap2(bitmap, EXT2FS_MARK_ERROR, bitno); return; } - ext2fs_set_bit(block - bitmap->start, bitmap->bitmap); + ext2fs_set_bit(bitno - bitmap->start, bitmap->bitmap); } -_INLINE_ void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, - blk_t block) +_INLINE_ void ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno) { - if ((block < bitmap->start) || (block > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, - block, bitmap->description); + if ((bitno < bitmap->start) || (bitno > bitmap->end)) { + ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno); return; } - ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap); + ext2fs_clear_bit(bitno - bitmap->start, bitmap->bitmap); } -_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, - blk_t block) +_INLINE_ int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno) { - if ((block < bitmap->start) || (block > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST, - block, bitmap->description); + if ((bitno < bitmap->start) || (bitno > bitmap->end)) { + ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno); return 0; } - return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap); + return ext2fs_test_bit(bitno - bitmap->start, bitmap->bitmap); +} + +_INLINE_ void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); } _INLINE_ void ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode) { - if ((inode < bitmap->start) || (inode > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK, - inode, bitmap->description); - return; - } - ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap); + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); } _INLINE_ void ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode) { - if ((inode < bitmap->start) || (inode > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK, - inode, bitmap->description); - return; - } - ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap); + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); } _INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode) { - if ((inode < bitmap->start) || (inode > bitmap->end)) { - ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST, - inode, bitmap->description); - return 0; - } - return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap); + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); } _INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap, diff --git a/lib/ext2fs/block.c b/lib/ext2fs/block.c index fe112b31..51385345 100644 --- a/lib/ext2fs/block.c +++ b/lib/ext2fs/block.c @@ -39,8 +39,10 @@ static int block_iterate_ind(blk_t *ind_block, struct block_context *ctx) int i, flags, limit; blk_t *block_nr; - if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE)) - ret = (*ctx->func)(ctx->fs, ind_block, -1, ctx->private); + if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY)) + ret = (*ctx->func)(ctx->fs, ind_block, + BLOCK_COUNT_IND, ctx->private); if (!*ind_block || (ret & BLOCK_ABORT)) return ret; if (*ind_block >= ctx->fs->super->s_blocks_count || @@ -56,7 +58,8 @@ static int block_iterate_ind(blk_t *ind_block, struct block_context *ctx) return ret; } limit = ctx->fs->blocksize >> 2; - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) { block_nr = (blk_t *) ctx->ind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -86,7 +89,8 @@ static int block_iterate_ind(blk_t *ind_block, struct block_context *ctx) } } if (changed & BLOCK_CHANGED) { - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) { block_nr = (blk_t *) ctx->ind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -97,8 +101,10 @@ static int block_iterate_ind(blk_t *ind_block, struct block_context *ctx) ret |= BLOCK_ERROR | BLOCK_ABORT; } if ((ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY) && !(ret & BLOCK_ABORT)) - ret |= (*ctx->func)(ctx->fs, ind_block, -1, ctx->private); + ret |= (*ctx->func)(ctx->fs, ind_block, + BLOCK_COUNT_IND, ctx->private); return ret; } @@ -108,8 +114,10 @@ static int block_iterate_dind(blk_t *dind_block, struct block_context *ctx) int i, flags, limit; blk_t *block_nr; - if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE)) - ret = (*ctx->func)(ctx->fs, dind_block, -2, ctx->private); + if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY)) + ret = (*ctx->func)(ctx->fs, dind_block, + BLOCK_COUNT_DIND, ctx->private); if (!*dind_block || (ret & BLOCK_ABORT)) return ret; if (*dind_block >= ctx->fs->super->s_blocks_count || @@ -125,7 +133,8 @@ static int block_iterate_dind(blk_t *dind_block, struct block_context *ctx) return ret; } limit = ctx->fs->blocksize >> 2; - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) { block_nr = (blk_t *) ctx->dind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -153,7 +162,8 @@ static int block_iterate_dind(blk_t *dind_block, struct block_context *ctx) } } if (changed & BLOCK_CHANGED) { - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) { block_nr = (blk_t *) ctx->dind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -164,8 +174,10 @@ static int block_iterate_dind(blk_t *dind_block, struct block_context *ctx) ret |= BLOCK_ERROR | BLOCK_ABORT; } if ((ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY) && !(ret & BLOCK_ABORT)) - ret |= (*ctx->func)(ctx->fs, dind_block, -2, ctx->private); + ret |= (*ctx->func)(ctx->fs, dind_block, + BLOCK_COUNT_DIND, ctx->private); return ret; } @@ -175,8 +187,10 @@ static int block_iterate_tind(blk_t *tind_block, struct block_context *ctx) int i, flags, limit; blk_t *block_nr; - if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE)) - ret = (*ctx->func)(ctx->fs, tind_block, -3, ctx->private); + if (!(ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY)) + ret = (*ctx->func)(ctx->fs, tind_block, + BLOCK_COUNT_TIND, ctx->private); if (!*tind_block || (ret & BLOCK_ABORT)) return ret; if (*tind_block >= ctx->fs->super->s_blocks_count || @@ -192,7 +206,8 @@ static int block_iterate_tind(blk_t *tind_block, struct block_context *ctx) return ret; } limit = ctx->fs->blocksize >> 2; - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) { block_nr = (blk_t *) ctx->tind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -220,7 +235,8 @@ static int block_iterate_tind(blk_t *tind_block, struct block_context *ctx) } } if (changed & BLOCK_CHANGED) { - if (ctx->fs->flags & EXT2_SWAP_BYTES) { + if ((ctx->fs->flags & EXT2_SWAP_BYTES) || + (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) { block_nr = (blk_t *) ctx->tind_buf; for (i = 0; i < limit; i++, block_nr++) *block_nr = ext2fs_swab32(*block_nr); @@ -231,8 +247,10 @@ static int block_iterate_tind(blk_t *tind_block, struct block_context *ctx) ret |= BLOCK_ERROR | BLOCK_ABORT; } if ((ctx->flags & BLOCK_FLAG_DEPTH_TRAVERSE) && + !(ctx->flags & BLOCK_FLAG_DATA_ONLY) && !(ret & BLOCK_ABORT)) - ret |= (*ctx->func)(ctx->fs, tind_block, -3, ctx->private); + ret |= (*ctx->func)(ctx->fs, tind_block, + BLOCK_COUNT_TIND, ctx->private); return ret; } @@ -248,6 +266,7 @@ errcode_t ext2fs_block_iterate(ext2_filsys fs, void *private) { int i; + int got_inode = 0; int ret = 0; struct block_context ctx; blk_t blocks[EXT2_N_BLOCKS]; /* directory data blocks */ @@ -274,7 +293,26 @@ errcode_t ext2fs_block_iterate(ext2_filsys fs, } ctx.dind_buf = ctx.ind_buf + fs->blocksize; ctx.tind_buf = ctx.dind_buf + fs->blocksize; + + /* + * Iterate over the HURD translator block (if present) + */ + if ((fs->super->s_creator_os == EXT2_OS_HURD) && + !(flags & BLOCK_FLAG_DATA_ONLY) && + inode.osd1.hurd1.h_i_translator) { + ctx.errcode = ext2fs_read_inode(fs, ino, &inode); + if (ctx.errcode) + goto abort; + got_inode = 1; + ret |= (*func)(fs, &inode.osd1.hurd1.h_i_translator, + BLOCK_COUNT_TRANSLATOR, private); + if (ret & BLOCK_ABORT) + goto abort; + } + /* + * Iterate over normal data blocks + */ for (i = 0; i < EXT2_NDIR_BLOCKS ; i++, ctx.bcount++) { if (blocks[i] || (flags & BLOCK_FLAG_APPEND)) { ret |= (*func)(fs, &blocks[i], ctx.bcount, private); @@ -292,14 +330,19 @@ errcode_t ext2fs_block_iterate(ext2_filsys fs, if (ret & BLOCK_ABORT) goto abort; } - if (*(blocks + EXT2_TIND_BLOCK) || (flags & BLOCK_FLAG_APPEND)) + if (*(blocks + EXT2_TIND_BLOCK) || (flags & BLOCK_FLAG_APPEND)) { ret |= block_iterate_tind(blocks + EXT2_TIND_BLOCK, &ctx); + if (ret & BLOCK_ABORT) + goto abort; + } abort: if (ret & BLOCK_CHANGED) { - retval = ext2fs_read_inode(fs, ino, &inode); - if (retval) - return retval; + if (!got_inode) { + retval = ext2fs_read_inode(fs, ino, &inode); + if (retval) + return retval; + } for (i=0; i < EXT2_N_BLOCKS; i++) inode.i_block[i] = blocks[i]; retval = ext2fs_write_inode(fs, ino, &inode); diff --git a/lib/ext2fs/dirblock.c b/lib/ext2fs/dirblock.c index bb2f7175..3d5dbb2b 100644 --- a/lib/ext2fs/dirblock.c +++ b/lib/ext2fs/dirblock.c @@ -27,7 +27,7 @@ errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block, retval = io_channel_read_blk(fs->io, block, 1, buf); if (retval) return retval; - if ((fs->flags & EXT2_SWAP_BYTES) == 0) + if ((fs->flags & (EXT2_SWAP_BYTES|EXT2_SWAP_BYTES_READ)) == 0) return 0; p = buf; end = (char *) buf + fs->blocksize; @@ -49,7 +49,8 @@ errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block, char *buf = 0; struct ext2_dir_entry *dirent; - if (fs->flags & EXT2_SWAP_BYTES) { + if ((fs->flags & EXT2_SWAP_BYTES) || + (fs->flags & EXT2_SWAP_BYTES_WRITE)) { write_buf = buf = malloc(fs->blocksize); if (!buf) return ENOMEM; diff --git a/lib/ext2fs/ext2_err.et.in b/lib/ext2fs/ext2_err.et.in index 71153ce9..81e0c1ee 100644 --- a/lib/ext2fs/ext2_err.et.in +++ b/lib/ext2fs/ext2_err.et.in @@ -34,8 +34,8 @@ ec EXT2_ET_MAGIC_BLOCK_BITMAP, ec EXT2_ET_MAGIC_INODE_BITMAP, "Wrong magic number for inode_bitmap structure" -ec EXT2_ET_MAGIC_RESERVED_1, - "Wrong magic number --- RESERVED_1" +ec EXT2_ET_MAGIC_GENERIC_BITMAP, + "Wrong magic number for generic_bitmap structure" ec EXT2_ET_MAGIC_RESERVED_2, "Wrong magic number --- RESERVED_2" @@ -191,7 +191,24 @@ ec EXT2_ET_BAD_DEVICE_NAME, "Illegal or malformed device name" ec EXT2_ET_MISSING_INODE_TABLE, - "A block group is missing an inode table." + "A block group is missing an inode table" - end +ec EXT2_ET_CORRUPT_SUPERBLOCK, + "The ext2 superblock is corrupt" + +ec EXT2_ET_BAD_GENERIC_MARK, + "Illegal generic bit number passed to ext2fs_mark_generic_bitmap" + +ec EXT2_ET_BAD_GENERIC_UNMARK, + "Illegal generic bit number passed to ext2fs_unmark_generic_bitmap" + +ec EXT2_ET_BAD_GENERIC_TEST, + "Illegal generic bit number passed to ext2fs_test_generic_bitmap" +ec EXT2_ET_SYMLINK_LOOP, + "Too many symbolic links encountered." + +ec EXT2_ET_CALLBACK_NOTHANDLED, + "The callback function will not handle this case" + + end diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 73194c03..f3857704 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -21,6 +21,7 @@ */ #define EXT2_LIB_CURRENT_REV 0 +#include <sys/types.h> #include <linux/types.h> typedef __u32 blk_t; @@ -32,29 +33,26 @@ typedef unsigned int dgrp_t; typedef struct struct_ext2_filsys *ext2_filsys; -struct ext2fs_struct_inode_bitmap { - int magic; - ext2_filsys fs; - ino_t start, end; - ino_t real_end; - char *description; - char *bitmap; - int reserved[8]; +struct ext2fs_struct_generic_bitmap { + int magic; + ext2_filsys fs; + __u32 start, end; + __u32 real_end; + char * description; + char * bitmap; + errcode_t base_error_code; + __u32 reserved[7]; }; -typedef struct ext2fs_struct_inode_bitmap *ext2fs_inode_bitmap; +#define EXT2FS_MARK_ERROR 0 +#define EXT2FS_UNMARK_ERROR 1 +#define EXT2FS_TEST_ERROR 2 -struct ext2fs_struct_block_bitmap { - int magic; - ext2_filsys fs; - blk_t start, end; - ino_t real_end; - char *description; - char *bitmap; - int reserved[8]; -}; +typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap; -typedef struct ext2fs_struct_block_bitmap *ext2fs_block_bitmap; +typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap; + +typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap; #ifdef EXT2_DYNAMIC_REV #define EXT2_FIRST_INODE(s) EXT2_FIRST_INO(s) @@ -74,6 +72,8 @@ typedef struct ext2fs_struct_block_bitmap *ext2fs_block_bitmap; #define EXT2_FLAG_IB_DIRTY 0x10 #define EXT2_FLAG_BB_DIRTY 0x20 #define EXT2_SWAP_BYTES 0x40 +#define EXT2_SWAP_BYTES_READ 0x80 +#define EXT2_SWAP_BYTES_WRITE 0x100 /* * Special flag in the ext2 inode i_flag field that means that this is @@ -98,7 +98,11 @@ struct struct_ext2_filsys { errcode_t (*get_blocks)(ext2_filsys fs, ino_t ino, blk_t *blocks); errcode_t (*check_directory)(ext2_filsys fs, ino_t ino); errcode_t (*write_bitmaps)(ext2_filsys fs); - int reserved[16]; + errcode_t (*read_inode)(ext2_filsys fs, ino_t ino, + struct ext2_inode *inode); + errcode_t (*write_inode)(ext2_filsys fs, ino_t ino, + struct ext2_inode *inode); + __u32 reserved[14]; /* * Not used by ext2fs library; reserved for the use of the @@ -156,10 +160,22 @@ struct struct_badblocks_iterate { * of the blocks containined in the indirect blocks are processed. * This is useful if you are going to be deallocating blocks from an * inode. + * + * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be + * called for data blocks only. */ #define BLOCK_FLAG_APPEND 1 #define BLOCK_FLAG_HOLE 1 #define BLOCK_FLAG_DEPTH_TRAVERSE 2 +#define BLOCK_FLAG_DATA_ONLY 4 + +/* + * Magic "block count" return values for the block iterator function. + */ +#define BLOCK_COUNT_IND (-1) +#define BLOCK_COUNT_DIND (-2) +#define BLOCK_COUNT_TIND (-3) +#define BLOCK_COUNT_TRANSLATOR (-4) /* * Return flags for the directory iterator functions @@ -224,6 +240,21 @@ struct ext2_struct_inode_scan { #define LINUX_S_ISGID 0002000 #define LINUX_S_ISVTX 0001000 +#define LINUX_S_IRWXU 00700 +#define LINUX_S_IRUSR 00400 +#define LINUX_S_IWUSR 00200 +#define LINUX_S_IXUSR 00100 + +#define LINUX_S_IRWXG 00070 +#define LINUX_S_IRGRP 00040 +#define LINUX_S_IWGRP 00020 +#define LINUX_S_IXGRP 00010 + +#define LINUX_S_IRWXO 00007 +#define LINUX_S_IROTH 00004 +#define LINUX_S_IWOTH 00002 +#define LINUX_S_IXOTH 00001 + #define LINUX_S_ISLNK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK) #define LINUX_S_ISREG(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFREG) #define LINUX_S_ISDIR(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR) @@ -238,6 +269,63 @@ struct ext2_struct_inode_scan { #define EXT2_CHECK_MAGIC(struct, code) \ if ((struct)->magic != (code)) return (code) + + +/* + * The ext2fs library private definition of the ext2 superblock, so we + * don't have to depend on the kernel's definition of the superblock, + * which might not have the latest features. + */ +struct ext2fs_sb { + __u32 s_inodes_count; /* Inodes count */ + __u32 s_blocks_count; /* Blocks count */ + __u32 s_r_blocks_count; /* Reserved blocks count */ + __u32 s_free_blocks_count; /* Free blocks count */ + __u32 s_free_inodes_count; /* Free inodes count */ + __u32 s_first_data_block; /* First Data Block */ + __u32 s_log_block_size; /* Block size */ + __s32 s_log_frag_size; /* Fragment size */ + __u32 s_blocks_per_group; /* # Blocks per group */ + __u32 s_frags_per_group; /* # Fragments per group */ + __u32 s_inodes_per_group; /* # Inodes per group */ + __u32 s_mtime; /* Mount time */ + __u32 s_wtime; /* Write time */ + __u16 s_mnt_count; /* Mount count */ + __s16 s_max_mnt_count; /* Maximal mount count */ + __u16 s_magic; /* Magic signature */ + __u16 s_state; /* File system state */ + __u16 s_errors; /* Behaviour when detecting errors */ + __u16 s_minor_rev_level; /* minor revision level */ + __u32 s_lastcheck; /* time of last check */ + __u32 s_checkinterval; /* max. time between checks */ + __u32 s_creator_os; /* OS */ + __u32 s_rev_level; /* Revision level */ + __u16 s_def_resuid; /* Default uid for reserved blocks */ + __u16 s_def_resgid; /* Default gid for reserved blocks */ + /* + * These fields are for EXT2_DYNAMIC_REV superblocks only. + * + * Note: the difference between the compatible feature set and + * the incompatible feature set is that if there is a bit set + * in the incompatible feature set that the kernel doesn't + * know about, it should refuse to mount the filesystem. + * + * e2fsck's requirements are more strict; if it doesn't know + * about a feature in either the compatible or incompatible + * feature set, it must abort and not try to meddle with + * things it doesn't understand... + */ + __u32 s_first_ino; /* First non-reserved inode */ + __u16 s_inode_size; /* size of inode structure */ + __u16 s_block_group_nr; /* block group # of this superblock */ + __u32 s_feature_compat; /* compatible feature set */ + __u32 s_feature_incompat; /* incompatible feature set */ + __u32 s_feature_ro_compat; /* readonly-compatible feature set */ + __u8 s_uuid[16]; /* 128-bit uuid for volume */ + char s_volume_name[16]; /* volume name */ + char s_last_mounted[64]; /* directory where last mounted */ + __u32 s_reserved[206]; /* Padding to the end of the block */ +}; /* * function prototypes @@ -272,6 +360,11 @@ extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs); extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs); extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs); extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs); +extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start, + __u32 end, + __u32 real_end, + const char *descr, + ext2fs_generic_bitmap *ret); extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs, const char *descr, ext2fs_block_bitmap *ret); @@ -323,6 +416,7 @@ extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ino_t dir); /* freefs.c */ extern void ext2fs_free(ext2_filsys fs); +extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap); extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap); extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap); @@ -378,6 +472,13 @@ extern errcode_t ext2fs_lookup(ext2_filsys fs, ino_t dir, const char *name, int namelen, char *buf, ino_t *inode); extern errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd, const char *name, ino_t *inode); +errcode_t ext2fs_namei_follow(ext2_filsys fs, ino_t root, ino_t cwd, + const char *name, ino_t *inode); +extern errcode_t ext2fs_follow_link(ext2_filsys fs, ino_t root, ino_t cwd, + ino_t inode, ino_t *res_inode); + +/* native.c */ +int ext2fs_native_flag(void); /* newdir.c */ extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino, @@ -414,6 +515,9 @@ extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, /* swapfs.c */ extern void ext2fs_swap_super(struct ext2_super_block * super); extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp); +extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t, + struct ext2_inode *f, int hostorder); + /* inline functions */ extern void ext2fs_mark_super_dirty(ext2_filsys fs); diff --git a/lib/ext2fs/freefs.c b/lib/ext2fs/freefs.c index 63b52356..5c709833 100644 --- a/lib/ext2fs/freefs.c +++ b/lib/ext2fs/freefs.c @@ -33,9 +33,9 @@ void ext2fs_free(ext2_filsys fs) free(fs); } -void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap) +void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap) { - if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_INODE_BITMAP)) + if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_GENERIC_BITMAP)) return; bitmap->magic = 0; @@ -50,20 +50,21 @@ void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap) free(bitmap); } +void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap) +{ + if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_INODE_BITMAP)) + return; + + bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP; + ext2fs_free_generic_bitmap(bitmap); +} + void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap) { if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_BLOCK_BITMAP)) return; - bitmap->magic = 0; - if (bitmap->description) { - free(bitmap->description); - bitmap->description = 0; - } - if (bitmap->bitmap) { - free(bitmap->bitmap); - bitmap->bitmap = 0; - } - free(bitmap); + bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP; + ext2fs_free_generic_bitmap(bitmap); } diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c index cc7abd01..4108093e 100644 --- a/lib/ext2fs/initialize.c +++ b/lib/ext2fs/initialize.c @@ -1,6 +1,11 @@ /* * initialize.c --- initialize a filesystem handle given superblock * parameters. Used by mke2fs when initializing a filesystem. + * + * Copyright (C) 1994, 1995, 1996 Theodore Ts'o. + * + * This file may be redistributed under the terms of the GNU Public + * License. */ #include <stdio.h> @@ -31,6 +36,19 @@ #define CREATOR_OS EXT2_OS_LINUX /* by default */ #endif +/* + * Note we override the kernel include file's idea of what the default + * check interval (never) should be. It's a good idea to check at + * least *occasionally*, specially since servers will never rarely get + * to reboot, since Linux is so robust these days. :-) + * + * 180 days (six months) seems like a good value. + */ +#ifdef EXT2_DFL_CHECKINTERVAL +#undef EXT2_DFL_CHECKINTERVAL +#endif +#define EXT2_DFL_CHECKINTERVAL (86400 * 180) + errcode_t ext2fs_initialize(const char *name, int flags, struct ext2_super_block *param, io_manager manager, ext2_filsys *ret_fs) @@ -55,7 +73,7 @@ errcode_t ext2fs_initialize(const char *name, int flags, memset(fs, 0, sizeof(struct struct_ext2_filsys)); fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS; - fs->flags = flags | EXT2_FLAG_RW; + fs->flags = flags | EXT2_FLAG_RW | ext2fs_native_flag(); retval = manager->open(name, IO_FLAG_RW, &fs->io); if (retval) goto cleanup; diff --git a/lib/ext2fs/inode.c b/lib/ext2fs/inode.c index 04c5e4d1..7d25ae1c 100644 --- a/lib/ext2fs/inode.c +++ b/lib/ext2fs/inode.c @@ -19,8 +19,6 @@ #include "ext2fs.h" -static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f); - errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks, ext2_inode_scan *ret_scan) { @@ -151,15 +149,17 @@ errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ino_t *ino, scan->ptr += scan->inode_size - extra_bytes; scan->bytes_left -= scan->inode_size - extra_bytes; - if (scan->fs->flags & EXT2_SWAP_BYTES) - inocpy_with_swap(inode, (struct ext2_inode *) - scan->temp_buffer); + if ((scan->fs->flags & EXT2_SWAP_BYTES) || + (scan->fs->flags & EXT2_SWAP_BYTES_READ)) + ext2fs_swap_inode(scan->fs, inode, + (struct ext2_inode *) scan->temp_buffer, 0); else *inode = *((struct ext2_inode *) scan->temp_buffer); } else { - if (scan->fs->flags & EXT2_SWAP_BYTES) - inocpy_with_swap(inode, (struct ext2_inode *) - scan->ptr); + if ((scan->fs->flags & EXT2_SWAP_BYTES) || + (scan->fs->flags & EXT2_SWAP_BYTES_READ)) + ext2fs_swap_inode(scan->fs, inode, + (struct ext2_inode *) scan->ptr, 0); else *inode = *((struct ext2_inode *) scan->ptr); scan->ptr += scan->inode_size; @@ -178,6 +178,15 @@ errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ino_t *ino, static char *inode_buffer = 0; static blk_t inode_buffer_block = 0; static int inode_buffer_size = 0; +#define INODE_CACHE_SIZE 4 +#ifdef INODE_CACHE_SIZE +static int cache_last = -1; +static struct { + ino_t inode; + struct ext2_inode value; +} inode_cache[INODE_CACHE_SIZE]; +#endif + errcode_t ext2fs_read_inode (ext2_filsys fs, unsigned long ino, struct ext2_inode * inode) @@ -185,10 +194,29 @@ errcode_t ext2fs_read_inode (ext2_filsys fs, unsigned long ino, unsigned long group, block, block_nr, offset; char *ptr; errcode_t retval; - int clen, length; + int clen, length, i; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + /* Check to see if user has an override function */ + if (fs->read_inode) { + retval = (fs->read_inode)(fs, ino, inode); + if (retval != EXT2_ET_CALLBACK_NOTHANDLED) + return retval; + } + /* Check to see if it's in the inode cache */ +#ifdef INODE_CACHE_SIZE + if (cache_last == -1) { + for (i=0; i < INODE_CACHE_SIZE; i++) + inode_cache[i].inode = 0; + cache_last = INODE_CACHE_SIZE-1; + } else for (i=0; i < INODE_CACHE_SIZE; i++) { + if (inode_cache[i].inode == ino) { + *inode = inode_cache[i].value; + return 0; + } + } +#endif if (ino > fs->super->s_inodes_count) return EXT2_ET_BAD_INODE_NUM; if (inode_buffer_size != fs->blocksize) { @@ -238,8 +266,16 @@ errcode_t ext2fs_read_inode (ext2_filsys fs, unsigned long ino, } else memcpy((char *) inode, ptr, length); - if (fs->flags & EXT2_SWAP_BYTES) - inocpy_with_swap(inode, inode); + if ((fs->flags & EXT2_SWAP_BYTES) || + (fs->flags & EXT2_SWAP_BYTES_READ)) + ext2fs_swap_inode(fs, inode, inode, 0); + + /* Update the inode cache */ +#ifdef INODE_CACHE_SIZE + cache_last = (cache_last + 1) % INODE_CACHE_SIZE; + inode_cache[cache_last].inode = ino; + inode_cache[cache_last].value = *inode; +#endif return 0; } @@ -251,10 +287,25 @@ errcode_t ext2fs_write_inode(ext2_filsys fs, unsigned long ino, errcode_t retval; struct ext2_inode temp_inode; char *ptr; - int i, clen, length; + int clen, length, i; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + /* Check to see if user provided an override function */ + if (fs->write_inode) { + retval = (fs->write_inode)(fs, ino, inode); + if (retval != EXT2_ET_CALLBACK_NOTHANDLED) + return retval; + } + /* Check to see if the inode cache needs to be updated */ +#ifdef INODE_CACHE_SIZE + for (i=0; i < INODE_CACHE_SIZE; i++) { + if (inode_cache[i].inode == ino) { + inode_cache[i].value = *inode; + break; + } + } +#endif if (!(fs->flags & EXT2_FLAG_RW)) return EXT2_ET_RO_FILSYS; @@ -271,8 +322,9 @@ errcode_t ext2fs_write_inode(ext2_filsys fs, unsigned long ino, inode_buffer_size = fs->blocksize; inode_buffer_block = 0; } - if (fs->flags & EXT2_SWAP_BYTES) - inocpy_with_swap(&temp_inode, inode); + if ((fs->flags & EXT2_SWAP_BYTES) || + (fs->flags & EXT2_SWAP_BYTES_WRITE)) + ext2fs_swap_inode(fs, &temp_inode, inode, 1); else memcpy(&temp_inode, inode, sizeof(struct ext2_inode)); @@ -367,32 +419,7 @@ errcode_t ext2fs_check_directory(ext2_filsys fs, ino_t ino) if (retval) return retval; if (!LINUX_S_ISDIR(inode.i_mode)) - return ENOTDIR; + return ENOTDIR; return 0; } -static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f) -{ - unsigned i; - - t->i_mode = ext2fs_swab16(f->i_mode); - t->i_uid = ext2fs_swab16(f->i_uid); - t->i_size = ext2fs_swab32(f->i_size); - t->i_atime = ext2fs_swab32(f->i_atime); - t->i_ctime = ext2fs_swab32(f->i_ctime); - t->i_mtime = ext2fs_swab32(f->i_mtime); - t->i_dtime = ext2fs_swab32(f->i_dtime); - t->i_gid = ext2fs_swab16(f->i_gid); - t->i_links_count = ext2fs_swab16(f->i_links_count); - t->i_blocks = ext2fs_swab32(f->i_blocks); - t->i_flags = ext2fs_swab32(f->i_flags); - for (i = 0; i < EXT2_N_BLOCKS; i++) - t->i_block[i] = ext2fs_swab32(f->i_block[i]); - t->i_version = ext2fs_swab32(f->i_version); - t->i_file_acl = ext2fs_swab32(f->i_file_acl); - t->i_dir_acl = ext2fs_swab32(f->i_dir_acl); - t->i_faddr = ext2fs_swab32(f->i_faddr); - t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag; - t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize; - t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1); -} diff --git a/lib/ext2fs/namei.c b/lib/ext2fs/namei.c index 496c7266..8fc71b08 100644 --- a/lib/ext2fs/namei.c +++ b/lib/ext2fs/namei.c @@ -13,6 +13,8 @@ #include <errno.h> #endif +/* #define NAMEI_DEBUG */ + #include <linux/ext2_fs.h> #include "ext2fs.h" @@ -173,43 +175,186 @@ errcode_t ext2fs_lookup(ext2_filsys fs, ino_t dir, const char *name, return (ls.found) ? 0 : ENOENT; } -errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd, const char *name, - ino_t *inode) + +static errcode_t open_namei(ext2_filsys fs, ino_t root, ino_t base, + const char *pathname, int pathlen, int follow, + int link_count, char *buf, ino_t *res_inode); + +static errcode_t follow_link(ext2_filsys fs, ino_t root, ino_t dir, + ino_t inode, int link_count, + char *buf, ino_t *res_inode) { - ino_t dir = cwd; - char *buf; - const char *p = name, *q; - int len; - errcode_t retval; + char *pathname; + char *buffer = 0; + errcode_t retval; + struct ext2_inode ei; - EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); +#ifdef NAMEI_DEBUG + printf("follow_link: root=%lu, dir=%lu, inode=%lu, lc=%d\n", + root, dir, inode, link_count); + +#endif + retval = ext2fs_read_inode (fs, inode, &ei); + if (retval) return retval; + if (!LINUX_S_ISLNK (ei.i_mode)) { + *res_inode = inode; + return 0; + } + if (link_count++ > 5) { + return EXT2_ET_SYMLINK_LOOP; + } + if (ei.i_blocks) { + buffer = malloc (fs->blocksize); + if (!buffer) + return ENOMEM; + retval = io_channel_read_blk(fs->io, ei.i_block[0], 1, buffer); + if (retval) { + free(buffer); + return retval; + } + pathname = buffer; + } else + pathname = (char *)&(ei.i_block[0]); + retval = open_namei(fs, root, dir, pathname, ei.i_size, 1, + link_count, buf, res_inode); + if (buffer) + free (buffer); + return retval; +} - buf = malloc(fs->blocksize); - if (!buf) - return ENOMEM; - if (*p == '/') { - p++; - dir = root; +/* + * This routine interprets a pathname in the context of the current + * directory and the root directory, and returns the inode of the + * containing directory, and a pointer to the filename of the file + * (pointing into the pathname) and the length of the filename. + */ +static errcode_t dir_namei(ext2_filsys fs, ino_t root, ino_t dir, + const char *pathname, int pathlen, + int link_count, char *buf, + const char **name, int *namelen, ino_t *res_inode) +{ + char c; + const char *thisname; + int len; + ino_t inode; + errcode_t retval; + + if ((c = *pathname) == '/') { + dir = root; + pathname++; + pathlen--; } - while (*p) { - q = strchr(p, '/'); - if (q) - len = q - p; - else - len = strlen(p); - if (len) { - retval = ext2fs_lookup(fs, dir, p, len, buf, &dir); - if (retval) { - free(buf); - return retval; - } + while (1) { + thisname = pathname; + for (len=0; --pathlen >= 0;len++) { + c = *(pathname++); + if (c == '/') + break; } - if (q) - p = q+1; - else + if (pathlen < 0) break; + retval = ext2fs_lookup (fs, dir, thisname, len, buf, &inode); + if (retval) return retval; + retval = follow_link (fs, root, dir, inode, + link_count, buf, &dir); + if (retval) return retval; + } + *name = thisname; + *namelen = len; + *res_inode = dir; + return 0; +} + +static errcode_t open_namei(ext2_filsys fs, ino_t root, ino_t base, + const char *pathname, int pathlen, int follow, + int link_count, char *buf, ino_t *res_inode) +{ + const char *basename; + int namelen; + ino_t dir, inode; + errcode_t retval; + +#ifdef NAMEI_DEBUG + printf("open_namei: root=%lu, dir=%lu, path=%*s, lc=%d\n", + root, base, pathlen, pathname, link_count); +#endif + retval = dir_namei(fs, root, base, pathname, pathlen, + link_count, buf, &basename, &namelen, &dir); + if (retval) return retval; + if (!namelen) { /* special case: '/usr/' etc */ + *res_inode=dir; + return 0; } - *inode = dir; - free(buf); + retval = ext2fs_lookup (fs, dir, basename, namelen, buf, &inode); + if (retval) + return retval; + if (follow) { + retval = follow_link(fs, root, dir, inode, link_count, + buf, &inode); + if (retval) + return retval; + } +#ifdef NAMEI_DEBUG + printf("open_namei: (link_count=%d) returns %lu\n", + link_count, inode); +#endif + *res_inode = inode; return 0; } + +errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd, + const char *name, ino_t *inode) +{ + char *buf; + errcode_t retval; + + EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + + buf = malloc(fs->blocksize); + if (!buf) + return ENOMEM; + + retval = open_namei(fs, root, cwd, name, strlen(name), 0, 0, + buf, inode); + + free(buf); + return retval; +} + +errcode_t ext2fs_namei_follow(ext2_filsys fs, ino_t root, ino_t cwd, + const char *name, ino_t *inode) +{ + char *buf; + errcode_t retval; + + EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + + buf = malloc(fs->blocksize); + if (!buf) + return ENOMEM; + + retval = open_namei(fs, root, cwd, name, strlen(name), 1, 0, + buf, inode); + + free(buf); + return retval; +} + +extern errcode_t ext2fs_follow_link(ext2_filsys fs, ino_t root, ino_t cwd, + ino_t inode, ino_t *res_inode) +{ + char *buf; + errcode_t retval; + + EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); + + buf = malloc(fs->blocksize); + if (!buf) + return ENOMEM; + + retval = follow_link(fs, root, cwd, inode, 0, buf, res_inode); + + free(buf); + return retval; +} + diff --git a/lib/ext2fs/native.c b/lib/ext2fs/native.c new file mode 100644 index 00000000..aa371ced --- /dev/null +++ b/lib/ext2fs/native.c @@ -0,0 +1,31 @@ +/* + * native.c --- returns the ext2_flag for a native byte order + * + * Copyright (C) 1996 Theodore Ts'o. + * + * This file may be redistributed under the terms of the GNU Public + * License. + */ + +#include <stdio.h> +#include <linux/ext2_fs.h> + +#include "ext2fs.h" + +static int i386_byteorder(void) +{ + int one = 1; + char *cp = (char *) &one; + + return (*cp == 1); +} + +int ext2fs_native_flag(void) +{ + if (i386_byteorder()) + return 0; + return EXT2_SWAP_BYTES; +} + + + diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c index e8b01e21..74bf2790 100644 --- a/lib/ext2fs/openfs.c +++ b/lib/ext2fs/openfs.c @@ -113,6 +113,10 @@ errcode_t ext2fs_open(const char *name, int flags, int superblock, #endif #endif fs->blocksize = EXT2_BLOCK_SIZE(fs->super); + if (fs->blocksize == 0) { + retval = EXT2_ET_CORRUPT_SUPERBLOCK; + goto cleanup; + } fs->fragsize = EXT2_FRAG_SIZE(fs->super); fs->inode_blocks_per_group = ((fs->super->s_inodes_per_group * EXT2_INODE_SIZE(fs->super) + diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c index 371b8f9d..968f41c2 100644 --- a/lib/ext2fs/swapfs.c +++ b/lib/ext2fs/swapfs.c @@ -16,6 +16,8 @@ void ext2fs_swap_super(struct ext2_super_block * super) { + struct ext2fs_sb *s = (struct ext2fs_sb *) super; + super->s_inodes_count = ext2fs_swab32(super->s_inodes_count); super->s_blocks_count = ext2fs_swab32(super->s_blocks_count); super->s_r_blocks_count = ext2fs_swab32(super->s_r_blocks_count); @@ -34,6 +36,7 @@ void ext2fs_swap_super(struct ext2_super_block * super) super->s_magic = ext2fs_swab16(super->s_magic); super->s_state = ext2fs_swab16(super->s_state); super->s_errors = ext2fs_swab16(super->s_errors); + s->s_minor_rev_level = ext2fs_swab16(s->s_minor_rev_level); super->s_lastcheck = ext2fs_swab32(super->s_lastcheck); super->s_checkinterval = ext2fs_swab32(super->s_checkinterval); super->s_creator_os = ext2fs_swab32(super->s_creator_os); @@ -42,6 +45,12 @@ void ext2fs_swap_super(struct ext2_super_block * super) super->s_def_resuid = ext2fs_swab16(super->s_def_resuid); super->s_def_resgid = ext2fs_swab16(super->s_def_resgid); #endif + s->s_first_ino = ext2fs_swab32(s->s_first_ino); + s->s_inode_size = ext2fs_swab16(s->s_inode_size); + s->s_block_group_nr = ext2fs_swab16(s->s_block_group_nr); + s->s_feature_compat = ext2fs_swab32(s->s_feature_compat); + s->s_feature_incompat = ext2fs_swab32(s->s_feature_incompat); + s->s_feature_ro_compat = ext2fs_swab32(s->s_feature_ro_compat); } void ext2fs_swap_group_desc(struct ext2_group_desc *gdp) @@ -54,5 +63,64 @@ void ext2fs_swap_group_desc(struct ext2_group_desc *gdp) gdp->bg_used_dirs_count = ext2fs_swab16(gdp->bg_used_dirs_count); } +void ext2fs_swap_inode(ext2_filsys fs, struct ext2_inode *t, + struct ext2_inode *f, int hostorder) +{ + unsigned i; + int islnk = 0; + if (hostorder && LINUX_S_ISLNK(f->i_mode)) + islnk = 1; + t->i_mode = ext2fs_swab16(f->i_mode); + if (!hostorder && LINUX_S_ISLNK(t->i_mode)) + islnk = 1; + t->i_uid = ext2fs_swab16(f->i_uid); + t->i_size = ext2fs_swab32(f->i_size); + t->i_atime = ext2fs_swab32(f->i_atime); + t->i_ctime = ext2fs_swab32(f->i_ctime); + t->i_mtime = ext2fs_swab32(f->i_mtime); + t->i_dtime = ext2fs_swab32(f->i_dtime); + t->i_gid = ext2fs_swab16(f->i_gid); + t->i_links_count = ext2fs_swab16(f->i_links_count); + t->i_blocks = ext2fs_swab32(f->i_blocks); + t->i_flags = ext2fs_swab32(f->i_flags); + if (!islnk || f->i_blocks) { + for (i = 0; i < EXT2_N_BLOCKS; i++) + t->i_block[i] = ext2fs_swab32(f->i_block[i]); + } else if (t != f) { + for (i = 0; i < EXT2_N_BLOCKS; i++) + t->i_block[i] = f->i_block[i]; + } + t->i_version = ext2fs_swab32(f->i_version); + t->i_file_acl = ext2fs_swab32(f->i_file_acl); + t->i_dir_acl = ext2fs_swab32(f->i_dir_acl); + t->i_faddr = ext2fs_swab32(f->i_faddr); + switch (fs->super->s_creator_os) { + case EXT2_OS_LINUX: + t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag; + t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize; + t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1); + break; + case EXT2_OS_HURD: + t->osd1.hurd1.h_i_translator = + ext2fs_swab32 (f->osd1.hurd1.h_i_translator); + t->osd2.hurd2.h_i_frag = f->osd2.hurd2.h_i_frag; + t->osd2.hurd2.h_i_fsize = f->osd2.hurd2.h_i_fsize; + t->osd2.hurd2.h_i_mode_high = + ext2fs_swab16 (f->osd2.hurd2.h_i_mode_high); + t->osd2.hurd2.h_i_uid_high = + ext2fs_swab16 (f->osd2.hurd2.h_i_uid_high); + t->osd2.hurd2.h_i_gid_high = + ext2fs_swab16 (f->osd2.hurd2.h_i_gid_high); + t->osd2.hurd2.h_i_author = + ext2fs_swab32 (f->osd2.hurd2.h_i_author); + break; + case EXT2_OS_MASIX: + t->osd2.masix2.m_i_frag = f->osd2.masix2.m_i_frag; + t->osd2.masix2.m_i_fsize = f->osd2.masix2.m_i_fsize; + t->osd2.masix2.m_pad1 = ext2fs_swab16(f->osd2.masix2.m_pad1); + break; + } +} + diff --git a/lib/ss/ChangeLog b/lib/ss/ChangeLog index 79438202..96b36120 100644 --- a/lib/ss/ChangeLog +++ b/lib/ss/ChangeLog @@ -1,3 +1,15 @@ +Fri Aug 30 22:36:48 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * invocation.c (ss_create_invocation): Change function prototype + of invocation so that the first two arguments are const + char *, and that the info_ptr is a void *, not a char *. + + * ss.h: Added declaration of ss_execute_line() + +Sat Aug 10 00:17:14 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * listen.c (ss_listen): Fix -Wall flames. + Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> * Release of E2fsprogs version 1.04 diff --git a/lib/ss/Makefile.in b/lib/ss/Makefile.in index 9af2c2f9..777c34bb 100644 --- a/lib/ss/Makefile.in +++ b/lib/ss/Makefile.in @@ -6,6 +6,7 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ top_builddir = ../.. +my_dir = lib/ss INSTALL = @INSTALL@ @MCONFIG@ diff --git a/lib/ss/error.c b/lib/ss/error.c index 80ebc823..7f2e96ff 100644 --- a/lib/ss/error.c +++ b/lib/ss/error.c @@ -75,7 +75,7 @@ void ss_error (va_alist) va_dcl #endif { - register char const *whoami; + register char *whoami; va_list pvar; #ifndef HAVE_STDARG_H int sci_idx; diff --git a/lib/ss/execute_cmd.c b/lib/ss/execute_cmd.c index be13dd83..74b59690 100644 --- a/lib/ss/execute_cmd.c +++ b/lib/ss/execute_cmd.c @@ -151,7 +151,7 @@ static int really_execute_command (sci_idx, argc, argv) * Notes: */ -ss_execute_command(sci_idx, argv) +int ss_execute_command(sci_idx, argv) int sci_idx; register char *argv[]; { diff --git a/lib/ss/invocation.c b/lib/ss/invocation.c index c4c15ca8..c4aecf10 100644 --- a/lib/ss/invocation.c +++ b/lib/ss/invocation.c @@ -13,8 +13,8 @@ int ss_create_invocation(subsystem_name, version_string, info_ptr, request_table_ptr, code_ptr) - char *subsystem_name, *version_string; - char *info_ptr; + const char *subsystem_name, *version_string; + void *info_ptr; ss_request_table *request_table_ptr; int *code_ptr; { diff --git a/lib/ss/listen.c b/lib/ss/listen.c index 765b7575..aab87336 100644 --- a/lib/ss/listen.c +++ b/lib/ss/listen.c @@ -29,7 +29,7 @@ typedef void sigret_t; static ss_data *current_info; static jmp_buf listen_jmpb; -static sigret_t print_prompt() +static sigret_t print_prompt(int sig) { #ifdef BSD /* put input into a reasonable mode */ @@ -45,19 +45,18 @@ static sigret_t print_prompt() (void) fflush(stdout); } -static sigret_t listen_int_handler() +static sigret_t listen_int_handler(int sig) { putc('\n', stdout); signal(SIGINT, listen_int_handler); longjmp(listen_jmpb, 1); } -int ss_listen (sci_idx) - int sci_idx; +int ss_listen (int sci_idx) { char *cp; ss_data *info; - sigret_t (*sig_int)(), (*sig_cont)(), (*old_sig_cont)(); + sigret_t (*sig_int)(int), (*sig_cont)(int), (*old_sig_cont)(int); char input[BUFSIZ]; char buffer[BUFSIZ]; char *end = buffer; @@ -71,7 +70,7 @@ int ss_listen (sci_idx) ss_data *old_info = current_info; current_info = info = ss_info(sci_idx); - sig_cont = (sigret_t (*)()) 0; + sig_cont = (sigret_t (*)(int)) 0; info->abort = 0; #ifdef POSIX_SIGNALS sigemptyset(&igmask); @@ -89,7 +88,7 @@ int ss_listen (sci_idx) (void) sigsetmask(mask); #endif while(!info->abort) { - print_prompt(); + print_prompt(0); *end = '\0'; old_sig_cont = sig_cont; sig_cont = signal(SIGCONT, print_prompt); @@ -133,20 +132,14 @@ egress: return code; } -void ss_abort_subsystem(sci_idx, code) - int sci_idx; - int code; +void ss_abort_subsystem(int sci_idx, int code) { ss_info(sci_idx)->abort = 1; ss_info(sci_idx)->exit_status = code; } -int ss_quit(argc, argv, sci_idx, infop) - int argc; - char **argv; - int sci_idx; - pointer infop; +void ss_quit(int argc, const char * const *argv, int sci_idx, pointer infop) { ss_abort_subsystem(sci_idx, 0); } diff --git a/lib/ss/requests.c b/lib/ss/requests.c index 9da96079..c214213e 100644 --- a/lib/ss/requests.c +++ b/lib/ss/requests.c @@ -11,9 +11,11 @@ #include "ss_internal.h" #ifdef __STDC__ -#define DECLARE(name) void name(int argc,char **argv, int sci_idx) +#define DECLARE(name) void name(int argc,const char * const *argv, \ + int sci_idx, void *infop) #else -#define DECLARE(name) void name(argc,argv,sci_idx)int argc,sci_idx;char **argv; +#define DECLARE(name) void name(argc,argv,sci_idx,info)int argc,sci_idx;char **argv;void *infop; + #endif /* diff --git a/lib/ss/ss.h b/lib/ss/ss.h index f992bd98..3b86f87f 100644 --- a/lib/ss/ss.h +++ b/lib/ss/ss.h @@ -54,12 +54,22 @@ char *ss_current_request(); /* This is actually a macro */ char *ss_name(int sci_idx); void ss_error (int, long, char const *, ...); void ss_perror (int, long, char const *); -int ss_create_invocation(char *, char *, char *, ss_request_table *, int *); +int ss_create_invocation(const char *, const char *, void *, + ss_request_table *, int *); void ss_delete_invocation(int); int ss_listen(int); +int ss_execute_line(int, char *); void ss_add_request_table(int, ss_request_table *, int, int *); void ss_delete_request_table(int, ss_request_table *, int *); void ss_abort_subsystem(int sci_idx, int code); +void ss_quit(int argc, const char * const *argv, int sci_idx, void *infop); +void ss_self_identify(int argc, const char * const *argv, int sci_idx, void *infop); +void ss_subsystem_name(int argc, const char * const *argv, + int sci_idx, void *infop); +void ss_subsystem_version(int argc, const char * const *argv, + int sci_idx, void *infop); +void ss_unimplemented(int argc, const char * const *argv, + int sci_idx, void *infop); #else char *ss_name(); void ss_error (); @@ -67,9 +77,15 @@ void ss_perror (); int ss_create_invocation(); void ss_delete_invocation(); int ss_listen(); +int ss_execute_line(); void ss_add_request_table(); void ss_delete_request_table(); void ss_abort_subsystem(); +void ss_quit(); +void ss_self_identify(); +void ss_subsystem_name(); +void ss_subsystem_version(); +void ss_unimplemented(); #endif extern ss_request_table ss_std_requests; #endif /* _ss_h */ diff --git a/lib/ss/ss_internal.h b/lib/ss/ss_internal.h index 388a3768..3bd59872 100644 --- a/lib/ss/ss_internal.h +++ b/lib/ss/ss_internal.h @@ -70,8 +70,8 @@ typedef struct { typedef struct _ss_data { /* init values */ /* this subsystem */ - char *subsystem_name; - char *subsystem_version; + const char *subsystem_name; + const char *subsystem_version; /* current request info */ int argc; char **argv; /* arg list */ diff --git a/lib/ss/test_ss.c b/lib/ss/test_ss.c index aa4c7f35..3eddbabe 100644 --- a/lib/ss/test_ss.c +++ b/lib/ss/test_ss.c @@ -9,8 +9,8 @@ * $Locker$ * * $Log$ - * Revision 1.7 1997/04/29 14:34:41 tytso - * Checked in e2fsprogs 1.04. + * Revision 1.8 1997/04/29 14:52:31 tytso + * Checked in e2fsprogs 1.05 * * Revision 1.1 1993/06/03 12:31:25 tytso * Initial revision diff --git a/lib/substitute_sh.in b/lib/substitute_sh.in index f3b16803..f80d4d9f 100644 --- a/lib/substitute_sh.in +++ b/lib/substitute_sh.in @@ -9,6 +9,7 @@ SS_DIR=@SS_DIR@ E2FSPROGS_MONTH=@E2FSPROGS_MONTH@ E2FSPROGS_YEAR=@E2FSPROGS_YEAR@ E2FSPROGS_VERSION=@E2FSPROGS_VERSION@ +SIZEOF_LONG_LONG=@SIZEOF_LONG_LONG@ SIZEOF_LONG=@SIZEOF_LONG@ SIZEOF_INT=@SIZEOF_INT@ SIZEOF_SHORT=@SIZEOF_SHORT@ diff --git a/lib/uuid/ChangeLog b/lib/uuid/ChangeLog new file mode 100644 index 00000000..8803dedb --- /dev/null +++ b/lib/uuid/ChangeLog @@ -0,0 +1,10 @@ +Tue Aug 27 16:50:43 1996 Miles Bader <miles@gnu.ai.mit.edu> + + * uuid/gen_uuid.c [HAVE_NET_IF_H] <net/if.h>: Include guarded. + [HAVE_NETINET_IN_H] <netinet/in.h>: Include guarded. + (get_node_id): Surround bulk of function with #ifdef HAVE_NET_IF_H. + +Tue Aug 27 16:50:16 1996 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * gen_uuid.c (get_node_id): Add a specific ifdef for the HURD, + since it is broken w.r.t getting hardware addresses. diff --git a/lib/uuid/Makefile.in b/lib/uuid/Makefile.in new file mode 100644 index 00000000..c226197e --- /dev/null +++ b/lib/uuid/Makefile.in @@ -0,0 +1,118 @@ +# Makefile for the second extended file system utility functions +# +# Copyright (C) 1993 Remy Card (card@masi.ibp.fr) +# +# This file can be redistributed under the terms of the GNU General +# Public License + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +top_builddir = ../.. +my_dir = lib/uuid +INSTALL = @INSTALL@ + +@MCONFIG@ + +all:: + +OBJS= clear.o \ + compare.o \ + copy.o \ + gen_uuid.o \ + isnull.o \ + pack.o \ + parse.o \ + unpack.o \ + unparse.o + +SRCS= $(srcdir)/clear.c \ + $(srcdir)/compare.c \ + $(srcdir)/copy.c \ + $(srcdir)/gen_uuid.c \ + $(srcdir)/isnull.c \ + $(srcdir)/pack.c \ + $(srcdir)/parse.c \ + $(srcdir)/unpack.c \ + $(srcdir)/unparse.c + +LIBRARY= libuuid +LIBDIR= uuid + +DLL_ADDRESS = 0x66980000 +DLL_JUMPSIZE = 0x1000 +DLL_GOTSIZE = 0x1000 +DLL_VERSION = 1.0 +DLL_IMAGE = libuuid +DLL_STUB = libuuid +DLL_MYDIR = uuid +DLL_INSTALL_DIR = $(libdir) + +ELF_VERSION = 1.0 +ELF_SO_VERSION = 1 +ELF_IMAGE = libuuid +ELF_MYDIR = uuid +ELF_INSTALL_DIR = $(libdir) + +BSDLIB_VERSION = 1.0 +BSDLIB_IMAGE = libuuid +BSDLIB_MYDIR = uuid +BSDLIB_INSTALL_DIR = $(libdir) + +@MAKEFILE_LIBRARY@ +@MAKEFILE_DLL@ +@MAKEFILE_ELF@ +@MAKEFILE_BSDLIB@ +@MAKEFILE_PROFILE@ +@MAKEFILE_CHECKER@ + +.c.o: + $(CC) $(ALL_CFLAGS) -c $< -o $@ +@PROFILE_CMT@ $(CC) $(ALL_CFLAGS) -pg -o profiled/$*.o -c $< +@CHECKER_CMT@ $(CC) $(ALL_CFLAGS) -checker -g -o checker/$*.o -c $< +@DLL_CMT@ (export JUMP_DIR=`pwd`/jump; $(CC) -B$(JUMP_PREFIX) $(ALL_CFLAGS) \ +@DLL_CMT@ -o jump/$*.o -c $<) +@ELF_CMT@ $(CC) $(ALL_CFLAGS) -fPIC -o elfshared/$*.o -c $< +@BSDLIB_CMT@ $(CC) $(ALL_CFLAGS) -fpic -o pic/$*.o -c $< + +all:: tst_uuid + +tst_uuid: tst_uuid.o $(LIBUUID) + $(CC) $(ALL_LDFLAGS) -o tst_uuid tst_uuid.o $(LIBUUID) + +installdirs:: + $(top_srcdir)/mkinstalldirs $(DESTDIR)$(ulibdir) \ + $(DESTDIR)$(includedir)/uuid + +install:: all installdirs + $(INSTALL_DATA) libuuid.a $(DESTDIR)$(ulibdir)/libuuid.a + $(CHMOD) 644 $(DESTDIR)$(ulibdir)/libuuid.a + -$(RANLIB) $(DESTDIR)$(ulibdir)/libuuid.a + $(CHMOD) $(LIBMODE) $(DESTDIR)$(ulibdir)/libuuid.a + $(INSTALL_DATA) $(srcdir)/uuid.h $(DESTDIR)$(includedir)/uuid/uuid.h + +uninstall:: + $(RM) -f $(ulibdir)/libuuid.a + +clean:: + $(RM) -f \#* *.s *.o *.a *~ *.bak core profiled/* checker/* + $(RM) -f ../libuuid.a ../libuuid_p.a tst_uuid + +mostlyclean:: clean +distclean:: clean + $(RM) -f .depend Makefile + +# +++ Dependency line eater +++ +# +# Makefile dependencies follow. This must be the last section in +# the Makefile.in file +# +clear.o: $(srcdir)/clear.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +compare.o: $(srcdir)/compare.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +copy.o: $(srcdir)/copy.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +gen_uuid.o: $(srcdir)/gen_uuid.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +isnull.o: $(srcdir)/isnull.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +pack.o: $(srcdir)/pack.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +parse.o: $(srcdir)/parse.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +unpack.o: $(srcdir)/unpack.c $(srcdir)/uuidP.h $(srcdir)/uuid.h +unparse.o: $(srcdir)/unparse.c $(srcdir)/uuidP.h $(srcdir)/uuid.h diff --git a/lib/uuid/clear.c b/lib/uuid/clear.c new file mode 100644 index 00000000..5127e016 --- /dev/null +++ b/lib/uuid/clear.c @@ -0,0 +1,11 @@ +/* + * clear.c -- Clear a UUID + */ + +#include "uuidP.h" + +void uuid_clear(uuid_t uu) +{ + memset(uu, 0, 16); +} + diff --git a/lib/uuid/compare.c b/lib/uuid/compare.c new file mode 100644 index 00000000..44052c3e --- /dev/null +++ b/lib/uuid/compare.c @@ -0,0 +1,19 @@ +/* + * compare.c --- compare whether or not two UUID's are the same + * + * Returns 0 if the two UUID's are different, and 1 if they are the same. + */ + +#include "uuidP.h" + +int uuid_compare(uuid_t uu1, uuid_t uu2) +{ + unsigned char *cp1, *cp2; + int i; + + for (i=0, cp1 = uu1, cp2 = uu2; i < 16; i++) + if (*cp1++ != *cp2++) + return 0; + return 1; +} + diff --git a/lib/uuid/copy.c b/lib/uuid/copy.c new file mode 100644 index 00000000..739e2ddb --- /dev/null +++ b/lib/uuid/copy.c @@ -0,0 +1,14 @@ +/* + * copy.c --- copy UUIDs + */ + +#include "uuidP.h" + +void uuid_copy(uuid_t uu1, uuid_t uu2) +{ + unsigned char *cp1, *cp2; + int i; + + for (i=0, cp1 = uu1, cp2 = uu2; i < 16; i++) + *cp1++ = *cp2++; +} diff --git a/lib/uuid/gen_uuid.c b/lib/uuid/gen_uuid.c new file mode 100644 index 00000000..8eaab4af --- /dev/null +++ b/lib/uuid/gen_uuid.c @@ -0,0 +1,198 @@ +/* + * gen_uuid.c --- generate a DCE-compatible uuid + */ + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#include <string.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/stat.h> +#include <sys/file.h> +#include <sys/ioctl.h> +#include <sys/socket.h> +#ifdef HAVE_SYS_SOCKIO_H +#include <sys/sockio.h> +#endif +#ifdef HAVE_NET_IF_H +#include <net/if.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +#include "uuidP.h" + +#ifdef HAVE_SRANDOM +#define srand(x) srandom(x) +#define rand() random() +#endif + +/* + * Generate a series of random bytes. Use /dev/urandom if possible, + * and if not, use srandom/random. + */ +static void get_random_bytes(void *buf, int nbytes) +{ + static int fd = -2; + int i; + char *cp = (char *) buf; + + if (fd == -2) { + fd = open("/dev/urandom", O_RDONLY); + srand((getpid() << 16) ^ getuid() ^ time(0)); + } + if (fd > 0) { + i = read(fd, cp, nbytes); + if (i == nbytes) + return; + if (i > 0) { + nbytes -= i; + cp += i; + } + } + for (i=0; i < nbytes; i++) + *cp++ = rand() & 0xFF; +} + +/* + * Get the ethernet hardware address, if we can find it... + */ +static int get_node_id(unsigned char *node_id) +{ +#ifdef HAVE_NET_IF_H + int sd; + struct ifreq ifr, *ifrp; + struct ifconf ifc; + char buf[1024]; + int n, i; + unsigned char *a; + +/* + * BSD 4.4 defines the size of an ifreq to be + * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len + * However, under earlier systems, sa_len isn't present, so the size is + * just sizeof(struct ifreq) + */ +#ifdef HAVE_SA_LEN +#ifndef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#endif +#define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) +#else +#define ifreq_size(i) sizeof(struct ifreq) +#endif /* HAVE_SA_LEN*/ + + sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sd < 0) { + return -1; + } + memset(buf, 0, sizeof(buf)); + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { + close(sd); + return -1; + } + n = ifc.ifc_len; + for (i = 0; i < n; i+= ifreq_size(*ifr) ) { + ifrp = (struct ifreq *)((caddr_t) ifc.ifc_buf+i); + strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); +#ifdef SIOCGIFHWADDR + if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) + continue; + a = (unsigned char *) &ifr.ifr_hwaddr.sa_data; +#else +#ifdef SIOCGENADDR + if (ioctl(sd, SIOCGENADDR, &ifr) < 0) + continue; + a = (unsigned char *) ifr.ifr_enaddr; +#else + /* + * XXX we don't have a way of getting the hardware + * address + */ + close(sd); + return 0; +#endif /* SIOCGENADDR */ +#endif /* SIOCGIFHWADDR */ + if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) + continue; + if (node_id) { + memcpy(node_id, a, 6); + close(sd); + return 1; + } + } + close(sd); +#endif + return 0; +} + +/* Assume that the gettimeofday() has microsecond granularity */ +#define MAX_ADJUSTMENT 10 + +static int get_clock(__u32 *clock_high, __u32 *clock_low, __u16 *ret_clock_seq) +{ + static int adjustment = 0; + static struct timeval last = {0, 0}; + static __u16 clock_seq; + struct timeval tv; + unsigned long long clock; + +try_again: + gettimeofday(&tv, 0); + if ((last.tv_sec == 0) && (last.tv_usec == 0)) { + get_random_bytes(&clock_seq, sizeof(clock_seq)); + clock_seq &= 0x1FFF; + last = tv; + last.tv_sec--; + } + if ((tv.tv_sec < last.tv_sec) || + ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec < last.tv_usec))) { + clock_seq = (clock_seq+1) & 0x1FFF; + adjustment = 0; + } else if ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec == last.tv_usec)) { + if (adjustment >= MAX_ADJUSTMENT) + goto try_again; + adjustment++; + } else + adjustment = 0; + + clock = tv.tv_usec*10 + adjustment; + clock += ((unsigned long long) tv.tv_sec)*10000000; + clock += (((unsigned long long) 0x01B21DD2) << 32) + 0x13814000; + + *clock_high = clock >> 32; + *clock_low = clock; + *ret_clock_seq = clock_seq; + return 0; +} + +void uuid_generate(uuid_t out) +{ + static unsigned char node_id[6]; + static int has_init = 0; + struct uuid uu; + __u32 clock_mid; + + if (!has_init) { + if (get_node_id(node_id) <= 0) + get_random_bytes(node_id, 6); + has_init = 1; + } + get_clock(&clock_mid, &uu.time_low, &uu.clock_seq); + uu.clock_seq |= 0x8000; + uu.time_mid = (__u16) clock_mid; + uu.time_hi_and_version = (clock_mid >> 16) | 0x1000; + memcpy(uu.node, node_id, 6); + uuid_pack(&uu, out); +} diff --git a/lib/uuid/isnull.c b/lib/uuid/isnull.c new file mode 100644 index 00000000..f72e8fba --- /dev/null +++ b/lib/uuid/isnull.c @@ -0,0 +1,18 @@ +/* + * isnull.c --- Check whether or not the UUID is null + */ + +#include "uuidP.h" + +/* Returns 1 if the uuid is the NULL uuid */ +int uuid_is_null(uuid_t uu) +{ + unsigned char *cp; + int i; + + for (i=0, cp = uu; i < 16; i++) + if (*cp++) + return 0; + return 1; +} + diff --git a/lib/uuid/pack.c b/lib/uuid/pack.c new file mode 100644 index 00000000..476b7a17 --- /dev/null +++ b/lib/uuid/pack.c @@ -0,0 +1,38 @@ +/* + * Internal routine for packing UUID's + */ + +#include "uuidP.h" + +void uuid_pack(struct uuid *uu, uuid_t ptr) +{ + __u32 tmp; + unsigned char *out = ptr; + + tmp = uu->time_low; + out[3] = (unsigned char) tmp; + tmp >>= 8; + out[2] = (unsigned char) tmp; + tmp >>= 8; + out[1] = (unsigned char) tmp; + tmp >>= 8; + out[0] = (unsigned char) tmp; + + tmp = uu->time_mid; + out[5] = (unsigned char) tmp; + tmp >>= 8; + out[4] = (unsigned char) tmp; + + tmp = uu->time_hi_and_version; + out[7] = (unsigned char) tmp; + tmp >>= 8; + out[6] = (unsigned char) tmp; + + tmp = uu->clock_seq; + out[9] = (unsigned char) tmp; + tmp >>= 8; + out[8] = (unsigned char) tmp; + + memcpy(out+10, uu->node, 6); +} + diff --git a/lib/uuid/parse.c b/lib/uuid/parse.c new file mode 100644 index 00000000..ce3f88db --- /dev/null +++ b/lib/uuid/parse.c @@ -0,0 +1,42 @@ +/* + * parse.c --- UUID parsing + */ + +#include <stdio.h> + +#include "uuidP.h" + +int uuid_parse(char *in, uuid_t uu) +{ + struct uuid uuid; + int i; + char *cp, buf[3]; + + if (strlen(in) != 36) + return -1; + for (i=0, cp = in; i <= 36; i++,cp++) { + if ((i == 8) || (i == 13) || (i == 18) || + (i == 23)) + if (*cp == '-') + continue; + if (i== 36) + if (*cp == 0) + continue; + if (!isxdigit(*cp)) + return -1; + } + uuid.time_low = strtoul(in, NULL, 16); + uuid.time_mid = strtoul(in+9, NULL, 16); + uuid.time_hi_and_version = strtoul(in+14, NULL, 16); + uuid.clock_seq = strtoul(in+19, NULL, 16); + cp = in+24; + buf[2] = 0; + for (i=0; i < 6; i++) { + buf[0] = *cp++; + buf[1] = *cp++; + uuid.node[i] = strtoul(buf, NULL, 16); + } + + uuid_pack(&uuid, uu); + return 0; +} diff --git a/lib/uuid/tst_uuid.c b/lib/uuid/tst_uuid.c new file mode 100644 index 00000000..068eea8d --- /dev/null +++ b/lib/uuid/tst_uuid.c @@ -0,0 +1,52 @@ +#include <stdio.h> +#include <linux/ext2_fs.h> + +#include "uuid.h" + +int +main(int argc, char *argv) +{ + uuid_t buf, tst; + char str[100]; + unsigned char *cp; + int i; + int failed = 0; + + uuid_generate(buf); + uuid_unparse(buf, str); + printf("UUID string = %s\n", str); + printf("UUID: "); + for (i=0, cp = (unsigned char *) &buf; i < 16; i++) { + printf("%02x", *cp++); + } + printf("\n"); + uuid_parse(str, tst); + if (uuid_compare(buf, tst)) + printf("UUID parse and compare succeeded.\n"); + else { + printf("UUID parse and compare failed!\n"); + failed++; + } + uuid_clear(tst); + if (uuid_is_null(tst)) + printf("UUID clear and is null succeeded.\n"); + else { + printf("UUID clear and is null failed!\n"); + failed++; + } + uuid_copy(buf, tst); + if (uuid_compare(buf, tst)) + printf("UUID copy and compare succeeded.\n"); + else { + printf("UUID copy and compare failed!\n"); + failed++; + } + if (failed) { + printf("%d failures.\n", failed); + exit(1); + } + return 0; +} + + + diff --git a/lib/uuid/unpack.c b/lib/uuid/unpack.c new file mode 100644 index 00000000..406587d5 --- /dev/null +++ b/lib/uuid/unpack.c @@ -0,0 +1,32 @@ +/* + * Internal routine for unpacking UUID + */ + +#include "uuidP.h" + +void uuid_unpack(uuid_t in, struct uuid *uu) +{ + __u8 *ptr = in; + __u32 tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_low = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_mid = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_hi_and_version = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->clock_seq = tmp; + + memcpy(uu->node, ptr, 6); +} + diff --git a/lib/uuid/unparse.c b/lib/uuid/unparse.c new file mode 100644 index 00000000..32f79955 --- /dev/null +++ b/lib/uuid/unparse.c @@ -0,0 +1,21 @@ +/* + * uuid_to_str.c -- convert a UUID to string + */ + +#include <stdio.h> + +#include "uuidP.h" + +void uuid_unparse(uuid_t uu, char *out) +{ + struct uuid uuid; + + uuid_unpack(uu, &uuid); + sprintf(out, + "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, + uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, + uuid.node[0], uuid.node[1], uuid.node[2], + uuid.node[3], uuid.node[4], uuid.node[5]); +} + diff --git a/lib/uuid/uuid.h b/lib/uuid/uuid.h new file mode 100644 index 00000000..9568c03f --- /dev/null +++ b/lib/uuid/uuid.h @@ -0,0 +1,29 @@ +/* + * Public include file for the UUID library + */ + +typedef unsigned char uuid_t[16]; + +/* clear.c */ +void uuid_clear(uuid_t uu); + +/* compare.c */ +int uuid_compare(uuid_t uu1, uuid_t uu2); + +/* copy.c */ +void uuid_copy(uuid_t uu1, uuid_t uu2); + +/* gen_uuid.c */ +void uuid_generate(uuid_t out); + +/* isnull.c */ +int uuid_is_null(uuid_t uu); + +/* parse.c */ +int uuid_parse(char *in, uuid_t uu); + +/* unparse.c */ +void uuid_unparse(uuid_t uu, char *out); + + + diff --git a/lib/uuid/uuidP.h b/lib/uuid/uuidP.h new file mode 100644 index 00000000..0ef92614 --- /dev/null +++ b/lib/uuid/uuidP.h @@ -0,0 +1,33 @@ +/* + * uuid.h -- private header file for uuids + */ + +#include <sys/types.h> +#include <linux/types.h> + +#include "uuid.h" + +/* + * Offset between 15-Oct-1582 and 1-Jan-70 + */ +#define TIME_OFFSET_HIGH 0x01B21DD2 +#define TIME_OFFSET_LOW 0x13814000 + +struct uuid { + __u32 time_low; + __u16 time_mid; + __u16 time_hi_and_version; + __u16 clock_seq; + __u8 node[6]; +}; + + +/* + * prototypes + */ +void uuid_pack(struct uuid *uu, uuid_t ptr); +void uuid_unpack(uuid_t in, struct uuid *uu); + + + + |