Hi,

It seems that due to unknown for me reasons, thread-safe wrapper for
fpathconf(2) syscall is missed from the libc_r, while fpathconf listed in the
list of syscalls for which thread-safe wrappers are to be provided
(src/lib/libc_r/Makefile:31). The following short example exposes the bug:

fpath.c:
#include <unistd.h>
#include <pthread.h>
int main()
{
        return fpathconf(1, 3);
}

$ cc -pthread fpath.c
/tmp/ccF56334.o: In function `main':
/tmp/ccF56334.o(.text+0xe): undefined reference to `fpathconf'

Attached patch expected to fix the problem.

-Maxim
diff -druN libc_r.orig/uthread/Makefile.inc libc_r/uthread/Makefile.inc
--- libc_r.orig/uthread/Makefile.inc    Fri Aug 11 14:49:15 2000
+++ libc_r/uthread/Makefile.inc Mon Sep 18 18:28:49 2000
@@ -49,6 +49,7 @@
        uthread_find_thread.c \
        uthread_flock.c \
        uthread_fork.c \
+       uthread_fpathconf.c \
        uthread_fstat.c \
        uthread_fstatfs.c \
        uthread_fsync.c \
diff -druN libc_r.orig/uthread/pthread_private.h libc_r/uthread/pthread_private.h
--- libc_r.orig/uthread/pthread_private.h       Fri Aug 11 14:49:15 2000
+++ libc_r/uthread/pthread_private.h    Mon Sep 18 19:10:00 2000
@@ -1204,6 +1204,7 @@
 int     _thread_sys_pause(void);
 int     _thread_sys_pipe(int *);
 int     _thread_sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
+long    _thread_sys_fpathconf(int, int);
 off_t   _thread_sys_lseek(int, off_t, int);
 pid_t   _thread_sys_fork(void);
 pid_t   _thread_sys_tcgetpgrp(int);
diff -druN libc_r.orig/uthread/uthread_fpathconf.c libc_r/uthread/uthread_fpathconf.c
--- libc_r.orig/uthread/uthread_fpathconf.c     Thu Jan  1 03:00:00 1970
+++ libc_r/uthread/uthread_fpathconf.c  Mon Sep 18 19:24:14 2000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2000 Maxim Sobolev <[EMAIL PROTECTED]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+#include <unistd.h>
+#ifdef _THREAD_SAFE
+#include <pthread.h>
+#include "pthread_private.h"
+
+long
+_fpathconf(int fd, int name)
+{
+       long            ret;
+
+       if ((ret = _FD_LOCK(fd, FD_READ, NULL)) == 0) {
+               ret = _thread_sys_fpathconf(fd, name);
+               _FD_UNLOCK(fd, FD_READ);
+       }
+       return ret;
+}
+
+__strong_reference(_fpathconf, fpathconf);
+#endif

Reply via email to