diff options
-rw-r--r-- | common/Makefile.am | 6 | ||||
-rw-r--r-- | common/unix-peer.c | 84 | ||||
-rw-r--r-- | common/unix-peer.h | 42 |
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_ */ |