I have attached 3 patches on rpm-3.0.5 for cygwin-win9x.

1. The patch for for the bug in cygwin-win9x, that it hangs
up at the finding provides step during building a package,

   Finding  Provides: (using /usr/lib/rpm/find-provides)...

, as discussed in the following forum.

   http://pub30.ezboard.com/fcygwinfrm1.showMessage?topicID=2.topic

This is because rpm will wait for EOF of the output piped from the
"find-provides" program, but win9x can't detect an EOF on that
non-blocking pipe.

2. The next patch is a fix for the problem that cygwin interprete the
path, such as "//usr/bin/abc", as a samba path, so that it can't
access the file "/usr/bin/abc".  This problem has been fixed by
Michael Ring <[EMAIL PROTECTED]>, but with -V or --verity option, it
hasn't been fixed.  When rpm is invoked like,

   $ rpm -V <package-name>

, rpm always report every files in the package as a "missing" file.

3. Next, I have fixed calling utime() on a read-only file.  The
problem is that cygwin can't touch a read-only file.  Michael Ring has
fixed this by ignore any error return from utime(), but this will
cause the files with read-only permission been installed with an
incorrect timestamp.  So, I fixed this problem by first chmod u+w
every files before calling utime(), after utime()-ing I set the file
permission back to what it should be.



I have built my own rpm package with my patch base on
"rpm-3.0.5-27mdk.src.rpm" from Mandrake 7.2.  My package also includes
some patch about BUFSIZ, find-provides and find-requires from Michael
Ring.

The .tgz binary version is available at,

   http://naist.cpe.ku.ac.th/~ans/release/cygwin/tar/

The .rpm binary versions are available at,

   http://naist.cpe.ku.ac.th/~ans/release/cygwin/RPMS/

The .src.rpm version is available at,

   http://naist.cpe.ku.ac.th/~ans/release/cygwin/SRPMS/
--- rpm-3.0.5.orig/build/files.c        Mon Jul 10 04:33:50 2000
+++ rpm-3.0.5.developed/build/files.c   Wed Jan 24 20:54:08 2001
@@ -1529,6 +1529,24 @@ int processSourceFiles(Spec spec)
     return fl.processingFailed;
 }
 
+#if 0 && defined(_WIN9X) && defined(__CYGWIN__)
+static int piped_child_pid = 0;
+static int piped_child_die = 0;
+static void piped_child_handler(int signum) {
+   pid_t child_pid;
+   for (; (child_pid = waitpid(-1, NULL, WNOHANG)) > 0; ) {
+      if (child_pid == piped_child_pid) piped_child_die = 1;
+   };
+/*   if (
+      piped_child_pid > 0 &&
+      piped_child_pid == waitpid(piped_child_pid, NULL, WNOHANG)
+   ) {
+   } else {
+      if (old_child_handler) (*old_child_handler)(signum);
+   };*/
+};
+#endif
+
 static StringBuf getOutputFrom(char *dir, char *argv[],
                        const char *writePtr, int writeBytesLeft,
                        int failNonZero)
@@ -1540,6 +1558,9 @@ static StringBuf getOutputFrom(char *dir
     void *oldhandler;
     StringBuf readBuff;
     int done;
+#if defined(_WIN9X) && defined(__CYGWIN__)
+    int has_waited = 0;
+#endif
 
     oldhandler = signal(SIGPIPE, SIG_IGN);
 
@@ -1638,6 +1659,27 @@ top:
 
        /* terminate on (non-blocking) EOF or error */
        done = (nbr == 0 || (nbr < 0 && errno != EAGAIN));
+#if defined(_WIN9X) && defined(__CYGWIN__)
+        /* fix for cygwin on win9x which can't determine EOF on a
+        non-blocking pipe */
+        if (
+           /* nbr < 0 && errno == EAGAIN && */
+           !done && nbr < 0 &&
+           !has_waited && waitpid(progPID, &status, WNOHANG) == progPID
+        ) {
+           long old_flag = fcntl(fromProg[0], F_GETFL);
+           fcntl(fromProg[0], F_SETFL, old_flag & ~O_NONBLOCK);
+           /* Read the remaining data from prog */
+           {   char buf[BUFSIZ+1];
+               while ((nbr = read(fromProg[0], buf, sizeof(buf)-1)) > 0) {
+                   buf[nbr] = '\0';
+                   appendStringBuf(readBuff, buf);
+               }
+           }
+           has_waited = 1;
+           done = 1;
+        };
+#endif
 
     } while (!done);
 
@@ -1649,6 +1691,9 @@ top:
     (void)signal(SIGPIPE, oldhandler);
 
     /* Collect status from prog */
+#if defined(_WIN9X) && defined(__CYGWIN__)
+    if (!has_waited)
+#endif
     (void)waitpid(progPID, &status, 0);
     if (failNonZero && (!WIFEXITED(status) || WEXITSTATUS(status))) {
        rpmError(RPMERR_EXEC, _("%s failed"), argv[0]);
--- rpm-3.0.5.orig/lib/rpmdb.c  Tue Jan 23 16:54:48 2001
+++ rpm-3.0.5.developed/lib/rpmdb.c     Wed Jan 24 23:58:18 2001
@@ -81,6 +81,12 @@ static int openDbFile(const char * prefi
     }
     strcat(filename, dbpath);
     strcat(filename, shortName);
+#if defined(__CYGWIN__)
+    /* fix for the error message like,
+    "cannot open file //var/lib/rpm/nameindex.rpm: No such host or network path"
+    , that cygwin interprete //var/lib as a samba path */
+    rpmCleanPath(filename);
+#endif
 
     if (!justCheck || !rpmfileexists(filename)) {
        *db = dbiOpenIndex(filename, mode, perms, type);
--- rpm-3.0.5.orig/lib/uninstall.c      Tue Jul 11 01:30:46 2000
+++ rpm-3.0.5.developed/lib/uninstall.c Wed Jan 24 22:59:12 2001
@@ -171,7 +171,15 @@ int removeBinaryPackage(const char * pre
        if (prefixlen) {
            strcpy(fileName, prefix);
            rpmCleanPath(fileName);
+#if defined(__CYGWIN__)
+            /* fix for the error message like,
+            "cannot open file //var/lib/rpm/nameindex.rpm: No such host or network 
+path"
+            , that cygwin interprete //var/lib as a samba path */
+           prefixlen = (fileName && !(fileName[0] == '/' && fileName[1] == '\0'))
+                       ? strlen(fileName) : 0;
+#else
            prefixlen = strlen(fileName);
+#endif
        } else
            *fileName = '\0';
 
--- rpm-3.0.5.orig/lib/verify.c Wed Jun 14 19:34:32 2000
+++ rpm-3.0.5.developed/lib/verify.c    Thu Jan 25 02:07:56 2001
@@ -102,6 +102,12 @@ int rpmVerifyFile(const char * prefix, H
                      strlen(baseNames[filenum]) + strlen(prefix) + 5);
     sprintf(filespec, "%s/%s%s", prefix, dirNames[dirIndexes[filenum]],
                baseNames[filenum]);
+#if defined(__CYGWIN__)
+    /* fix for the error message like,
+    "cannot open file //var/lib/rpm/nameindex.rpm: No such host or network path"
+    , that cygwin interprete //var/lib as a samba path */
+    rpmCleanPath(filespec);
+#endif
     free(baseNames);
     free(dirNames);
     
--- rpm-3.0.5.orig/lib/cpio.c   Mon Jul 17 07:04:56 2000
+++ rpm-3.0.5.developed/lib/cpio.c      Fri Jan 26 02:08:50 2001
@@ -269,10 +269,19 @@ static int setInfo(struct cpioHeader * h
     if (!S_ISLNK(hdr->mode)) {
        if (!getuid() && chown(hdr->path, hdr->uid, hdr->gid))
            rc = CPIOERR_CHOWN_FAILED;
+#if defined(__CYGWIN__)
+       if (!rc && chmod(hdr->path, (hdr->mode|S_IWUSR) & 07777))
+           rc = CPIOERR_CHMOD_FAILED;
+       if (!rc && utime(hdr->path, &stamp))
+           rc = CPIOERR_UTIME_FAILED;
+       if (!rc && chmod(hdr->path, hdr->mode & 07777))
+           rc = CPIOERR_CHMOD_FAILED;
+#else
        if (!rc && chmod(hdr->path, hdr->mode & 07777))
            rc = CPIOERR_CHMOD_FAILED;
        if (!rc && utime(hdr->path, &stamp))
            rc = CPIOERR_UTIME_FAILED;
+#endif
     } else {
 #       if ! CHOWN_FOLLOWS_SYMLINK
            if (!getuid() && !rc && lchown(hdr->path, hdr->uid, hdr->gid))
@@ -428,6 +437,12 @@ static int expandSymlink(FD_t cfd, const
     return 0;
 }
 
+#if defined(__CYGWIN__)
+int    _EXFUN(mknod,( const char *_path, mode_t _mode, dev_t dev ));
+int    _EXFUN(mkfifo,( const char *__path, mode_t __mode )) {
+   return mknod(__path, __mode | S_IFIFO, 0);
+};
+#endif
 /** */
 static int expandFifo( /*@unused@*/ FD_t cfd, const struct cpioHeader * hdr)
 {

Reply via email to