Hi!

Not sure if the savannah BTS was the appropiate place to send patches, so
sending it here as well (http://savannah.gnu.org/patch/index.php?6217).

This patch allows for cpio to be compiled on mingw32 ("./configure --host
i586-mingw32msvc && make").

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/configure.ac cpio-2.9/configure.ac
--- cpio-2.9.old/configure.ac	2007-06-29 12:14:40.000000000 +0200
+++ cpio-2.9/configure.ac	2007-09-23 12:27:30.000000000 +0200
@@ -45,7 +45,7 @@
 AC_HEADER_STDC
 AC_HEADER_DIRENT
 
-AC_CHECK_FUNCS([fchmod fchown])
+AC_CHECK_FUNCS([fchmod fchown chown link symlink getuid geteuid mknod makedev pipe])
 
 # gnulib modules
 gl_INIT
@@ -61,7 +61,7 @@
   no)  ;;
   esac])
 
-AC_CHECK_HEADERS(unistd.h stdlib.h string.h fcntl.h sys/io/trioctl.h utmp.h getopt.h locale.h libintl.h sys/wait.h utime.h locale.h)
+AC_CHECK_HEADERS(unistd.h stdlib.h string.h fcntl.h sys/io/trioctl.h utmp.h getopt.h locale.h libintl.h sys/wait.h utime.h locale.h process.h pwd.h grp.h sys/ioctl.h)
 
 AC_MSG_CHECKING(for sys_errlist and sys_nerr)
 AC_TRY_RUN(
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/lib/chown.c cpio-2.9/lib/chown.c
--- cpio-2.9.old/lib/chown.c	2007-03-21 07:55:17.000000000 +0100
+++ cpio-2.9/lib/chown.c	2007-09-23 12:23:34.000000000 +0200
@@ -30,6 +30,8 @@
 #include <fcntl.h>
 #include <errno.h>
 
+#include "system.h"	/* unimplemented_stub */
+
 /* Below we refer to the system's chown().  */
 #undef chown
 
@@ -47,6 +49,9 @@
 int
 rpl_chown (const char *file, uid_t uid, gid_t gid)
 {
+#ifndef HAVE_CHOWN
+  return unimplemented_stub ();
+#else
 #if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
   if (gid == (gid_t) -1 || uid == (uid_t) -1)
     {
@@ -101,4 +106,5 @@
 #endif
 
   return chown (file, uid, gid);
+#endif
 }
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/lib/rtapelib.c cpio-2.9/lib/rtapelib.c
--- cpio-2.9.old/lib/rtapelib.c	2007-06-27 15:49:45.000000000 +0200
+++ cpio-2.9/lib/rtapelib.c	2007-09-23 12:24:25.000000000 +0200
@@ -118,6 +118,9 @@
 static int
 do_command (int handle, const char *buffer)
 {
+#ifndef HAVE_PIPE
+  return unimplemented_stub ();
+#else
   /* Save the current pipe handler and try to make the request.  */
 
   size_t length = strlen (buffer);
@@ -132,6 +135,7 @@
 
   _rmt_shutdown (handle, EIO);
   return -1;
+#endif
 }
 
 static char *
@@ -361,6 +365,9 @@
 rmt_open__ (const char *file_name, int open_mode, int bias,
             const char *remote_shell)
 {
+#ifndef HAVE_PIPE
+  return unimplemented_stub ();
+#else
   int remote_pipe_number;	/* pseudo, biased file descriptor */
   char *file_name_copy;		/* copy of file_name string */
   char *remote_host;		/* remote host name */
@@ -541,6 +548,7 @@
 
   free (file_name_copy);
   return remote_pipe_number + bias;
+#endif
 }
 
 /* Close remote tape connection HANDLE and shut down.  Return 0 if
@@ -591,6 +599,9 @@
 size_t
 rmt_write__ (int handle, char *buffer, size_t length)
 {
+#ifndef HAVE_PIPE
+  return unimplemented_stub ();
+#else
   char command_buffer[COMMAND_BUFFER_SIZE];
   RETSIGTYPE (*pipe_handler) ();
   size_t written;
@@ -616,6 +627,7 @@
 
   _rmt_shutdown (handle, EIO);
   return written;
+#endif
 }
 
 /* Perform an imitation lseek operation on remote tape connection
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/lib/system.h cpio-2.9/lib/system.h
--- cpio-2.9.old/lib/system.h	2007-06-27 15:49:45.000000000 +0200
+++ cpio-2.9/lib/system.h	2007-09-23 12:11:36.000000000 +0200
@@ -453,16 +453,26 @@
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
-#if MSDOS
+/* msdos (and win32?) */
+#ifdef HAVE_PROCESS_H
 # include <process.h>
+#endif
+
+/* Everyone else */
+#ifdef HAVE_PWD_H
+# include <pwd.h>
+#endif
+#ifdef HAVE_GRP_H
+# include <grp.h>
+#endif
+
+#if MSDOS
 # define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
 # define ERRNO_IS_EACCES errno == EACCES
 # define mkdir(file, mode) (mkdir) (file)
 # define TTY_NAME "con"
 # define sys_reset_uid_gid()
 #else
-# include <pwd.h>
-# include <grp.h>
 # define SET_BINARY_MODE(arc)
 # define ERRNO_IS_EACCES 0
 # define TTY_NAME "/dev/tty"
@@ -470,6 +480,21 @@
  do { setuid (getuid ()); setgid (getgid ()); } while (0)
 #endif
 
+static inline int
+unimplemented_stub ()
+{
+  errno = ENOSYS;
+  return -1;
+}
+
+#if !defined(HAVE_SYMLINK)
+# define UMASKED_SYMLINK(name1,name2,mode)    unimplemented_stub()
+#elif defined(SYMLINK_USES_UMASK)
+# define UMASKED_SYMLINK(name1,name2,mode)    symlink(name1,name2)
+#else
+# define UMASKED_SYMLINK(name1,name2,mode)    umasked_symlink(name1,name2,mode)
+#endif /* SYMLINK_USES_UMASK */
+
 #if XENIX
 # include <sys/inode.h>
 #endif
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/copyin.c cpio-2.9/src/copyin.c
--- cpio-2.9.old/src/copyin.c	2007-06-28 12:51:09.000000000 +0200
+++ cpio-2.9/src/copyin.c	2007-09-23 12:13:24.000000000 +0200
@@ -651,6 +651,9 @@
 static void
 copyin_device (struct cpio_file_stat* file_hdr)
 {
+#if !defined(HAVE_MKNOD) || !defined(HAVE_MAKEDEV)
+  return;
+#else
   int res;			/* Result of various function calls.  */
 
   if (to_stdout_option)
@@ -719,6 +722,7 @@
   if (retain_time_flag)
     set_file_times (-1, file_hdr->c_name, file_hdr->c_mtime,
 		    file_hdr->c_mtime);
+#endif
 }
 
 static void
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/copypass.c cpio-2.9/src/copypass.c
--- cpio-2.9.old/src/copypass.c	2007-06-28 14:10:01.000000000 +0200
+++ cpio-2.9/src/copypass.c	2007-09-23 12:25:02.000000000 +0200
@@ -276,6 +276,11 @@
 #endif
 	       0)
 	{
+#ifndef HAVE_MKNOD
+	  errno = ENOSYS;
+	  mknod_error (output_name.ds_string);
+	  continue;
+#else
 	  /* Can the current file be linked to a another file?
 	     Set link_name to the original file name.  */
 	  if (link_flag)
@@ -305,6 +310,7 @@
 		}
 	      set_copypass_perms (-1, output_name.ds_string, &in_file_stat);
 	    }
+#endif
 	}
 
 #ifdef S_ISLNK
@@ -416,6 +422,9 @@
 int
 link_to_name (char *link_name, char *link_target)
 {
+#ifndef HAVE_LINK
+  return unimplemented_stub ();
+#else
   int res = link (link_target, link_name);
   if (res < 0 && create_dir_flag)
     {
@@ -434,4 +443,5 @@
 	     link_target, link_name);
     }
   return res;
+#endif
 }
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/extern.h cpio-2.9/src/extern.h
--- cpio-2.9.old/src/extern.h	2007-06-28 14:59:38.000000000 +0200
+++ cpio-2.9/src/extern.h	2007-09-23 12:09:42.000000000 +0200
@@ -186,13 +186,6 @@
 					 int out_des, off_t num_bytes));
 #define DISK_IO_BLOCK_SIZE	512
 
-/* FIXME: Move to system.h? */
-#ifndef SYMLINK_USES_UMASK
-# define UMASKED_SYMLINK(name1,name2,mode)    symlink(name1,name2)
-#else
-# define UMASKED_SYMLINK(name1,name2,mode)    umasked_symlink(name1,name2,mode)
-#endif /* SYMLINK_USES_UMASK */
-
 void set_perms (int fd, struct cpio_file_stat *header);
 void set_file_times (int fd, const char *name, unsigned long atime,
 		     unsigned long mtime);
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/idcache.c cpio-2.9/src/idcache.c
--- cpio-2.9.old/src/idcache.c	2007-06-28 12:45:35.000000000 +0200
+++ cpio-2.9/src/idcache.c	2007-09-23 10:52:14.000000000 +0200
@@ -23,10 +23,15 @@
 
 #include <stdio.h>
 #include <sys/types.h>
-#include <pwd.h>
-#include <grp.h>
 #include <xalloc.h>
 
+#ifdef HAVE_PWD_H
+# include <pwd.h>
+#endif
+#ifdef HAVE_GRP_H
+# include <grp.h>
+#endif
+
 #if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
 #include <string.h>
 #else
@@ -65,16 +70,20 @@
     if (tail->id.u == uid)
       return tail->name;
 
-  pwent = getpwuid (uid);
   tail = (struct userid *) xmalloc (sizeof (struct userid));
   tail->id.u = uid;
+#ifdef HAVE_PWD_H
+  pwent = getpwuid (uid);
   if (pwent == 0)
     {
+#endif
       sprintf (usernum_string, "%u", (unsigned) uid);
       tail->name = xstrdup (usernum_string);
+#ifdef HAVE_PWD_H
     }
   else
     tail->name = xstrdup (pwent->pw_name);
+#endif
 
   /* Add to the head of the list, so most recently used is first.  */
   tail->next = user_alist;
@@ -103,11 +112,12 @@
     if (*tail->name == *user && !strcmp (tail->name, user))
       return 0;
 
-  pwent = getpwnam (user);
-
   tail = (struct userid *) xmalloc (sizeof (struct userid));
   tail->name = xstrdup (user);
 
+#ifdef HAVE_PWD_H
+  pwent = getpwnam (user);
+
   /* Add to the head of the list, so most recently used is first.  */
   if (pwent)
     {
@@ -116,6 +126,7 @@
       user_alist = tail;
       return &tail->id.u;
     }
+#endif
 
   tail->next = nouser_alist;
   nouser_alist = tail;
@@ -140,16 +151,21 @@
     if (tail->id.g == gid)
       return tail->name;
 
-  grent = getgrgid (gid);
   tail = (struct userid *) xmalloc (sizeof (struct userid));
   tail->id.g = gid;
+
+#ifdef HAVE_GRP_H
+  grent = getgrgid (gid);
   if (grent == 0)
     {
+#endif
       sprintf (groupnum_string, "%u", (unsigned int) gid);
       tail->name = xstrdup (groupnum_string);
+#ifdef HAVE_GRP_H
     }
   else
     tail->name = xstrdup (grent->gr_name);
+#endif
 
   /* Add to the head of the list, so most recently used is first.  */
   tail->next = group_alist;
@@ -178,11 +194,12 @@
     if (*tail->name == *group && !strcmp (tail->name, group))
       return 0;
 
-  grent = getgrnam (group);
-
   tail = (struct userid *) xmalloc (sizeof (struct userid));
   tail->name = xstrdup (group);
 
+#ifdef HAVE_GRP_H
+  grent = getgrnam (group);
+
   /* Add to the head of the list, so most recently used is first.  */
   if (grent)
     {
@@ -191,6 +208,7 @@
       group_alist = tail;
       return &tail->id.g;
     }
+#endif
 
   tail->next = nogroup_alist;
   nogroup_alist = tail;
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/main.c cpio-2.9/src/main.c
--- cpio-2.9.old/src/main.c	2007-06-28 12:46:41.000000000 +0200
+++ cpio-2.9/src/main.c	2007-09-23 12:27:23.000000000 +0200
@@ -727,11 +727,13 @@
                quotearg_colon (archive_name));
     }
 		     
+#ifdef HAVE_GETEUID
   /* Prevent SysV non-root users from giving away files inadvertantly.
      This happens automatically on BSD, where only root can give
      away files.  */
   if (set_owner_flag == false && set_group_flag == false && geteuid ())
     no_chown_flag = true;
+#endif
 }
 
 /* Initialize the input and output buffers to their proper size and
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/makepath.c cpio-2.9/src/makepath.c
--- cpio-2.9.old/src/makepath.c	2007-06-28 15:09:47.000000000 +0200
+++ cpio-2.9/src/makepath.c	2007-09-23 12:12:27.000000000 +0200
@@ -58,7 +58,12 @@
   int retval = 0;
   mode_t tmpmode;
   mode_t invert_permissions;
-  int we_are_root = getuid () == 0;
+  int we_are_root =
+#ifdef HAVE_GETUID
+  getuid () == 0;
+#else
+  1;
+#endif
   dirpath = alloca (strlen (argpath) + 1);
 
   strcpy (dirpath, argpath);
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/userspec.c cpio-2.9/src/userspec.c
--- cpio-2.9.old/src/userspec.c	2007-06-27 16:00:13.000000000 +0200
+++ cpio-2.9/src/userspec.c	2007-09-23 10:52:14.000000000 +0200
@@ -38,17 +38,22 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <sys/types.h>
-#include <pwd.h>
-#include <grp.h>
 
-#if !HAVE_DECL_GETPWNAM
+#ifdef HAVE_PWD_H
+# include <pwd.h>
+# if !HAVE_DECL_GETPWNAM
 extern struct passwd *getpwnam (const char *name);
+# endif
 #endif
-#if !HAVE_DECL_GETGRNAM
+
+#ifdef HAVE_GRP_H
+# include <grp.h>
+# if !HAVE_DECL_GETGRNAM
 extern struct group *getgrnam (const char *name);
-#endif
-#if !HAVE_DECL_GETGRGID
+# endif
+# if !HAVE_DECL_GETGRGID
 extern struct group *getgrgid (gid_t gid);
+# endif
 #endif
 
 #ifndef HAVE_ENDPWENT
@@ -134,9 +139,11 @@
 
   if (u != NULL)
     {
+#ifdef HAVE_PWD_H
       pwd = getpwnam (u);
       if (pwd == NULL)
 	{
+#endif
 
 	  if (!isnumber_p (u))
 	    error_msg = _("invalid user");
@@ -149,6 +156,7 @@
 	      else
 		*uid = atoi (u);
 	    }
+#ifdef HAVE_PWD_H
 	}
       else
 	{
@@ -175,22 +183,27 @@
 	      endgrent ();
 	    }
 	}
+#endif
       endpwent ();
     }
 
   if (g != NULL && error_msg == NULL)
     {
       /* Explicit group.  */
+#ifdef HAVE_GRP_H
       grp = getgrnam (g);
       if (grp == NULL)
 	{
+#endif
 	  if (!isnumber_p (g))
 	    error_msg = _("invalid group");
 	  else
 	    *gid = atoi (g);
+#ifdef HAVE_GRP_H
 	}
       else
 	*gid = grp->gr_gid;
+#endif
       endgrent ();		/* Save a file descriptor.  */
 
       if (error_msg == NULL)
diff -x rmt-command.h -x aclocal.m4 -x config.h.in -x configure -x Makefile.in -ur cpio-2.9.old/src/util.c cpio-2.9/src/util.c
--- cpio-2.9.old/src/util.c	2007-06-28 15:04:51.000000000 +0200
+++ cpio-2.9/src/util.c	2007-09-23 10:52:30.000000000 +0200
@@ -33,7 +33,9 @@
 #include <hash.h>
 #include <utimens.h>
 
-#include <sys/ioctl.h>
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
 
 #ifdef HAVE_SYS_MTIO_H
 # ifdef HAVE_SYS_IO_TRIOCTL_H
@@ -1266,7 +1268,10 @@
 }
 
 #ifndef HAVE_FCHOWN
-# define fchown(fd, uid, gid) (-1)
+# define HAVE_FCHOWN 0
+#endif
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD 0
 #endif
 
 int
_______________________________________________
Bug-cpio mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-cpio

Reply via email to