/* Public domain */ #include #include #include #if defined(HAVE_GETPEEREID) # include # include # include # include # include #elif defined(HAVE_SO_PEERCRED) # include # include # include # include #elif defined(HAVE_GETPEERUCRED) # include # include #endif static __inline__ int Getpeereid(int sock, uid_t *uid, gid_t *gid) { #ifdef HAVE_GETPEEREID if (getpeereid(sock, uid, gid) == -1) { MPD_SetError("getpeereid: %s", strerror(errno)); return (-1); } return (0); #elif defined(HAVE_SO_PEERCRED) struct ucred creds; socklen_t socklen; socklen = sizeof(creds); if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &creds, &socklen) != 0) { MPD_SetError("SO_PEERCRED: %s", strerror(errno)); return (-1); } *uid = (uid_t)creds.uid; *gid = (gid_t)creds.gid; return (0); #elif defined(HAVE_GETPEERUCRED) ucred_t *creds; int rv; if ((creds = malloc(ucred_size())) == NULL) { MPD_SetErrorS("Out of memory"); return (-1); } rv = getpeerucred(sock, &creds); if (rv < 0) { MPD_SetErrorS("getpeerucred failed"); return (-1); } *uid = ucred_geteuid(creds); *gid = ucred_getegid(creds); ucred_free(creds); return (0); #else MPD_SetErrorS("getpeereid not available"); return (-1); #endif }