[PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

Subsystems: the rest

DORMANTno replies

5 messages, 3 authors, 2016-06-15 · open the first message on its own page

[PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

From: Ramsay Jones <hidden>
Date: 2016-06-15 22:42:35

convert-objects.c sets _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED before
including <time.h>, in order to get the declaration of strptime().
This leads to breakage in cache.h, due to S_ISLNK and S_IFLNK no longer
being defined by <sys/stat.h>.  These definitions are protected by the
__USE_BSD symbol, which is not set when _XOPEN_SOURCE is set.  Moving
the #defines and #include <time.h> below all other #includes does not
fix the problem, however, since now _USE_XOPEN, which protects the
declaration of strptime(), is now not defined (don't ask!).

The fix is to #define _GNU_SOURCE, which enables the definition of
practically everything.

Signed-off-by: Ramsay Allan Jones <redacted>
---
 convert-objects.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/convert-objects.c b/convert-objects.c
index 0fabd89..971ad6d 100644
--- a/convert-objects.c
+++ b/convert-objects.c
@@ -1,5 +1,6 @@
 #define _XOPEN_SOURCE 500 /* glibc2 and AIX 5.3L need this */
 #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
+#define _GNU_SOURCE
 #include <time.h>
 #include "cache.h"
 #include "blob.h"
-- 
1.4.1

Re: [PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:42:35

"Ramsay Jones" [off-list ref] writes:
convert-objects.c sets _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED before
including <time.h>, in order to get the declaration of strptime().
This leads to breakage in cache.h, due to S_ISLNK and S_IFLNK no longer
being defined by <sys/stat.h>.  These definitions are protected by the
__USE_BSD symbol, which is not set when _XOPEN_SOURCE is set.  Moving
the #defines and #include <time.h> below all other #includes does not
fix the problem, however, since now _USE_XOPEN, which protects the
declaration of strptime(), is now not defined (don't ask!).
Wouldn't including "cache.h" and friends first and including
<time.h> last solve the problem, then?

This kind of change tends to fix one system while potentially
breaking another, and we would need to be careful.  Will queue
for post 1.4.2 and have people scream if it breaks somebody, I
guess.

RE: [PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

From: Ramsay Jones <hidden>
Date: 2016-06-15 22:42:35

On Wed, 2006-08-02 at 8:46, Junio C Hamano wrote:
"Ramsay Jones" [off-list ref] writes:
quoted
convert-objects.c sets _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED before
including <time.h>, in order to get the declaration of strptime().
This leads to breakage in cache.h, due to S_ISLNK and S_IFLNK no longer
being defined by <sys/stat.h>.  These definitions are protected by the
__USE_BSD symbol, which is not set when _XOPEN_SOURCE is set.  Moving
the #defines and #include <time.h> below all other #includes does not
fix the problem, however, since now _USE_XOPEN, which protects the
declaration of strptime(), is now not defined (don't ask!).
Wouldn't including "cache.h" and friends first and including
<time.h> last solve the problem, then?
Not for me. It may be a glibc 2.1 specific problem, of course, but 
strptime() remains undeclared.
This kind of change tends to fix one system while potentially
breaking another, and we would need to be careful.  Will queue
for post 1.4.2 and have people scream if it breaks somebody, I
guess.
Yes, I had some concern about that myself. Unfortunately, you can't
make it conditional on the glibc version macros; in order to get the
macros, you have to include (one way or another) <features.h>, at which
point it is already too late ...

Ramsay

RE: [PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:42:35

Hi,

On Wed, 2 Aug 2006, Ramsay Jones wrote:
[...] but strptime() remains undeclared.
Note that there is just one call to strptime() in the C sources: 
convert-objects.

Also, we have something more portable in git now: you might be able to 
substitute

	const char *next = strptime(buf, *fmt, &tm);
	if (next) {

by something like

	char buffer[50];
	int len = parse_date(buf, buffer, sizeof(buffer));
	const char *next = buf + len;

	if (len) {
		const char *tzstring = strchr(buffer, ' ') + 1;
		int tz = (int)strtol(tzstring, NULL, 10);
		tm = *time_to_tm(strtoul(buffer, NULL, 10), tz);

However, I did not test it, and this might be completely bogus.

Ciao,
Dscho
	

RE: [PATCH 6/10] Fix header breakage with _XOPEN_SOURCE.

From: Ramsay Jones <hidden>
Date: 2016-06-15 22:42:35

On Fri, 2006-08-04 at 1:20, Johannes Schindelin wrote:
Hi,

On Wed, 2 Aug 2006, Ramsay Jones wrote:
quoted
[...] but strptime() remains undeclared.
Note that there is just one call to strptime() in the C sources: 
convert-objects.

Also, we have something more portable in git now: you might be able to 
substitute

	const char *next = strptime(buf, *fmt, &tm);
	if (next) {

by something like

	char buffer[50];
	int len = parse_date(buf, buffer, sizeof(buffer));
	const char *next = buf + len;

	if (len) {
		const char *tzstring = strchr(buffer, ' ') + 1;
		int tz = (int)strtol(tzstring, NULL, 10);
		tm = *time_to_tm(strtoul(buffer, NULL, 10), tz);

However, I did not test it, and this might be completely bogus.
Yes, I'm sure something like that could be done, but I really don't
think we need anything that intrusive to fix such a simple problem.
Indeed, I would rather Junio ignore the patch if it appears to cause
anyone else a problem. I can maintain it locally (it's only one line!).
After all, I'm pretty sure I'm the only idiot^H^H^H^H^H person using a
six year old dev system.

Ramsay
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help