|
- /*
- Copyright (C) 2014-2017 Cédric Schieli
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License
- as published by the Free Software Foundation; either version 2.1
- of the License, or (at your option) any later version.
-
- This program 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 Lesser General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
- #ifndef WIN32
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <grp.h>
- #ifdef __APPLE__
- #include <AvailabilityMacros.h>
- #endif
- #include "JackError.h"
- #endif
-
-
- int
- jack_group2gid(const char* group)
- {
- #ifdef WIN32
- return -1;
- #else
- size_t buflen;
- char *buf;
- int ret;
- struct group grp;
- struct group *result;
-
- if (!group || !*group)
- return -1;
-
- ret = strtol(group, &buf, 10);
- if (!*buf)
- return ret;
-
- /* MacOSX only defines _SC_GETGR_R_SIZE_MAX starting from 10.4 */
- #if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
- buflen = 4096;
- #else
- buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
- if (buflen == -1)
- buflen = 4096;
- #endif
- buf = (char*)malloc(buflen);
-
- while (buf && ((ret = getgrnam_r(group, &grp, buf, buflen, &result)) == ERANGE)) {
- buflen *= 2;
- buf = (char*)realloc(buf, buflen);
- }
- if (!buf)
- return -1;
- free(buf);
- if (ret || !result)
- return -1;
- return grp.gr_gid;
- #endif
- }
-
- #ifndef WIN32
- int
- jack_promiscuous_perms(int fd, const char* path, gid_t gid)
- {
- mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
- if (gid >= 0) {
- if (((fd < 0) ? chown(path, -1, gid) : fchown(fd, -1, gid)) < 0) {
- jack_log("Cannot chgrp %s: %s. Falling back to permissive perms.", path, strerror(errno));
- } else {
- mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
- }
- }
- if (((fd < 0) ? chmod(path, mode) : fchmod(fd, mode)) < 0) {
- jack_log("Cannot chmod %s: %s. Falling back to default (umask) perms.", path, strerror(errno));
- return -1;
- }
- return 0;
- }
- #endif
|