From f4cebd00212260f57eb61458fd39668f97621ce0 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Tue, 13 May 2014 17:18:52 +0000
Subject: define __USE_GNU for wempcpy


diff --git a/lib/fnmatch.c b/lib/fnmatch.c
index b8a71f1..0dc18c7 100644
--- a/lib/fnmatch.c
+++ b/lib/fnmatch.c
@@ -23,6 +23,9 @@
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE    1
 #endif
+#ifndef __USE_GNU
+# define __USE_GNU		1
+#endif
 
 #include <fnmatch.h>
 
-- 
2.30.2


From 7166a522bd4bc179519fa4dbc54584a71df131db Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Tue, 13 May 2014 17:22:10 +0000
Subject: force declaration of rpl_inet_ntop


diff --git a/lib/arpa_inet.in.h b/lib/arpa_inet.in.h
index 9968067..ad11a60 100644
--- a/lib/arpa_inet.in.h
+++ b/lib/arpa_inet.in.h
@@ -78,7 +78,7 @@
 
    For more details, see the POSIX:2008 specification
    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html>.  */
-# if @REPLACE_INET_NTOP@
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef inet_ntop
 #   define inet_ntop rpl_inet_ntop
-- 
2.30.2


From 3f890e14e94eed728d7bfe47f3cf5ffb3b6fbedd Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Tue, 13 May 2014 17:32:36 +0000
Subject: Haiku defines mknod in unistd.h


diff --git a/lib/mknod.c b/lib/mknod.c
index c54e60c..018ed23 100644
--- a/lib/mknod.c
+++ b/lib/mknod.c
@@ -18,6 +18,7 @@
 
 #include <config.h>
 
+#include <unistd.h>
 #include <sys/stat.h>
 
 #include <errno.h>
-- 
2.30.2


From 921e841dc52b6821052c4a635b9b8a2e7e3e7356 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Tue, 13 May 2014 17:35:25 +0000
Subject: protect the label, not used on Haiku


diff --git a/lib/mountlist.c b/lib/mountlist.c
index 352b35f..7514f57 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -1089,7 +1089,8 @@ read_file_system_list (bool need_fs_type)
   return mount_list;
 
 
- free_then_fail: _GL_UNUSED_LABEL;
+ #ifndef __HAIKU__
+free_then_fail: _GL_UNUSED_LABEL;
   {
     int saved_errno = errno;
     *mtail = NULL;
@@ -1104,6 +1105,7 @@ read_file_system_list (bool need_fs_type)
     errno = saved_errno;
     return NULL;
   }
+#endif
 }
 
 /* Free a mount entry as returned from read_file_system_list ().  */
-- 
2.30.2


From 48ac0174b030f909a4ff706249692d0d6803ae83 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Thu, 15 May 2014 15:40:32 +0000
Subject: strchrnul needs __USE_GNU on Haiku


diff --git a/lib/regex.h b/lib/regex.h
index adb6976..3aefdd9 100644
--- a/lib/regex.h
+++ b/lib/regex.h
@@ -30,8 +30,10 @@ extern "C" {
 /* Define __USE_GNU to declare GNU extensions that violate the
    POSIX name space rules.  */
 #ifdef _GNU_SOURCE
+#ifndef __USE_GNU
 # define __USE_GNU 1
 #endif
+#endif
 
 #ifdef _REGEX_LARGE_OFFSETS
 
diff --git a/lib/string.in.h b/lib/string.in.h
index 8d77ae3..892640b 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -37,6 +37,9 @@
 #define _GL_ALREADY_INCLUDING_STRING_H
 
 /* The include_next requires a split double-inclusion guard.  */
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
 #@INCLUDE_NEXT@ @NEXT_STRING_H@
 
 #undef _GL_ALREADY_INCLUDING_STRING_H
-- 
2.30.2


From 67f9206d4658a42d5f46483d400eae8852c64294 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Thu, 15 May 2014 20:13:58 +0000
Subject: don't build hostid, nice, users, who


diff --git a/Makefile.in b/Makefile.in
index b42c218..34c917e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -944,8 +944,8 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = src/arch$(EXEEXT) src/coreutils$(EXEEXT) \
 	src/hostname$(EXEEXT)
-am__EXEEXT_2 = src/chroot$(EXEEXT) src/df$(EXEEXT) src/hostid$(EXEEXT) \
-	src/libstdbuf.so$(EXEEXT) src/nice$(EXEEXT) src/pinky$(EXEEXT) \
+am__EXEEXT_2 = src/chroot$(EXEEXT) src/df$(EXEEXT) \
+	src/libstdbuf.so$(EXEEXT) \
 	src/stdbuf$(EXEEXT) src/stty$(EXEEXT) src/timeout$(EXEEXT) \
 	src/uptime$(EXEEXT) src/users$(EXEEXT) src/who$(EXEEXT)
 am__EXEEXT_3 = src/[$(EXEEXT) src/b2sum$(EXEEXT) src/base64$(EXEEXT) \
@@ -5715,7 +5715,7 @@ WARN_ON_USE_H = $(top_srcdir)/lib/warn-on-use.h
 # FIXME: once lib/ and gnulib-tests/ are also converted, hoist to Makefile.am
 AM_CFLAGS = $(WERROR_CFLAGS)
 no_install__progs = src/arch src/coreutils src/hostname
-build_if_possible__progs = src/chroot src/df src/hostid \
+build_if_possible__progs = src/chroot src/df \
 	src/libstdbuf.so src/nice src/pinky src/stdbuf src/stty \
 	src/timeout src/uptime src/users src/who
 default__progs = src/[ src/b2sum src/base64 src/base32 src/basenc \
-- 
2.30.2


From d19184fd828775f44f397f51d150d145ab577106 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Fri, 6 Feb 2015 20:24:12 +0000
Subject: import Haiku changes, fix warnings.


diff --git a/INSTALL b/INSTALL
index e82fd21..771315d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -245,10 +245,10 @@ directory contains several dysfunctional programs; working variants of
 these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
 in your 'PATH', put it _after_ '/usr/bin'.
 
-   On Haiku, software installed for all users goes in '/boot/common',
+   On Haiku, software installed for all users goes in '/boot/system',
 not '/usr/local'.  It is recommended to use the following options:
 
-     ./configure --prefix=/boot/common
+     ./configure --prefix=/boot/system
 
 Specifying the System Type
 ==========================
diff --git a/lib/localcharset.c b/lib/localcharset.c
index 3c50858..5777260 100644
--- a/lib/localcharset.c
+++ b/lib/localcharset.c
@@ -41,6 +41,13 @@
 # ifndef OS2
 #  define OS2
 # endif
+
+# if defined __HAIKU__
+	/* To avoid the troubles of installing a separate file in the same
+	  directory as the DLL and of retrieving the DLL's directory at
+	  runtime, simply inline the aliases here.  */
+	cp = "UTF-8" "\0";
+# endif
 #endif
 
 #if !defined WINDOWS_NATIVE
diff --git a/src/copy.c b/src/copy.c
index cb9018f..495831e 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -18,6 +18,7 @@
 
 #include <config.h>
 #include <stdio.h>
+#include <unistd.h>
 #include <assert.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
@@ -66,6 +67,10 @@
 #include "xstrtol.h"
 #include "selinux.h"
 
+#if (defined(__BEOS__) || defined(__HAIKU__))
+#	include <fs_attr.h>
+#endif
+
 #if USE_XATTR
 # include <attr/error_context.h>
 # include <attr/libattr.h>
@@ -664,6 +669,92 @@ is_ancestor (const struct stat *sb, const struct dir_list *ancestors)
   return false;
 }
 
+
+static int
+copy_attributes(int fromFd, int toFd)
+{
+	struct dirent *dirent;
+	char buffer[65536];
+
+	DIR *attributes = fs_fopen_attr_dir(fromFd);
+	if (attributes == NULL)
+		return errno == B_UNSUPPORTED ? 0 : -1;
+
+	while ((dirent = fs_read_attr_dir(attributes)) != NULL) {
+		struct stat stat;
+		off_t pos = 0;
+		int attrFromFD = fs_fopen_attr(fromFd, dirent->d_name, 0, O_RDONLY);
+		int attrToFD;
+
+		if (attrFromFD < 0)
+			continue;
+
+		if (fstat(attrFromFD, &stat) != 0) {
+			close(attrFromFD);
+			continue;
+		}
+
+		attrToFD = fs_fopen_attr(toFd, dirent->d_name, stat.st_type,
+			O_WRONLY | O_TRUNC | O_CREAT);
+		if (attrToFD < 0) {
+			close(attrFromFD);
+			continue;
+		}
+
+		while (true) {
+			ssize_t bytesRead, bytesWritten;
+
+			bytesRead = read_pos(attrFromFD, pos, buffer, sizeof(buffer));
+			if (bytesRead < 0) {
+				fprintf(stderr, "error reading attribute '%s'", dirent->d_name);
+				break;
+			}
+
+			bytesWritten = write_pos(attrToFD, pos, buffer, bytesRead);
+			if (bytesWritten != bytesRead) {
+				fprintf(stderr, "error writing attribute '%s'", dirent->d_name);
+				break;
+			}
+
+			pos += bytesWritten;
+			stat.st_size -= bytesWritten;
+
+			if (stat.st_size <= 0)
+				break;
+		}
+		close(attrToFD);
+		close(attrFromFD);
+	}
+
+	fs_close_attr_dir(attributes);
+	return 0;
+}
+
+
+static int
+copy_attributes_by_name(const char *from, const char *to, int resolveLinks)
+{
+	int fromFd, toFd, result;
+
+	fromFd = open(from, O_RDONLY | (resolveLinks ? 0 : O_NOTRAVERSE));
+	if (fromFd < 0)
+		return -1;
+
+	toFd = open(to, O_RDONLY | (resolveLinks ? 0 : O_NOTRAVERSE));
+	if (toFd < 0) {
+		close(fromFd);
+		return -1;
+	}
+
+	result = copy_attributes(fromFd, toFd);
+
+	close(fromFd);
+	close(toFd);
+
+	return result;
+}
+
+
 static bool
 errno_unsupported (int err)
 {
@@ -797,6 +888,10 @@ copy_dir (char const *src_name_in, char const *dst_name_in, bool new_dst,
       error (0, errno, _("cannot access %s"), quoteaf (src_name_in));
       return false;
     }
+    
+  if (x->ignore_attributes == 0
+  	&& copy_attributes_by_name(src_name_in, dst_name_in, true) != 0)
+    fprintf(stderr, "%s: could not copy attributes\n", src_name_in);
 
   /* For cp's -H option, dereference command line arguments, but do not
      dereference symlinks that are found via recursive traversal.  */
@@ -1488,6 +1583,11 @@ copy_reg (char const *src_name, char const *dst_name,
             return_val = false;
         }
     }
+    
+  if (x->ignore_attributes == 0
+        && copy_attributes(source_desc, dest_desc) != 0)
+    fprintf(stderr, "%s: could not copy attributes\n", src_name);
+
 
 close_src_and_dst_desc:
   if (close (dest_desc) < 0)
@@ -2465,6 +2565,12 @@ copy_internal (char const *src_name, char const *dst_name,
                                   dereference))
             goto un_backup;
 
+          if (x->ignore_attributes == 0
+              && copy_attributes_by_name (earlier_file, dst_name,
+                  false) != 0)
+            error (0, errno, "cannot copy attributes from %s\n",
+                earlier_file);
+
           return true;
         }
     }
@@ -2883,6 +2989,11 @@ copy_internal (char const *src_name, char const *dst_name,
                  preserving owner/group is a potential security problem.  */
             }
         }
+
+      if (x->ignore_attributes == 0
+            && copy_attributes_by_name(src_name, dst_name, false) != 0)
+        fprintf(stderr, "%s: could not copy attributes\n", src_name);
+
     }
   else
     {
diff --git a/src/copy.h b/src/copy.h
index 68d52e1..2da80a8 100644
--- a/src/copy.h
+++ b/src/copy.h
@@ -189,6 +189,9 @@ struct cp_options
      must be false.  */
   bool require_preserve;
 
+  /* If nonzero, attributes will be ignored when copying.  */
+  int ignore_attributes;
+
   /* If true, attempt to preserve the SELinux security context, too.
      Set this only if the kernel is SELinux enabled.  */
   bool preserve_security_context;
diff --git a/src/cp.c b/src/cp.c
index c97a675..4050cba 100644
--- a/src/cp.c
+++ b/src/cp.c
@@ -64,6 +64,7 @@ struct dir_attr
 enum
 {
   ATTRIBUTES_ONLY_OPTION = CHAR_MAX + 1,
+  IGNORE_ATTRIBUTES,
   COPY_CONTENTS_OPTION,
   NO_PRESERVE_ATTRIBUTES_OPTION,
   PARENTS_OPTION,
@@ -112,6 +113,7 @@ static struct option const long_opts[] =
   {"copy-contents", no_argument, NULL, COPY_CONTENTS_OPTION},
   {"dereference", no_argument, NULL, 'L'},
   {"force", no_argument, NULL, 'f'},
+  {"ignore-attributes", no_argument, NULL, IGNORE_ATTRIBUTES},
   {"interactive", no_argument, NULL, 'i'},
   {"link", no_argument, NULL, 'l'},
   {"no-clobber", no_argument, NULL, 'n'},
@@ -170,6 +172,7 @@ Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
   -f, --force                  if an existing destination file cannot be\n\
                                  opened, remove it and try again (this option\n\
                                  is ignored when the -n option is also used)\n\
+      --ignore-attributes      do not copy attributes\n\
   -i, --interactive            prompt before overwrite (overrides a previous -n\
 \n\
                                   option)\n\
@@ -814,6 +817,7 @@ cp_option_init (struct cp_options *x)
   x->data_copy_required = true;
   x->require_preserve = false;
   x->recursive = false;
+  x->ignore_attributes = false;
   x->sparse_mode = SPARSE_AUTO;
   x->symbolic_link = false;
   x->set_mode = false;
@@ -1015,6 +1019,10 @@ main (int argc, char **argv)
           x.dereference = DEREF_COMMAND_LINE_ARGUMENTS;
           break;
 
+        case IGNORE_ATTRIBUTES:
+          x.ignore_attributes = true;
+          break;
+
         case 'i':
           x.interactive = I_ASK_USER;
           break;
diff --git a/src/dircolors.h b/src/dircolors.h
index c06ecb7..6c059c4 100644
--- a/src/dircolors.h
+++ b/src/dircolors.h
@@ -62,7 +62,7 @@ static char const G_line[] =
   'S','E','T','G','I','D',' ','3','0',';','4','3',' ','#',' ','f','i','l','e',' ','t','h','a','t',' ','i','s',' ','s','e','t','g','i','d',' ','(','g','+','s',')',0,
   'C','A','P','A','B','I','L','I','T','Y',' ','3','0',';','4','1',' ','#',' ','f','i','l','e',' ','w','i','t','h',' ','c','a','p','a','b','i','l','i','t','y',0,
   'S','T','I','C','K','Y','_','O','T','H','E','R','_','W','R','I','T','A','B','L','E',' ','3','0',';','4','2',' ','#',' ','d','i','r',' ','t','h','a','t',' ','i','s',' ','s','t','i','c','k','y',' ','a','n','d',' ','o','t','h','e','r','-','w','r','i','t','a','b','l','e',' ','(','+','t',',','o','+','w',')',0,
-  'O','T','H','E','R','_','W','R','I','T','A','B','L','E',' ','3','4',';','4','2',' ','#',' ','d','i','r',' ','t','h','a','t',' ','i','s',' ','o','t','h','e','r','-','w','r','i','t','a','b','l','e',' ','(','o','+','w',')',' ','a','n','d',' ','n','o','t',' ','s','t','i','c','k','y',0,
+  'O','T','H','E','R','_','W','R','I','T','A','B','L','E',' ','3','4',';','4','3',' ','#',' ','d','i','r',' ','t','h','a','t',' ','i','s',' ','o','t','h','e','r','-','w','r','i','t','a','b','l','e',' ','(','o','+','w',')',' ','a','n','d',' ','n','o','t',' ','s','t','i','c','k','y',0,
   'S','T','I','C','K','Y',' ','3','7',';','4','4',' ','#',' ','d','i','r',' ','w','i','t','h',' ','t','h','e',' ','s','t','i','c','k','y',' ','b','i','t',' ','s','e','t',' ','(','+','t',')',' ','a','n','d',' ','n','o','t',' ','o','t','h','e','r','-','w','r','i','t','a','b','l','e',0,
   '#',' ','T','h','i','s',' ','i','s',' ','f','o','r',' ','f','i','l','e','s',' ','w','i','t','h',' ','e','x','e','c','u','t','e',' ','p','e','r','m','i','s','s','i','o','n',':',0,
   'E','X','E','C',' ','0','1',';','3','2',0,
diff --git a/src/dircolors.hin b/src/dircolors.hin
index b5d6452..6352dea 100644
--- a/src/dircolors.hin
+++ b/src/dircolors.hin
@@ -64,7 +64,7 @@ SETUID 37;41	# file that is setuid (u+s)
 SETGID 30;43	# file that is setgid (g+s)
 CAPABILITY 30;41	# file with capability
 STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
-OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
+OTHER_WRITABLE 34;43 # dir that is other-writable (o+w) and not sticky
 STICKY 37;44	# dir with the sticky bit set (+t) and not other-writable
 
 # This is for files with execute permission:
diff --git a/src/ls.c b/src/ls.c
index 1047801..fc33bff 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -719,6 +719,11 @@ static struct ignore_pattern *hide_patterns;
    want to mess up the terminal if control chars get sent to it, and some
    quoting methods pass through control chars as-is.  */
 static bool qmark_funny_chars;
+#if defined(__HAIKU__)  /* Default to show UTF8 chars in Haiku terminal. */
+#define QMARK_FUNNY_CHARS_TTY 0
+#else
+#define QMARK_FUNNY_CHARS_TTY 1
+#endif
 
 /* Quoting options for file and dir name output.  */
 
@@ -4395,6 +4400,7 @@ print_long_format (const struct fileinfo *f)
       p = buf;
     }
 
+#if !defined(__HAIKU__)
   if (f->stat_ok
       && (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
     {
@@ -4410,6 +4416,7 @@ print_long_format (const struct fileinfo *f)
                     umaxtostr (minor (f->stat.st_rdev), minorbuf));
     }
   else
+#endif
     {
       char hbuf[LONGEST_HUMAN_READABLE + 1];
       char const *size =
diff --git a/src/mv.c b/src/mv.c
index 7d81b59..2fa32c1 100644
--- a/src/mv.c
+++ b/src/mv.c
@@ -129,6 +129,7 @@ cp_option_init (struct cp_options *x)
   x->reduce_diagnostics = false;
   x->data_copy_required = true;
   x->require_preserve = false;  /* FIXME: maybe make this an option */
+  x->ignore_attributes = false;
   x->require_preserve_context = false;
   x->preserve_xattr = true;
   x->require_preserve_xattr = false;
diff --git a/src/remove.c b/src/remove.c
index 5dd0479..457b8f4 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -215,7 +215,7 @@ prompt (FTS const *fts, FTSENT const *ent, bool is_dir,
       wp_errno = errno;
     }
 
-  if (write_protected || x->interactive == RMI_ALWAYS)
+  if (write_protected || errno || x->interactive == RMI_ALWAYS)
     {
       if (0 <= write_protected && dirent_type == DT_UNKNOWN)
         {
diff --git a/src/uname.c b/src/uname.c
index ae9b8e2..2c551af 100644
--- a/src/uname.c
+++ b/src/uname.c
@@ -49,6 +49,10 @@
 # include <mach-o/arch.h>
 #endif
 
+#ifdef __HAIKU__
+# include <OS.h>
+#endif
+
 #include "system.h"
 #include "die.h"
 #include "error.h"
@@ -338,6 +342,30 @@ main (int argc, char **argv)
 # endif
         }
 #endif
+
+#ifdef __HAIKU__
+	  {
+		cpu_topology_node_info root;
+		uint32 count = 1;
+		status_t error = get_cpu_topology_info(&root, &count);
+		if (error != B_OK || count < 1)
+			element = "unknown";
+		else {
+			switch (root.data.root.platform) {
+				case B_CPU_x86:
+					element = "x86";
+					break;
+				case B_CPU_x86_64:
+					element = "x86_64";
+					break;
+				default:
+					element = "other";
+					break;
+			}
+		}
+	  }
+#endif
+
       if (! (toprint == UINT_MAX && element == unknown))
         print_element (element);
     }
-- 
2.30.2


From 1990ba710bdfd4ab907bea396d2b3be3d1dc2f0a Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Thu, 21 Oct 2021 20:28:22 +0200
Subject: config.h is required for stdint.h


diff --git a/src/crctab.c b/src/crctab.c
index 20a1e41..fdf2fdf 100644
--- a/src/crctab.c
+++ b/src/crctab.c
@@ -1,3 +1,4 @@
+#include <config.h>
 #include <stdint.h>
 
 uint_fast32_t const crctab[8][256] = {
-- 
2.30.2


From 2964f144f60577b518e17857df5f2137a0b39fda Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Mon, 1 Nov 2021 21:08:55 +0100
Subject: ln: handle negative errno

explicit check for -1 which is a special value in this code.

diff --git a/src/copy.c b/src/copy.c
index 495831e..2e45278 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -2002,13 +2002,13 @@ create_hard_link (char const *src_name, char const *dst_name,
   int err = force_linkat (AT_FDCWD, src_name, AT_FDCWD, dst_name,
                           dereference ? AT_SYMLINK_FOLLOW : 0,
                           replace, -1);
-  if (0 < err)
+  if (err != 0 && err != -1)
     {
       error (0, err, _("cannot create hard link %s to %s"),
              quoteaf_n (0, dst_name), quoteaf_n (1, src_name));
       return false;
     }
-  if (err < 0 && verbose)
+  if (err == -1 && verbose)
     printf (_("removed %s\n"), quoteaf (dst_name));
   return true;
 }
@@ -2858,7 +2858,7 @@ copy_internal (char const *src_name, char const *dst_name,
 
       int err = force_symlinkat (src_name, AT_FDCWD, dst_name,
                                  x->unlink_dest_after_failed_open, -1);
-      if (0 < err)
+      if (err != 0 && err != -1)
         {
           error (0, err, _("cannot create symbolic link %s to %s"),
                  quoteaf_n (0, dst_name), quoteaf_n (1, src_name));
@@ -2941,7 +2941,8 @@ copy_internal (char const *src_name, char const *dst_name,
 
       int symlink_err = force_symlinkat (src_link_val, AT_FDCWD, dst_name,
                                          x->unlink_dest_after_failed_open, -1);
-      if (0 < symlink_err && x->update && !new_dst && S_ISLNK (dst_sb.st_mode)
+      if (symlink_err != 0 && symlink_err != -1 && x->update && !new_dst
+          && S_ISLNK (dst_sb.st_mode)
           && dst_sb.st_size == strlen (src_link_val))
         {
           /* See if the destination is already the desired symlink.
@@ -2958,7 +2959,7 @@ copy_internal (char const *src_name, char const *dst_name,
             }
         }
       free (src_link_val);
-      if (0 < symlink_err)
+      if (symlink_err != 0 && symlink_err != -1)
         {
           error (0, symlink_err, _("cannot create symbolic link %s"),
                  quoteaf (dst_name));
diff --git a/src/ln.c b/src/ln.c
index c7eb740..dde3e4b 100644
--- a/src/ln.c
+++ b/src/ln.c
@@ -160,7 +160,7 @@ convert_abs_rel (char const *from, char const *target)
 
 /* Link SOURCE to DESTDIR_FD + DEST_BASE atomically.  DESTDIR_FD is
    the directory containing DEST_BASE.  Return 0 if successful, a
-   positive errno value on failure, and -1 if an atomic link cannot be
+   errno value on failure, and -1 if an atomic link cannot be
    done.  This handles the common case where the destination does not
    already exist and -r is not specified.  */
 
@@ -191,7 +191,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
   char *backup_base = NULL;
   char *rel_source = NULL;
   int nofollow_flag = logical ? 0 : AT_SYMLINK_NOFOLLOW;
-  if (link_errno < 0)
+  if (link_errno == -1)
     link_errno = atomic_link (source, destdir_fd, dest_base);
 
   /* Get SOURCE_STATS if later code will need it, if only for sharper
@@ -278,7 +278,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
                     }
                 }
 
-              if (link_errno < 0 || link_errno == EEXIST)
+              if (link_errno == -1 || link_errno == EEXIST)
                 {
                   if (interactive)
                     {
@@ -344,7 +344,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
          required removing the destination first.  */
     }
 
-  if (link_errno <= 0)
+  if (link_errno == 0 || link_errno == -1)
     {
       /* Right after creating a hard link, do this: (note dest name and
          source_stats, which are also the just-linked-destinations stats) */
@@ -399,7 +399,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
 
   free (backup_base);
   free (rel_source);
-  return link_errno <= 0;
+  return link_errno == 0 || link_errno == -1;
 
 fail:
   free (rel_source);
-- 
2.30.2

From ce0ad419f18d006929850e56b6fd2d50f1857789 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Tue, 16 Nov 2021 10:22:30 +0100
Subject: [PATCH] uptime: make utmp error not critical

---
 src/uptime.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/uptime.c b/src/uptime.c
index fc0f0a5..779fc09 100644
--- a/src/uptime.c
+++ b/src/uptime.c
@@ -105,7 +105,7 @@ print_uptime (size_t n, const STRUCT_UTMP *this)
 #if HAVE_UTMPX_H || HAVE_UTMP_H
   /* Loop through all the utmp entries we just read and count up the valid
      ones, also in the process possibly gleaning boottime. */
-  while (n--)
+  while (this && n--)
     {
       entries += IS_USER_PROCESS (this);
       if (UT_TYPE_BOOT_TIME (this))
@@ -181,7 +181,11 @@ uptime (char const *filename, int options)
 
 #if HAVE_UTMPX_H || HAVE_UTMP_H
   if (read_utmp (filename, &n_users, &utmp_buf, options) != 0)
+#if HAVE_OS_H
+     ;
+#else
     die (EXIT_FAILURE, errno, "%s", quotef (filename));
+#endif
 #endif
 
   print_uptime (n_users, utmp_buf);
-- 
2.30.2

