From dbcd49aae387a3405011e8f8c8ecbdae8d1d06e4 Mon Sep 17 00:00:00 2001 From: Jindrich Novy Date: Tue, 15 Dec 2009 14:57:01 +0000 Subject: [PATCH] - fix rpmvfs empty directory handling (#529645) - fix bindings (#532784) --- mc-extensions.patch | 80 ++++++-- mc-rpmvfs.patch | 455 ++++++++++++++++++++++++++++++++++++++++++++ mc.spec | 12 +- 3 files changed, 524 insertions(+), 23 deletions(-) create mode 100644 mc-rpmvfs.patch diff --git a/mc-extensions.patch b/mc-extensions.patch index 9322c5f..5cce02c 100644 --- a/mc-extensions.patch +++ b/mc-extensions.patch @@ -1,7 +1,7 @@ -diff -up mc-4.7.0-pre1/configure.ac.extensions mc-4.7.0-pre1/configure.ac ---- mc-4.7.0-pre1/configure.ac.extensions 2009-07-31 18:36:24.000000000 +0200 -+++ mc-4.7.0-pre1/configure.ac 2009-08-05 12:51:08.000000000 +0200 -@@ -67,7 +67,7 @@ AC_PROG_LN_S +diff -up mc-4.7.0-pre4/configure.ac.extensions mc-4.7.0-pre4/configure.ac +--- mc-4.7.0-pre4/configure.ac.extensions 2009-10-30 19:44:38.000000000 +0100 ++++ mc-4.7.0-pre4/configure.ac 2009-12-10 20:41:43.000000000 +0100 +@@ -69,7 +69,7 @@ AC_PROG_LN_S AC_CHECK_TOOL(AR, ar, ar) dnl Only list browsers here that can be run in background (i.e. with `&') @@ -10,10 +10,10 @@ diff -up mc-4.7.0-pre1/configure.ac.extensions mc-4.7.0-pre1/configure.ac dnl dnl Ovverriding mmap support. This has to be before AC_FUNC_MMAP is used. -diff -up mc-4.7.0-pre1/misc/mc.ext.in.extensions mc-4.7.0-pre1/misc/mc.ext.in ---- mc-4.7.0-pre1/misc/mc.ext.in.extensions 2009-06-23 20:55:11.000000000 +0200 -+++ mc-4.7.0-pre1/misc/mc.ext.in 2009-08-05 13:01:48.000000000 +0200 -@@ -221,8 +221,8 @@ regex/\.rpm$ +diff -up mc-4.7.0-pre4/misc/mc.ext.in.extensions mc-4.7.0-pre4/misc/mc.ext.in +--- mc-4.7.0-pre4/misc/mc.ext.in.extensions 2009-10-29 20:02:37.000000000 +0100 ++++ mc-4.7.0-pre4/misc/mc.ext.in 2009-12-10 20:46:47.000000000 +0100 +@@ -226,8 +226,8 @@ regex/\.rpm$ # deb regex/\.u?deb$ @@ -24,7 +24,26 @@ diff -up mc-4.7.0-pre1/misc/mc.ext.in.extensions mc-4.7.0-pre1/misc/mc.ext.in # dpkg shell/.debd -@@ -397,11 +397,16 @@ regex/\.([wW][aA][wW]22)$ +@@ -387,7 +387,7 @@ shell/.ico + Include=image + + include/image +- Open=if [ "$DISPLAY" = "" ]; then zgv %f; else (gqview %f &); fi ++ Open=if [ "$DISPLAY" = "" ]; then zgv %f; else (eog %f &); fi + View=%view{ascii} identify %f + #View=%view{ascii} asciiview %f + +@@ -395,7 +395,8 @@ include/image + ### Sound files ### + + regex/\.([wW][aA][vV]|[sS][nN][dD]|[vV][oO][cC]|[aA][uU]|[sS][mM][pP]|[aA][iI][fF][fF]|[sS][nN][dD])$ +- Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi ++ Include=audio ++# Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi + + regex/\.([mM][oO][dD]|[sS]3[mM]|[xX][mM]|[iI][tT]|[mM][tT][mM]|669|[sS][tT][mM]|[uU][lL][tT]|[fF][aA][rR])$ + Open=mikmod %f +@@ -405,15 +406,22 @@ regex/\.([wW][aA][wW]22)$ Open=vplay -s 22 %f regex/\.([mM][pP]3)$ @@ -39,12 +58,19 @@ diff -up mc-4.7.0-pre1/misc/mc.ext.in.extensions mc-4.7.0-pre1/misc/mc.ext.in regex/\.([oO][gG][gG|aA|vV|xX])$ - Open=if [ "$DISPLAY" = "" ]; then ogg123 %f; else (xmms %f >/dev/null 2>&1 &); fi -+ Open=ogg123 %f ++ Include=audio ++# Open=ogg123 %f +# Open=if [ "$DISPLAY" = "" ]; then ogg123 %f; else (xmms %f >/dev/null 2>&1 &); fi View=%view{ascii} ogginfo %s regex/\.([sS][pP][xX]|[fF][lL][aA][cC])$ -@@ -414,11 +419,15 @@ regex/\.([wW][mM][aA])$ +- Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi ++ Include=audio ++# Open=if [ "$DISPLAY" = "" ]; then play %f; else (xmms %f >/dev/null 2>&1 &); fi + + regex/\.([mM][iI][dD][iI]?|[rR][mM][iI][dD]?)$ + Open=timidity %f +@@ -422,11 +430,15 @@ regex/\.([wW][mM][aA])$ Open=mplayer -vo null %f View=%view{ascii} mplayer -quiet -slave -frames 0 -vo null -ao null -identify %f 2>/dev/null | tail +13 || file %f @@ -61,17 +87,31 @@ diff -up mc-4.7.0-pre1/misc/mc.ext.in.extensions mc-4.7.0-pre1/misc/mc.ext.in ### Video ### -@@ -432,6 +441,9 @@ regex/\.([aA][sS][fFxX])$ - regex/\.([dD][iI][vV][xX])$ - Include=video +@@ -471,12 +486,12 @@ include/video -+regex/\.([mM][kK][vV])$ -+ Include=video -+ - regex/\.([mM][oO][vV]|[qQ][tT])$ - Include=video + # Postscript + type/^PostScript +- Open=(gv %f &) ++ Open=(xdg-open %f &) + View=%view{ascii} ps2ascii %f -@@ -496,22 +508,27 @@ shell/.abw + # PDF + type/^PDF +- Open=(xpdf %f &) ++ Open=(xdg-open %f &) + #Open=(acroread %f &) + #Open=(ghostview %f &) + View=%view{ascii} pdftotext %f - +@@ -486,7 +501,7 @@ type/^PDF + + # html + regex/\.([hH][tT][mM][lL]?)$ +- Open=(if test -n "@X11_WWW@" && test -n "$DISPLAY"; then (@X11_WWW@ file://%d/%p &) 1>&2; else links %f || lynx -force_html %f || ${PAGER:-more} %f; fi) 2>/dev/null ++ Open=(if test -n "$DISPLAY"; then (xdg-open file://%d/%p &) 1>&2; else links %f || lynx -force_html %f || ${PAGER:-more} %f; fi) 2>/dev/null + View=%view{ascii} links -dump %f 2>/dev/null || w3m -dump %f 2>/dev/null || lynx -dump -force_html %f + + # StarOffice 5.2 +@@ -504,22 +519,27 @@ shell/.abw # Microsoft Word Document regex/\.([Dd][oO][cCtT]|[Ww][rR][iI])$ diff --git a/mc-rpmvfs.patch b/mc-rpmvfs.patch new file mode 100644 index 0000000..ab7f7d6 --- /dev/null +++ b/mc-rpmvfs.patch @@ -0,0 +1,455 @@ +commit 698385bdd0bfb485bcc42a634f86a8cd0ffae564 +Author: Andrew Borodin +Date: Wed Nov 18 16:26:24 2009 +0300 + + Ticket #1732: cpio VFS skips empty directories in the root of archive + + Initial step: some optimization and type accuracy. + + Signed-off-by: Andrew Borodin + +diff --git a/vfs/cpio.c b/vfs/cpio.c +index 5eeef95..8c24573 100644 +--- a/vfs/cpio.c ++++ b/vfs/cpio.c +@@ -103,7 +103,6 @@ struct defer_inode { + static int cpio_position; + + static int cpio_find_head(struct vfs_class *me, struct vfs_s_super *super); +-static int cpio_create_entry(struct vfs_class *me, struct vfs_s_super *super, struct stat *, char *name); + static ssize_t cpio_read_bin_head(struct vfs_class *me, struct vfs_s_super *super); + static ssize_t cpio_read_oldc_head(struct vfs_class *me, struct vfs_s_super *super); + static ssize_t cpio_read_crc_head(struct vfs_class *me, struct vfs_s_super *super); +@@ -234,8 +233,8 @@ static int cpio_find_head(struct vfs_class *me, struct vfs_s_super *super) + { + char buf[256]; + int ptr = 0; +- int top; +- int tmp; ++ ssize_t top; ++ ssize_t tmp; + + top = mc_read (super->u.arch.fd, buf, 256); + if (top > 0) +@@ -271,6 +270,140 @@ static int cpio_find_head(struct vfs_class *me, struct vfs_s_super *super) + #undef RETURN + #undef SEEKBACK + ++static int ++cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, ++ struct stat *st, char *name) ++{ ++ struct vfs_s_inode *inode = NULL; ++ struct vfs_s_inode *root = super->root; ++ struct vfs_s_entry *entry = NULL; ++ char *tn; ++ ++ switch (st->st_mode & S_IFMT) { /* For case of HP/UX archives */ ++ case S_IFCHR: ++ case S_IFBLK: ++#ifdef S_IFSOCK ++ case S_IFSOCK: ++#endif ++#ifdef S_IFIFO ++ case S_IFIFO: ++#endif ++#ifdef S_IFNAM ++ case S_IFNAM: ++#endif ++ if ((st->st_size != 0) && (st->st_rdev == 0x0001)) { ++ /* FIXME: representation of major/minor differs between */ ++ /* different operating systems. */ ++ st->st_rdev = (unsigned) st->st_size; ++ st->st_size = 0; ++ } ++ break; ++ default: ++ break; ++ } ++ ++ if ((st->st_nlink > 1) ++ && ((super->u.arch.type == CPIO_NEWC) ++ || (super->u.arch.type == CPIO_CRC))) { /* For case of hardlinked files */ ++ struct defer_inode i, *l; ++ i.inumber = st->st_ino; ++ i.device = st->st_dev; ++ i.inode = NULL; ++ ++ l = cpio_defer_find (super->u.arch.deferred, &i); ++ if (l != NULL) { ++ inode = l->inode; ++ if (inode->st.st_size != 0 && st->st_size != 0 ++ && (inode->st.st_size != st->st_size)) { ++ message (D_ERROR, MSG_ERROR, ++ _("Inconsistent hardlinks of\n%s\nin cpio archive\n%s"), ++ name, super->name); ++ inode = NULL; ++ } else if (inode->st.st_size == 0) ++ inode->st.st_size = st->st_size; ++ } ++ } ++ ++ /* remove trailing slashes */ ++ for (tn = name + strlen (name) - 1; tn >= name && *tn == PATH_SEP; tn--) ++ *tn = '\0'; ++ ++ tn = strrchr (name, PATH_SEP); ++ if (tn == NULL) ++ tn = name; ++ else { ++ *tn = '\0'; ++ root = vfs_s_find_inode (me, super, name, LINK_FOLLOW, FL_MKDIR); ++ *tn = PATH_SEP; ++ tn++; ++ } ++ ++ entry = MEDATA->find_entry (me, root, tn, LINK_FOLLOW, FL_NONE); /* In case entry is already there */ ++ ++ if (entry != NULL) { ++ /* This shouldn't happen! (well, it can happen if there is a record for a ++ file and than a record for a directory it is in; cpio would die with ++ 'No such file or directory' is such case) */ ++ ++ if (!S_ISDIR (entry->ino->st.st_mode)) { ++ /* This can be considered archive inconsistency */ ++ message (D_ERROR, MSG_ERROR, ++ _("%s contains duplicate entries! Skipping!"), ++ super->name); ++ } else { ++ entry->ino->st.st_mode = st->st_mode; ++ entry->ino->st.st_uid = st->st_uid; ++ entry->ino->st.st_gid = st->st_gid; ++ entry->ino->st.st_atime = st->st_atime; ++ entry->ino->st.st_mtime = st->st_mtime; ++ entry->ino->st.st_ctime = st->st_ctime; ++ } ++ ++ g_free (name); ++ } else { /* !entry */ ++ if (inode == NULL) { ++ inode = vfs_s_new_inode (me, super, st); ++ if ((st->st_nlink > 0) ++ && ((super->u.arch.type == CPIO_NEWC) ++ || (super->u.arch.type == CPIO_CRC))) { ++ /* For case of hardlinked files */ ++ struct defer_inode *i; ++ i = g_new (struct defer_inode, 1); ++ i->inumber = st->st_ino; ++ i->device = st->st_dev; ++ i->inode = inode; ++ i->next = super->u.arch.deferred; ++ super->u.arch.deferred = i; ++ } ++ } ++ ++ if (st->st_size != 0) ++ inode->data_offset = CPIO_POS (super); ++ ++ entry = vfs_s_new_entry (me, tn, inode); ++ vfs_s_insert_entry (me, root, entry); ++ ++ g_free (name); ++ ++ if (!S_ISLNK (st->st_mode)) ++ CPIO_SEEK_CUR (super, st->st_size); ++ else { ++ inode->linkname = g_malloc (st->st_size + 1); ++ ++ if (mc_read (super->u.arch.fd, inode->linkname, st->st_size) < st->st_size) { ++ inode->linkname[0] = '\0'; ++ return STATUS_EOF; ++ } ++ ++ inode->linkname[st->st_size] = '\0'; /* Linkname stored without terminating \0 !!! */ ++ CPIO_POS (super) += st->st_size; ++ cpio_skip_padding (super); ++ } ++ } /* !entry */ ++ ++ return STATUS_OK; ++} ++ + #define HEAD_LENGTH (26) + static ssize_t cpio_read_bin_head(struct vfs_class *me, struct vfs_s_super *super) + { +@@ -278,7 +411,7 @@ static ssize_t cpio_read_bin_head(struct vfs_class *me, struct vfs_s_super *supe + struct old_cpio_header buf; + short shorts[HEAD_LENGTH >> 1]; + } u; +- int len; ++ ssize_t len; + char *name; + struct stat st; + +@@ -333,7 +466,7 @@ static ssize_t cpio_read_oldc_head(struct vfs_class *me, struct vfs_s_super *sup + struct stat st; + char buf[HEAD_LENGTH + 1]; + } u; +- int len; ++ ssize_t len; + char *name; + + if (mc_read (super->u.arch.fd, u.buf, HEAD_LENGTH) != HEAD_LENGTH) +@@ -385,25 +518,28 @@ static ssize_t cpio_read_oldc_head(struct vfs_class *me, struct vfs_s_super *sup + #undef HEAD_LENGTH + + #define HEAD_LENGTH (110) +-static ssize_t cpio_read_crc_head(struct vfs_class *me, struct vfs_s_super *super) ++static ssize_t ++cpio_read_crc_head (struct vfs_class *me, struct vfs_s_super *super) + { + struct new_cpio_header hd; + union { + struct stat st; + char buf[HEAD_LENGTH + 1]; + } u; +- int len; ++ ssize_t len; + char *name; + + if (mc_read (super->u.arch.fd, u.buf, HEAD_LENGTH) != HEAD_LENGTH) + return STATUS_EOF; ++ + CPIO_POS (super) += HEAD_LENGTH; +- u.buf[HEAD_LENGTH] = 0; ++ u.buf[HEAD_LENGTH] = '\0'; + + if (sscanf (u.buf, "%6ho%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx%8lx", + &hd.c_magic, &hd.c_ino, &hd.c_mode, &hd.c_uid, &hd.c_gid, + &hd.c_nlink, &hd.c_mtime, &hd.c_filesize, +- (unsigned long *)&hd.c_dev, (unsigned long *)&hd.c_devmin, (unsigned long *)&hd.c_rdev, (unsigned long *)&hd.c_rdevmin, ++ (unsigned long *)&hd.c_dev, (unsigned long *)&hd.c_devmin, ++ (unsigned long *)&hd.c_rdev, (unsigned long *)&hd.c_rdevmin, + &hd.c_namesize, &hd.c_chksum) < 14) { + message (D_ERROR, MSG_ERROR, _("Corrupted cpio header encountered in\n%s"), + super->name); +@@ -421,8 +557,9 @@ static ssize_t cpio_read_crc_head(struct vfs_class *me, struct vfs_s_super *supe + } + + name = g_malloc(hd.c_namesize); +- if((len = mc_read (super->u.arch.fd, name, hd.c_namesize)) == -1 || +- (unsigned long) len < hd.c_namesize) { ++ len = mc_read (super->u.arch.fd, name, hd.c_namesize); ++ ++ if ((len == -1) || ((unsigned long) len < hd.c_namesize)) { + g_free (name); + return STATUS_EOF; + } +@@ -430,7 +567,7 @@ static ssize_t cpio_read_crc_head(struct vfs_class *me, struct vfs_s_super *supe + CPIO_POS(super) += len; + cpio_skip_padding(super); + +- if(!strcmp("TRAILER!!!", name)) { /* We got to the last record */ ++ if (strcmp ("TRAILER!!!", name) == 0) { /* We got to the last record */ + g_free(name); + return STATUS_TRAIL; + } +@@ -448,128 +585,6 @@ static ssize_t cpio_read_crc_head(struct vfs_class *me, struct vfs_s_super *supe + return cpio_create_entry (me, super, &u.st, name); + } + +-static int +-cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, +- struct stat *st, char *name) +-{ +- struct vfs_s_inode *inode = NULL; +- struct vfs_s_inode *root = super->root; +- struct vfs_s_entry *entry = NULL; +- char *tn; +- +- switch (st->st_mode & S_IFMT) { /* For case of HP/UX archives */ +- case S_IFCHR: +- case S_IFBLK: +-#ifdef S_IFSOCK +- case S_IFSOCK: +-#endif +-#ifdef S_IFIFO +- case S_IFIFO: +-#endif +-#ifdef S_IFNAM +- case S_IFNAM: +-#endif +- if ((st->st_size != 0) && (st->st_rdev == 0x0001)) { +- /* FIXME: representation of major/minor differs between */ +- /* different operating systems. */ +- st->st_rdev = (unsigned) st->st_size; +- st->st_size = 0; +- } +- break; +- default: +- break; +- } +- +- if ((st->st_nlink > 1) && (super->u.arch.type == CPIO_NEWC || super->u.arch.type == CPIO_CRC)) { /* For case of hardlinked files */ +- struct defer_inode i, *l; +- i.inumber = st->st_ino; +- i.device = st->st_dev; +- i.inode = NULL; +- if ((l = cpio_defer_find (super->u.arch.deferred, &i)) != NULL) { +- inode = l->inode; +- if (inode->st.st_size && st->st_size +- && (inode->st.st_size != st->st_size)) { +- message (D_ERROR, MSG_ERROR, +- _ +- ("Inconsistent hardlinks of\n%s\nin cpio archive\n%s"), +- name, super->name); +- inode = NULL; +- } else if (!inode->st.st_size) +- inode->st.st_size = st->st_size; +- } +- } +- +- for (tn = name + strlen (name) - 1; tn >= name && *tn == PATH_SEP; tn--) +- *tn = 0; +- if ((tn = strrchr (name, PATH_SEP))) { +- *tn = 0; +- root = vfs_s_find_inode (me, super, name, LINK_FOLLOW, FL_MKDIR); +- *tn = PATH_SEP; +- tn++; +- } else +- tn = name; +- +- entry = MEDATA->find_entry (me, root, tn, LINK_FOLLOW, FL_NONE); /* In case entry is already there */ +- +- if (entry) { /* This shouldn't happen! (well, it can happen if there is a record for a +- file and than a record for a directory it is in; cpio would die with +- 'No such file or directory' is such case) */ +- +- if (!S_ISDIR (entry->ino->st.st_mode)) { /* This can be considered archive inconsistency */ +- message (D_ERROR, MSG_ERROR, +- _("%s contains duplicate entries! Skipping!"), +- super->name); +- } else { +- entry->ino->st.st_mode = st->st_mode; +- entry->ino->st.st_uid = st->st_uid; +- entry->ino->st.st_gid = st->st_gid; +- entry->ino->st.st_atime = st->st_atime; +- entry->ino->st.st_mtime = st->st_mtime; +- entry->ino->st.st_ctime = st->st_ctime; +- } +- +- } else { /* !entry */ +- +- if (!inode) { +- inode = vfs_s_new_inode (me, super, st); +- if ((st->st_nlink > 0) && (super->u.arch.type == CPIO_NEWC || super->u.arch.type == CPIO_CRC)) { /* For case of hardlinked files */ +- struct defer_inode *i; +- i = g_new (struct defer_inode, 1); +- i->inumber = st->st_ino; +- i->device = st->st_dev; +- i->inode = inode; +- i->next = super->u.arch.deferred; +- super->u.arch.deferred = i; +- } +- } +- +- if (st->st_size) +- inode->data_offset = CPIO_POS (super); +- +- entry = vfs_s_new_entry (me, tn, inode); +- vfs_s_insert_entry (me, root, entry); +- +- if (S_ISLNK (st->st_mode)) { +- inode->linkname = g_malloc (st->st_size + 1); +- if (mc_read (super->u.arch.fd, inode->linkname, st->st_size) +- < st->st_size) { +- inode->linkname[0] = 0; +- g_free (name); +- return STATUS_EOF; +- } +- inode->linkname[st->st_size] = 0; /* Linkname stored without terminating \0 !!! */ +- CPIO_POS (super) += st->st_size; +- cpio_skip_padding (super); +- } else { +- CPIO_SEEK_CUR (super, st->st_size); +- } +- +- } /* !entry */ +- +- g_free (name); +- return STATUS_OK; +-} +- + /* Need to CPIO_SEEK_CUR to skip the file at the end of add entry!!!! */ + + static int +diff --git a/vfs/direntry.c b/vfs/direntry.c +index f7a8bfb..80b0b12 100644 +--- a/vfs/direntry.c ++++ b/vfs/direntry.c +@@ -400,12 +400,12 @@ vfs_s_find_inode (struct vfs_class *me, const struct vfs_s_super *super, + const char *path, int follow, int flags) + { + struct vfs_s_entry *ent; +- if (!(MEDATA->flags & VFS_S_REMOTE) && (!*path)) ++ ++ if (((MEDATA->flags & VFS_S_REMOTE) == 0) && (*path == '\0')) + return super->root; ++ + ent = (MEDATA->find_entry) (me, super->root, path, follow, flags); +- if (!ent) +- return NULL; +- return ent->ino; ++ return (ent != NULL) ? ent->ino : NULL; + } + + /* Ook, these were functions around directory entries / inodes */ +@@ -488,9 +488,8 @@ vfs_s_get_path_mangle (struct vfs_class *me, char *inname, + + for (super = MEDATA->supers; super != NULL; super = super->next) { + /* 0 == other, 1 == same, return it, 2 == other but stop scanning */ +- int i; +- if ((i = +- MEDATA->archive_same (me, super, archive_name, op, cookie))) { ++ int i = MEDATA->archive_same (me, super, archive_name, op, cookie); ++ if (i != 0) { + if (i == 1) + goto return_success; + else +diff --git a/vfs/vfs.c b/vfs/vfs.c +index 7c1de54..f8eb7a1 100644 +--- a/vfs/vfs.c ++++ b/vfs/vfs.c +@@ -1124,7 +1124,8 @@ static char * + mc_def_getlocalcopy (const char *filename) + { + char *tmp; +- int fdin, fdout, i; ++ int fdin, fdout; ++ ssize_t i; + char buffer[8192]; + struct stat mystat; + +commit f84917a188f6f88cdc0d0d0067beefc13d42f40a +Author: Andrew Borodin +Date: Thu Nov 19 10:51:21 2009 +0300 + + Fixed skip of empty directories in the root of cpio archive. + + Signed-off-by: Andrew Borodin + +diff --git a/vfs/cpio.c b/vfs/cpio.c +index 8c24573..0af9cda 100644 +--- a/vfs/cpio.c ++++ b/vfs/cpio.c +@@ -331,7 +331,10 @@ cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, + tn = strrchr (name, PATH_SEP); + if (tn == NULL) + tn = name; +- else { ++ else if (tn == name + 1) { ++ /* started with "./" -- directory in the root of archive */ ++ tn++; ++ } else { + *tn = '\0'; + root = vfs_s_find_inode (me, super, name, LINK_FOLLOW, FL_MKDIR); + *tn = PATH_SEP; +@@ -341,7 +344,7 @@ cpio_create_entry (struct vfs_class *me, struct vfs_s_super *super, + entry = MEDATA->find_entry (me, root, tn, LINK_FOLLOW, FL_NONE); /* In case entry is already there */ + + if (entry != NULL) { +- /* This shouldn't happen! (well, it can happen if there is a record for a ++ /* This shouldn't happen! (well, it can happen if there is a record for a + file and than a record for a directory it is in; cpio would die with + 'No such file or directory' is such case) */ + diff --git a/mc.spec b/mc.spec index 936c49f..a14b2e9 100644 --- a/mc.spec +++ b/mc.spec @@ -1,7 +1,7 @@ Summary: User-friendly text console file manager and visual shell Name: mc Version: 4.7.0 -Release: 0.7.pre4%{?dist} +Release: 0.8.pre4%{?dist} Epoch: 1 License: GPLv2 Group: System Environment/Shells @@ -12,7 +12,8 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: glib2-devel e2fsprogs-devel slang-devel gpm-devel Requires: dev >= 3.3-3 -Patch2: mc-extensions.patch +Patch0: mc-extensions.patch +Patch1: mc-rpmvfs.patch %description Midnight Commander is a visual shell much like a file manager, only @@ -23,7 +24,8 @@ specific files. %prep %setup -q -n mc-%{version}-pre4 -%patch2 -p1 -b .extensions +%patch0 -p1 -b .extensions +%patch1 -p1 -b .rpmvfs %build export CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $RPM_OPT_FLAGS" @@ -79,6 +81,10 @@ rm -rf $RPM_BUILD_ROOT %dir %{_libexecdir}/mc %changelog +* Tue Dec 15 2009 Jindrich Novy 4.7.0-0.8.pre4 +- fix rpmvfs empty directory handling (#529645) +- fix bindings (#532784) + * Mon Nov 02 2009 Jindrich Novy 4.7.0-0.7.pre4 - update to 4.7.0-pre4