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(-)
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.
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
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
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