Is there any (evidently non-portable) way of determining a function
instance's return address? I have an idea or two that involves the
return address and dladdr(). The code I currently use looks like this:

int
log_print(log_t *log, char *fmt, ...)
{
    char date[32], str[MAX_LOG_LINE];
    struct iovec iov[10];
    Dl_info info;
    size_t len;
    va_list ap;
    int n;

    len = log_makedate(date, sizeof date);
    iov[n=0].iov_base = date;
    iov[n].iov_len = len;

    if (dladdr(*(((void**)&log)-1), &info) == 0)
        iov[++n].iov_base = "(unknown)";
    else
        iov[++n].iov_base = (char *)info.dli_sname;
    iov[n].iov_len = strlen(iov[n].iov_base);

    iov[++n].iov_base = ": ";
    iov[n].iov_len = 2;
    
    va_start(ap, fmt);
    len = lvformat(str, sizeof str, fmt, ap);
    va_end(ap);

    while (len > 0 && isspace(str[len-1]))
        --len;
    
    iov[++n].iov_base = str;
    iov[n].iov_len = len;

    iov[++n].iov_base = "\n";
    iov[n].iov_len = 1;
    
    return writev(log->fd, iov, ++n);
}

Is it correct? (empirical evidence suggests it is) Is there any better
way to do it? Will it work on the Alpha?

BTW, is dladdr() signal-safe?

DES
-- 
Dag-Erling Smorgrav - [EMAIL PROTECTED]


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to