From cad02d90d5d789d7fed678da3c9a2cdde6e7da8d 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 0270bfd..36438dc 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 -- 2.51.0 From 06bb6947c7888dbe75cdecedab4a17de324f501b 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 d7417bf..0a56cfe 100644 --- a/lib/arpa_inet.in.h +++ b/lib/arpa_inet.in.h @@ -130,7 +130,7 @@ ntohl (uint32_t value) For more details, see the POSIX:2008 specification . */ -# if @REPLACE_INET_NTOP@ +# if 1 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef inet_ntop # define inet_ntop rpl_inet_ntop -- 2.51.0 From c0de634e5440f083be9bd76893140ba7ba773833 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 cc2dfe5..28a2c8c 100644 --- a/lib/mknod.c +++ b/lib/mknod.c @@ -18,6 +18,7 @@ #include +#include #include #include -- 2.51.0 From 04ca63f414a974765ee6fb890c3c2dd697e68433 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 1a1e7fb..c12e50a 100644 --- a/lib/mountlist.c +++ b/lib/mountlist.c @@ -1292,7 +1292,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; @@ -1307,6 +1308,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.51.0 From 4b4c6b8640ea0016238696332fe0c8e3534de16b 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 e9ab85e..c0eb2b1 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 fdcdd21..17c73ce 100644 --- a/lib/string.in.h +++ b/lib/string.in.h @@ -37,6 +37,9 @@ #define _@GUARD_PREFIX@_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 _@GUARD_PREFIX@_ALREADY_INCLUDING_STRING_H -- 2.51.0 From 52292482f8d2431209387e7b92a6ec61ae5b728e Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 0a19863..ea71298 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1274,8 +1274,8 @@ CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = src/arch$(EXEEXT) src/coreutils$(EXEEXT) \ src/hostname$(EXEEXT) am__EXEEXT_2 = src/chcon$(EXEEXT) src/chroot$(EXEEXT) src/df$(EXEEXT) \ - src/hostid$(EXEEXT) src/libstdbuf.so$(EXEEXT) \ - src/nice$(EXEEXT) src/pinky$(EXEEXT) src/runcon$(EXEEXT) \ + src/libstdbuf.so$(EXEEXT) \ + src/runcon$(EXEEXT) \ src/stdbuf$(EXEEXT) src/stty$(EXEEXT) src/timeout$(EXEEXT) \ src/users$(EXEEXT) src/who$(EXEEXT) am__EXEEXT_3 = src/[$(EXEEXT) src/b2sum$(EXEEXT) src/base64$(EXEEXT) \ @@ -7857,7 +7857,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/chcon src/chroot src/df src/hostid \ +build_if_possible__progs = src/chcon src/chroot src/df \ src/libstdbuf.so src/nice src/pinky src/runcon src/stdbuf \ src/stty src/timeout src/users src/who default__progs = src/[ src/b2sum src/base64 src/base32 src/basenc \ -- 2.51.0 From 93e39d61231cbb4114e9f49c20bf7ca52e8c5ade 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/lib/localcharset.c b/lib/localcharset.c index 79a55c5..24cdad6 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 4af66c8..624664c 100644 --- a/src/copy.c +++ b/src/copy.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -63,6 +64,10 @@ # define USE_XATTR false #endif +#if (defined(__BEOS__) || defined(__HAIKU__)) +# include +#endif + #if USE_XATTR # include # include @@ -256,6 +261,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) { @@ -399,6 +490,10 @@ copy_dir (char const *src_name_in, char const *dst_name_in, 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. */ @@ -1034,6 +1129,11 @@ copy_reg (char const *src_name, char const *dst_name, return_val = false; goto close_src_and_dst_desc; } + + if (x->ignore_attributes == 0 + && copy_attributes(source_desc, dest_desc) != 0) + fprintf(stderr, "%s: could not copy attributes\n", src_name); + /* If extra permissions needed for copy_xattr didn't happen (e.g., due to umask) chmod to add them temporarily; if that fails give @@ -2143,6 +2243,12 @@ skip: true, x->verbose, 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; } } @@ -2594,6 +2700,11 @@ skip: 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 1f2b2bb..61f6294 100644 --- a/src/copy.h +++ b/src/copy.h @@ -208,6 +208,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 317d667..164f13c 100644 --- a/src/cp.c +++ b/src/cp.c @@ -60,6 +60,7 @@ struct dir_attr enum { ATTRIBUTES_ONLY_OPTION = CHAR_MAX + 1, + IGNORE_ATTRIBUTES, COPY_CONTENTS_OPTION, DEBUG_OPTION, NO_PRESERVE_ATTRIBUTES_OPTION, @@ -121,6 +122,7 @@ static struct option const long_opts[] = {"debug", no_argument, nullptr, DEBUG_OPTION}, {"dereference", no_argument, nullptr, 'L'}, {"force", no_argument, nullptr, 'f'}, + {"ignore-attributes", no_argument, nullptr, IGNORE_ATTRIBUTES}, {"interactive", no_argument, nullptr, 'i'}, {"link", no_argument, nullptr, 'l'}, {"no-clobber", no_argument, nullptr, 'n'}, /* Deprecated. */ @@ -185,6 +187,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\ @@ -855,6 +858,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; @@ -1061,6 +1065,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 1907b03..9b48d8c 100644 --- a/src/dircolors.h +++ b/src/dircolors.h @@ -72,7 +72,7 @@ static char const G_line[] = 'S','E','T','G','I','D',' ','3','0',';','4','3',' ','#',' ','r','e','g','u','l','a','r',' ','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',' ','0','0',' ','#',' ','r','e','g','u','l','a','r',' ','f','i','l','e',' ','w','i','t','h',' ','c','a','p','a','b','i','l','i','t','y',' ','(','v','e','r','y',' ','e','x','p','e','n','s','i','v','e',' ','t','o',' ','l','o','o','k','u','p',')',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',' ','r','e','g','u','l','a','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 ac57522..86de811 100644 --- a/src/dircolors.hin +++ b/src/dircolors.hin @@ -75,7 +75,7 @@ SETUID 37;41 # regular file that is setuid (u+s) SETGID 30;43 # regular file that is setgid (g+s) CAPABILITY 00 # regular file with capability (very expensive to lookup) 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 regular files with execute permission: diff --git a/src/ls.c b/src/ls.c index 7144d0d..faa77c9 100644 --- a/src/ls.c +++ b/src/ls.c @@ -747,6 +747,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. */ @@ -4392,6 +4397,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))) { @@ -4405,6 +4411,7 @@ print_long_format (const struct fileinfo *f) (uintmax_t) minor (f->stat.st_rdev)); } else +#endif { char hbuf[LONGEST_HUMAN_READABLE + 1]; char const *size = diff --git a/src/mv.c b/src/mv.c index cf1ac56..4802224 100644 --- a/src/mv.c +++ b/src/mv.c @@ -143,6 +143,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 86226b1..9935055 100644 --- a/src/remove.c +++ b/src/remove.c @@ -218,7 +218,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 96c532b..63067e9 100644 --- a/src/uname.c +++ b/src/uname.c @@ -44,6 +44,10 @@ # endif #endif +#ifdef __HAIKU__ +# include +#endif + #include "system.h" #include "quote.h" #include "uname.h" @@ -341,6 +345,30 @@ main (int argc, char **argv) element = processor; } #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.51.0 From 843c5d641aea59c409163df3f671309211dfb22a Mon Sep 17 00:00:00 2001 From: Jerome Duval 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 624664c..376edd7 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1657,7 +1657,7 @@ create_hard_link (char const *src_name, int src_dirfd, char const *src_relname, int err = force_linkat (src_dirfd, src_relname, dst_dirfd, dst_relname, dereference ? AT_SYMLINK_FOLLOW : 0, replace, -1); - if (0 < err) + if (err != 0 && err != -1) { char *a_src_name = nullptr; @@ -1669,7 +1669,7 @@ create_hard_link (char const *src_name, int src_dirfd, char const *src_relname, free (a_src_name); return false; } - if (err < 0 && verbose) + if (err == -1 && verbose) printf (_("removed %s\n"), quoteaf (dst_name)); return true; } @@ -2562,7 +2562,7 @@ skip: int err = force_symlinkat (src_name, dst_dirfd, dst_relname, 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)); @@ -2649,7 +2649,7 @@ skip: int symlink_err = force_symlinkat (src_link_val, dst_dirfd, dst_relname, x->unlink_dest_after_failed_open, -1); - if (0 < symlink_err && x->update == UPDATE_OLDER + if (symlink_err != 0 && symlink_err != -1 && x->update == UPDATE_OLDER && !new_dst && S_ISLNK (dst_sb.st_mode) && dst_sb.st_size == strlen (src_link_val)) { @@ -2667,7 +2667,7 @@ skip: } } 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 7a366bc..3590e5f 100644 --- a/src/ln.c +++ b/src/ln.c @@ -152,7 +152,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. */ @@ -183,7 +183,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base, char *backup_base = nullptr; char *rel_source = nullptr; 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 @@ -270,7 +270,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) { @@ -336,7 +336,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) */ @@ -404,7 +404,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.51.0 From 2e61df991a91b21b41cbf20d677d72aaa3aa4b48 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Tue, 16 Nov 2021 10:22:30 +0100 Subject: uptime: make utmp error not critical diff --git a/src/uptime.c b/src/uptime.c index 0faaf06..16ee50f 100644 --- a/src/uptime.c +++ b/src/uptime.c @@ -45,7 +45,7 @@ print_uptime (idx_t n, STRUCT_UTMP const *utmp_buf) /* Loop through all the utmp entries we just read and count up the valid ones, also in the process possibly gleaning boottime. */ idx_t entries = 0; - for (idx_t i = 0; i < n; i++) + for (idx_t i = 0; utmp_buf && i < n; i++) { STRUCT_UTMP const *this = &utmp_buf[i]; entries += IS_USER_PROCESS (this); -- 2.51.0 From 259156aa351b093f7222aacf149a3df48187b236 Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Fri, 30 Jun 2023 20:14:30 +0200 Subject: stty: fix sign extension in check_speed Ou speed_t is only 8 bits, and is unsigned, so there is no sign expansion. So, if you set a speed_t to -1, it is converted to 255 and doesn't compare equal to -1. diff --git a/src/stty.c b/src/stty.c index 919e32b..2db1c8e 100644 --- a/src/stty.c +++ b/src/stty.c @@ -2074,7 +2074,7 @@ display_all (struct termios *mode, char const *device_name) static void check_speed (struct termios *mode) { - if (last_ibaud != -1 && last_obaud != -1) + if (last_ibaud != (speed_t)-1 && last_obaud != (speed_t)-1) { if (cfgetispeed (mode) != last_ibaud || cfgetospeed (mode) != last_obaud) -- 2.51.0