summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/Makefile.am6
-rw-r--r--common/unix-peer.c84
-rw-r--r--common/unix-peer.h42
3 files changed, 132 insertions, 0 deletions
diff --git a/common/Makefile.am b/common/Makefile.am
index 9265f5a..54d3f4e 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -41,6 +41,12 @@ libp11_tool_la_SOURCES = \
common/tool.c common/tool.h \
$(NULL)
+if !OS_WIN32
+libp11_tool_la_SOURCES += \
+ common/unix-peer.c common/unix-peer.h \
+ $(NULL)
+endif
+
# Tests ----------------------------------------------------------------
common_LIBS = \
diff --git a/common/unix-peer.c b/common/unix-peer.c
new file mode 100644
index 0000000..354ee02
--- /dev/null
+++ b/common/unix-peer.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 Nikos Mavrogiannopoulos
+ *
+ * This file is part of ocserv.
+ *
+ * ocserv is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ocserv is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+/* needed for struct ucred */
+#if defined(__linux__) && !defined(_GNU_SOURCE)
+#define _GNU_SOURCE
+#endif
+
+#include "unix-peer.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/uio.h>
+#include <sys/errno.h>
+
+/* Returns the unix domain socket peer information.
+ * Returns zero on success.
+ */
+int
+p11_get_upeer_id (int cfd, uid_t *uid, uid_t *gid, pid_t *pid)
+{
+ int ret;
+#if defined(SO_PEERCRED)
+ struct ucred cr;
+ socklen_t cr_len;
+
+ cr_len = sizeof (cr);
+ ret = getsockopt (cfd, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len);
+ if (ret == -1)
+ return -1;
+
+ if (uid)
+ *uid = cr.uid;
+
+ if (gid)
+ *gid = cr.gid;
+
+ if (pid)
+ *pid = cr.pid;
+
+#elif defined(HAVE_GETPEEREID)
+ /* *BSD/MacOSX */
+ uid_t euid;
+ gid_t egid;
+
+ ret = getpeereid (cfd, &euid, &egid);
+
+ if (ret == -1)
+ return -1;
+
+ if (uid)
+ *uid = euid;
+
+ if (gid)
+ *gid = egid;
+
+ if (pid)
+ *pid = -1;
+
+#else
+#error "Unsupported UNIX variant"
+#endif
+ return 0;
+}
diff --git a/common/unix-peer.h b/common/unix-peer.h
new file mode 100644
index 0000000..00adc88
--- /dev/null
+++ b/common/unix-peer.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2014 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * 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.
+ * * The names of contributors to this software may not be
+ * used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
+ * COPYRIGHT OWNER 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.
+ *
+ * Author: Nikos Mavrogiannopoulos
+ */
+
+#ifndef P11_UNIX_PEER_H_
+#define P11_UNIX_PEER_H_
+
+#include <sys/types.h>
+
+int p11_get_upeer_id (int cfd, uid_t *uid, uid_t *gid, pid_t *pid);
+
+#endif /* P11_UNIX_PEER_H_ */