Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Sep 2000 19:42:00 +0300
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        current@FreeBSD.org
Cc:        jlemon@FreeBSD.org, jasone@FreeBSD.org
Subject:   Thread-safe version of fpathconf(2) syscall missed from libc_r [patch  for review]
Message-ID:  <39C645D8.ED66330A@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------F173C57EA66A1E2470B9EBFC
Content-Type: text/plain; charset=koi8-r
Content-Transfer-Encoding: 7bit

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

--------------F173C57EA66A1E2470B9EBFC
Content-Type: text/plain; charset=koi8-r;
 name="libc_r-fpathconf.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="libc_r-fpathconf.diff"

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 <sobomax@FreeBSD.org>
+ * 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

--------------F173C57EA66A1E2470B9EBFC--



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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