From 2ad10befa33d331800346cab63417bebb1db3e6f Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 5559ba2..8ca4cc4 100644 --- a/lib/fnmatch.c +++ b/lib/fnmatch.c @@ -21,6 +21,9 @@ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif +#ifndef __USE_GNU +# define __USE_GNU 1 +#endif #include -- 2.14.2 From 2524d0dde2a381c8f8c76620c3fe01befb8e83fd Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 dc3d2bd..62b4786 100644 --- a/lib/arpa_inet.in.h +++ b/lib/arpa_inet.in.h @@ -72,7 +72,7 @@ For more details, see the POSIX:2001 specification . */ -# if @REPLACE_INET_NTOP@ +# if 1 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef inet_ntop # define inet_ntop rpl_inet_ntop -- 2.14.2 From c09450fe92943d42ee78ed86944d38ebcd18726a Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 b6bfb2a..4bbd3d7 100644 --- a/lib/mknod.c +++ b/lib/mknod.c @@ -18,6 +18,7 @@ #include +#include #include #include -- 2.14.2 From ecd1f97294f01f1d3ee3d71e40601acd624ecd8a Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 1a40d15..9a8af06 100644 --- a/lib/mountlist.c +++ b/lib/mountlist.c @@ -1109,6 +1109,7 @@ read_file_system_list (bool need_fs_type) return mount_list; +#ifndef __HAIKU__ free_then_fail: _GL_UNUSED_LABEL { int saved_errno = errno; @@ -1124,6 +1125,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.14.2 From 7f075f99fa7a5d78148ab5d79965a969db423c45 Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 18b8cbd..64d084d 100644 --- a/lib/regex.h +++ b/lib/regex.h @@ -31,8 +31,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 aaff563..32fa98f 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.14.2 From c7af057601c8fa8f0dd152c10257b44ec132c1f9 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Thu, 15 May 2014 20:13:58 +0000 Subject: don't build hostid, uptime, nice, users, who, dd diff --git a/Makefile.in b/Makefile.in index 521f293..5eb943a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1541,16 +1541,16 @@ nodist_src_libver_a_OBJECTS = src/version.$(OBJEXT) src_libver_a_OBJECTS = $(nodist_src_libver_a_OBJECTS) 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) + src/users$(EXEEXT) src/who$(EXEEXT) am__EXEEXT_3 = src/[$(EXEEXT) src/b2sum$(EXEEXT) src/base64$(EXEEXT) \ src/base32$(EXEEXT) src/basename$(EXEEXT) src/cat$(EXEEXT) \ src/chcon$(EXEEXT) src/chgrp$(EXEEXT) src/chmod$(EXEEXT) \ src/chown$(EXEEXT) src/cksum$(EXEEXT) src/comm$(EXEEXT) \ src/cp$(EXEEXT) src/csplit$(EXEEXT) src/cut$(EXEEXT) \ - src/date$(EXEEXT) src/dd$(EXEEXT) src/dir$(EXEEXT) \ + src/date$(EXEEXT) src/dir$(EXEEXT) \ src/dircolors$(EXEEXT) src/dirname$(EXEEXT) src/du$(EXEEXT) \ src/echo$(EXEEXT) src/env$(EXEEXT) src/expand$(EXEEXT) \ src/expr$(EXEEXT) src/factor$(EXEEXT) src/false$(EXEEXT) \ @@ -4469,7 +4469,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/basename \ -- 2.14.2 From 4215e27a5cd2f0e04547345544301b7d85aba915 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Fri, 6 Feb 2015 20:24:12 +0000 Subject: import Haiku changes, fix warnings. diff --git a/INSTALL b/INSTALL index 8865734..5bc8a54 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 9b7e6cb..7f5d64f 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -129,7 +129,7 @@ get_charset_aliases (void) cp = charset_aliases; if (cp == NULL) { -#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__ || defined OS2) +#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__ || defined OS2 || defined __HAIKU__) char *malloc_dir = NULL; const char *dir; const char *base = "charset.alias"; @@ -376,6 +376,13 @@ get_charset_aliases (void) "CP1386" "\0" "GBK" "\0" "CP3372" "\0" "EUC-JP" "\0"; # 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 charset_aliases = cp; diff --git a/src/copy.c b/src/copy.c index c4c5740..a35c3c5 100644 --- a/src/copy.c +++ b/src/copy.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -65,6 +66,10 @@ #include "yesno.h" #include "selinux.h" +#if (defined(__BEOS__) || defined(__HAIKU__)) +# include +#endif + #if USE_XATTR # include # include @@ -591,6 +596,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) { @@ -724,6 +815,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. */ @@ -1392,6 +1487,11 @@ preserve_metadata: 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) @@ -2313,6 +2413,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; } } @@ -2729,6 +2835,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 c4bf23c..94eac15 100644 --- a/src/copy.h +++ b/src/copy.h @@ -187,6 +187,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 6949a67..3e1bd67 100644 --- a/src/cp.c +++ b/src/cp.c @@ -74,6 +74,7 @@ struct dir_attr enum { ATTRIBUTES_ONLY_OPTION = CHAR_MAX + 1, + IGNORE_ATTRIBUTES, COPY_CONTENTS_OPTION, NO_PRESERVE_ATTRIBUTES_OPTION, PARENTS_OPTION, @@ -122,6 +123,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'}, @@ -180,6 +182,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\ @@ -809,6 +812,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; @@ -1010,6 +1014,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 259336d..2529504 100644 --- a/src/dircolors.h +++ b/src/dircolors.h @@ -59,7 +59,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 fca51f2..83706ba 100644 --- a/src/dircolors.hin +++ b/src/dircolors.hin @@ -61,7 +61,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 745c65f..dae5755 100644 --- a/src/ls.c +++ b/src/ls.c @@ -708,6 +708,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. */ @@ -1684,7 +1689,7 @@ decode_switches (int argc, char **argv) bool sort_type_specified = false; bool kibibytes_specified = false; - qmark_funny_chars = false; + qmark_funny_chars = QMARK_FUNNY_CHARS_TTY; /* initialize all switches to default settings */ @@ -1709,7 +1714,9 @@ decode_switches (int argc, char **argv) format = many_per_line; set_quoting_style (NULL, shell_escape_quoting_style); /* See description of qmark_funny_chars, above. */ +#ifndef __HAIKU__ qmark_funny_chars = true; +#endif } else { @@ -4122,6 +4129,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))) { @@ -4138,6 +4146,7 @@ print_long_format (const struct fileinfo *f) p += file_size_width + 1; } else +#endif { char hbuf[LONGEST_HUMAN_READABLE + 1]; char const *size = diff --git a/src/mv.c b/src/mv.c index fc1fca4..c9ec96e 100644 --- a/src/mv.c +++ b/src/mv.c @@ -126,6 +126,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 5ba19ee..4d5102c 100644 --- a/src/remove.c +++ b/src/remove.c @@ -214,7 +214,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 6378ab7..6954275 100644 --- a/src/uname.c +++ b/src/uname.c @@ -49,6 +49,10 @@ # include #endif +#ifdef __HAIKU__ +# include +#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.14.2