Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2011 00:07:54 -0600
From:      Dan Nelson <dnelson@allantgroup.com>
To:        John Levine <johnl@iecc.com>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: What's wrong with this code?
Message-ID:  <20111213060754.GG53453@dan.emsphone.com>
In-Reply-To: <20111213051220.45894.qmail@joyce.lan>
References:  <20111213051220.45894.qmail@joyce.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (Dec 13), John Levine said:
> This tiny routine is in a .so loadable module I use.  (It's part of the
> mailfront SMTP daemon.)
> 
> static const char* date_string(void)
> {
>   static char datebuf[64];
>   time_t now = time(0);
>   struct tm* tm = gmtime(&now);
>   strftime(datebuf, sizeof datebuf - 1, "%d %b %Y %H:%M:%S -0000", tm);
>   return datebuf;
> }
> 
> I was getting bogus dates.  Running it under GDB, time() is returning 1,
> -and setting errno to 22, which is EINVAL.  Changing the call to
> time to time(NULL) or time(&now) made no difference.

The manpage says that time() can fail for any of the reasons described in
gettimeofday(2), but time() actually calls clock_gettime(CLOCK_SECOND),
which technically could return EINVAL if the first argument isn't a valid
clock_id.  CLOCK_SECOND is valid, though, so in practice it should never
fail with EINVAL.  You could try adding a printf to
sys/kern/kern_time.c:kern_clock_gettime() to see if it's really failing
there. 
 
> I changed it to a call to gettimeofday(), which works fine.  But what
> could the problem have been?  When I splice this routine into a tiny test
> program that calls it and prints out the result, it works fine.
> 
> The obvious problem, since it's in a .so, is that it's linking to
> something other than the system library time() function, but I did an nm
> on the .so, and it said this, which sure looks like the system time()
> function to me:
> 
>                  U time@@FBSD_1.0
> 
> Setting a breakpoint in gdb gets a complaint about trying to set a
> breakpoint in /lib/libc.so.7.

Setting a breakpoint in a llibc should work fine, since time() is a regular
function and not a syscall stub.  Have you built a libc with debugging
symbols? ( easy way: add DEBUG_FLAGS=-g to the top of
/usr/src/lib/libc/Makefile, and run "make obj && make clean && make depend
&& make && make install" in that directory )
 
> Any ideas what the problem was?

-- 
	Dan Nelson
	dnelson@allantgroup.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20111213060754.GG53453>