X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Futil%2Funix.c;h=4572caddd454d36c1b0cd3e45b6b258b7aedadf3;hp=a74ca80b49648d5464d34166ab81508674db9092;hb=c72d10d6f92fe81d040ab983768d7fdccea7fb2e;hpb=acb180395693ed05a4e6a1edb6796c8e6f644a72 diff --git a/libatalk/util/unix.c b/libatalk/util/unix.c index a74ca80b..4572cadd 100644 --- a/libatalk/util/unix.c +++ b/libatalk/util/unix.c @@ -44,6 +44,7 @@ #include #include #include +#include /* close all FDs >= a specified value */ static void closeall(int fd) @@ -262,11 +263,15 @@ int ochown(const char *path, uid_t owner, gid_t group, int options) * Options description: * O_NOFOLLOW: don't chmod() symlinks, do nothing, return 0 * O_NETATALK_ACL: call chmod_acl() instead of chmod() + * O_IGNORE: ignore chmod() request, directly return 0 */ -int ochmod(const char *path, mode_t mode, const struct stat *st, int options) +int ochmod(char *path, mode_t mode, const struct stat *st, int options) { struct stat sb; + if (options & O_IGNORE) + return 0; + if (!st) { if (lstat(path, &sb) != 0) return -1; @@ -436,7 +441,7 @@ char *realpath_safe(const char *path) #ifdef REALPATH_TAKES_NULL if ((resolved_path = realpath(path, NULL)) == NULL) { - LOG(log_error, logtype_afpd, "realpath() cannot resolve path \"%s\"", path); + LOG(log_debug, logtype_afpd, "realpath() cannot resolve path \"%s\"", path); return NULL; } return resolved_path; @@ -445,7 +450,7 @@ char *realpath_safe(const char *path) return NULL; if (realpath(path, resolved_path) == NULL) { free(resolved_path); - LOG(log_error, logtype_afpd, "realpath() cannot resolve path \"%s\"", path); + LOG(log_debug, logtype_afpd, "realpath() cannot resolve path \"%s\"", path); return NULL; } /* Safe some memory */ @@ -507,3 +512,45 @@ char *strtok_quote(char *s, const char *delim) } return token; } + +int set_groups(AFPObj *obj, struct passwd *pwd) +{ + if (initgroups(pwd->pw_name, pwd->pw_gid) < 0) + LOG(log_error, logtype_afpd, "initgroups(%s, %d): %s", pwd->pw_name, pwd->pw_gid, strerror(errno)); + + if ((obj->ngroups = getgroups(0, NULL)) < 0) { + LOG(log_error, logtype_afpd, "login: %s getgroups: %s", pwd->pw_name, strerror(errno)); + return -1; + } + + if (obj->groups) + free(obj->groups); + if (NULL == (obj->groups = calloc(obj->ngroups, sizeof(gid_t))) ) { + LOG(log_error, logtype_afpd, "login: %s calloc: %d", obj->ngroups); + return -1; + } + + if ((obj->ngroups = getgroups(obj->ngroups, obj->groups)) < 0 ) { + LOG(log_error, logtype_afpd, "login: %s getgroups: %s", pwd->pw_name, strerror(errno)); + return -1; + } + + return 0; +} + +#define GROUPSTR_BUFSIZE 1024 +const char *print_groups(int ngroups, gid_t *groups) +{ + static char groupsstr[GROUPSTR_BUFSIZE]; + int i; + char *s = groupsstr; + + if (ngroups == 0) + return "-"; + + for (i = 0; (i < ngroups) && (s < &groupsstr[GROUPSTR_BUFSIZE]); i++) { + s += snprintf(s, &groupsstr[GROUPSTR_BUFSIZE] - s, " %u", groups[i]); + } + + return groupsstr; +}