Am 28.08.2011 05:41, schrieb Denys Vlasenko:
> On Friday 26 August 2011 03:34, Matthias Andree wrote:
>> - in kconfig, note that #define _XOPEN_SOURCE 700 prevents the
>>   definition of SIGWINCH on FreeBSD, as that's a BSD-specific signal.
>>   I don't know what the best fix is, thus no patch.
> 
> Neither do I.

What parts of the same .c file need _XOPEN_SOURCE 700 to expose symbols,
or flip behaviour to be standards-compliant?

Perhaps they should be split from the system-related parts by moving
them into two distinct .c files.

>> - several files lack inclusion of libgen.h, causing complaints like
>> these for dirname. All files that call dirname must #include <libgen.h>.
> 
>> coreutils/rmdir.c: In function 'rmdir_main':
>> coreutils/rmdir.c:72: warning: implicit declaration of function 'dirname'
>> coreutils/rmdir.c:72: warning: assignment makes pointer from integer
>> without a cast
> 
> Well, "man dirname" says:
> 
>        With glibc, one gets the POSIX version of basename() when <libgen.h> is
>        included, and the GNU version otherwise.
> 
> which means that include <libgen.h> is not such a simple matter.

It is very simple, #include <libgen.h>.

The application must be prepared for basename()/dirname() modifying
their argument anyways because you need to support systems where
basename() trashes your data and you don't have the GNU version.

> libbb.h says:
> 
> /* This is declared here rather than #including <libgen.h> in order to avoid
>  * confusing the two versions of basename.  See the dirname/basename man page
>  * for details. */
> #if !defined __FreeBSD__
> char *dirname(char *path);
> #endif
> 
> Should we simply remove "#if !defined __FreeBSD_"?

No, because FreeBSD uses a different prototype and you do not want to
deprive the compiler of related optimization possibilities:

FreeBSD's dirname() doesn't tamper with its argument string and declares
a const char * restricted argument.

Bottom line: you should #include <libgen.h>.

>> libbb/speed_table.c:46: warning: large integer implicitly truncated to
>> unsigned type
>> libbb/speed_table.c:49: warning: large integer implicitly truncated to
>> unsigned type
>> libbb/speed_table.c:52: warning: large integer implicitly truncated to
>> unsigned type
>> libbb/speed_table.c:55: warning: large integer implicitly truncated to
>> unsigned type
> 
> Does this go away if you add (unsinged short) cast before
> Bnnnnnn constants?

You need 32-bit ints for those anyways as they don't fit into 16-bit
unsigned short, quoting termios.h:

/*
 * Standard speeds
 */
#define B0      0
#define B50     50
#define B75     75
#define B110    110
#define B134    134
#define B150    150
#define B200    200
#define B300    300
#define B600    600
#define B1200   1200
#define B1800   1800
#define B2400   2400
#define B4800   4800
#define B9600   9600
#define B19200  19200
#define B38400  38400
#ifndef _POSIX_SOURCE
#define B7200   7200
#define B14400  14400
#define B28800  28800
#define B57600  57600
#define B76800  76800
#define B115200 115200
#define B230400 230400
#define B460800 460800
#define B921600 921600
#define EXTA    19200
#define EXTB    38400
#endif  /* !_POSIX_SOURCE */

And you don't know which system handles that how.

>> - note that find.c cannot be compiled with clang:
>>
>> gmake -f scripts/Makefile.build obj=findutils
>>   clang -Wp,-MD,findutils/.find.o.d   -std=gnu99 -Iinclude -Ilibbb
>> -include include/autoconf.h -D_GNU_SOURCE -DNDEBUG -D_LARGEFILE_SOURCE
>> -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
>> -D"BB_VER=KBUILD_STR(1.19.0)" -DBB_BT=AUTOCONF_TIMESTAMP -O2 -pipe
>> -fno-strict-aliasing -Wall -Wshadow -Wwrite-strings -Wundef
>> -Wstrict-prototypes -Wunused -Wunused-parameter -Wunused-function
>> -Wunused-value -Wmissing-prototypes -Wmissing-declarations
>> -Wdeclaration-after-statement -Wold-style-definition -fno-builtin-strlen
>> -finline-limit=0 -fomit-frame-pointer -ffunction-sections
>> -fdata-sections -fno-guess-branch-probability -funsigned-char
>> -static-libgcc -falign-functions=1 -falign-jumps=1 -falign-labels=1
>> -falign-loops=1 -Os     -D"KBUILD_STR(s)=#s"
>> -D"KBUILD_BASENAME=KBUILD_STR(find)"
>> -D"KBUILD_MODNAME=KBUILD_STR(find)" -c -o findutils/find.o findutils/find.c
>> ...
>> findutils/find.c:896:2: error: illegal storage class on function
>>         auto action* alloc_action(int sizeof_struct, action_fp f);
>>         ^
>> findutils/find.c:897:54: error: expected ';' at end of declaration
>>         action* alloc_action(int sizeof_struct, action_fp f)
>>                                                             ^
>>                                                             ;
> 
> Bug in clang. auto is a valid storate class.

No, it's invalid code:

- C does not support nested functions.

- Valid *storage classes for functions* are extern (the default) and
  static.

Try compiling with gcc -pedantic -std=c99 (or c89) too see how portable
those hacks are.

Oh, and consider C++ - it has nice concepts (like functors) that can be
way more efficient than any C hacks can be (including space efficiency).

>> Can this be fixed for the next release?
> 
> So far all freebsd related fixes are in this:
> 
> http://busybox.net/downloads/fixes-1.19.0/busybox-1.19.0-freebsd.patch

Two more attached, however, there is no need to collect further freebsd
patches in busybox patches. I will keep them locally until 1.19.1 or 1.20.0.

The patch for platform.h is FreeBSD-specific but integrates in a way
that it's safe for upstream inclusion (so as to keep divergence low).

The speedtable fix is generic. If you absolutely need to squeeze those
few bytes, add compile-time checks that (a) all values are actually
distinct after truncation and only then use unsigned short, else
unsigned int, and (b) values are small enough.
--- ./include/platform.h.orig	2011-08-11 02:23:58.000000000 +0200
+++ ./include/platform.h	2011-08-28 12:58:14.000000000 +0200
@@ -421,6 +421,15 @@
 
 #if defined(__FreeBSD__)
 # undef HAVE_STRCHRNUL
+
+# if __FreeBSD__ + 0 >= 2
+#  include <osreldate.h>
+#  if __FreeBSD_version >= 800067
+#   define HAVE_GETLINE 1 /* FreeBSD added getdelim(), getline(),
+			     stpncpy(), strnlen(), wcsnlen(),
+			     wcscasecmp(), and wcsncasecmp() in 800067 */
+#  endif
+# endif
 #endif
 
 #if defined(__NetBSD__)
--- ./libbb/speed_table.c.orig	2011-08-11 02:23:58.000000000 +0200
+++ ./libbb/speed_table.c	2011-08-28 13:00:03.000000000 +0200
@@ -10,7 +10,7 @@
 #include "libbb.h"
 
 struct speed_map {
-	unsigned short speed;
+	unsigned int speed;
 	unsigned short value;
 };
 
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to