/* * Copyright (C) 2008-2009 Karel Zak * * This file may be redistributed under the terms of the * GNU Lesser General Public License. */ #include #include #include #include #ifdef HAVE_SYS_PRCTL_H #include #else #define PR_GET_DUMPABLE 3 #endif #if (!defined(HAVE_PRCTL) && defined(linux)) #include #endif #include #include #include #include #include #include "mountP.h" char *mnt_getenv_safe(const char *arg) { if ((getuid() != geteuid()) || (getgid() != getegid())) return NULL; #if HAVE_PRCTL if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0) == 0) return NULL; #else #if (defined(linux) && defined(SYS_prctl)) if (syscall(SYS_prctl, PR_GET_DUMPABLE, 0, 0, 0, 0) == 0) return NULL; #endif #endif #ifdef HAVE___SECURE_GETENV return __secure_getenv(arg); #else return getenv(arg); #endif } /* TODO: move strn<...> functions to top-level lib/strn.c */ #ifndef HAVE_STRNLEN size_t strnlen(const char *s, size_t maxlen) { int i; for (i = 0; i < maxlen; i++) { if (s[i] == '\0') return i + 1; } return maxlen; } #endif #ifndef HAVE_STRNCHR char *strnchr(const char *s, size_t maxlen, int c) { for (; maxlen-- && *s != '\0'; ++s) if (*s == (char)c) return (char *)s; return NULL; } #endif #ifndef HAVE_STRNDUP char *strndup(const char *s, size_t n) { size_t len = strnlen (s, n); char *new = (char *) malloc (len + 1); if (new == NULL) return NULL; new[len] = '\0'; return (char *) memcpy (new, s, len); } #endif /** * mnt_fstype_is_pseudofs: * @type: filesystem name * * Returns: 1 for filesystems like proc, sysfs, ... or 0. */ int mnt_fstype_is_pseudofs(const char *type) { if (!type) return 0; if (strcmp(type, "none") == 0 || strcmp(type, "proc") == 0 || strcmp(type, "tmpfs") == 0 || strcmp(type, "sysfs") == 0 || strcmp(type, "devpts") == 0|| strcmp(type, "cgroups") == 0 || strcmp(type, "devfs") == 0 || strcmp(type, "dlmfs") == 0 || strcmp(type, "cpuset") == 0 || strcmp(type, "spufs") == 0) return 1; return 0; } /** * mnt_fstype_is_netfs: * @type: filesystem name * * Returns: 1 for filesystems like cifs, nfs, ... or 0. */ int mnt_fstype_is_netfs(const char *type) { if (!type) return 0; if (strcmp(type, "cifs") == 0 || strcmp(type, "smbfs") == 0 || strncmp(type, "nfs", 3) == 0 || strcmp(type, "afs") == 0 || strcmp(type, "ncpfs") == 0) return 1; return 0; } /* * Reallocates its first arg @s - typical use: s = mnt_strconcat3(s,t,u); * Returns reallocated @s ion succes or NULL in case of error. */ char *mnt_strconcat3(char *s, const char *t, const char *u) { size_t len = 0; len = (s ? strlen(s) : 0) + (t ? strlen(t) : 0) + (u ? strlen(u) : 0); if (!len) return NULL; if (!s) { s = malloc(len + 1); *s = '\0'; } else s = realloc(s, len + 1); if (!s) return NULL; if (t) strcat(s, t); if (u) strcat(s, u); return s; } /** * mnt_open_device: * @devname: device path * @flags: open(2) flags * * Opens device like open(2), but waits for cdrom medium (if errno=ENOMEDIUM). * * Returns: file descriptor or -1 in case of error. */ int mnt_open_device(const char *devname, int flags) { int retries = 0; do { int fd = open(devname, flags); if (fd >= 0) return fd; if (errno != ENOMEDIUM) break; if (retries >= CONFIG_CDROM_NOMEDIUM_RETRIES) break; ++retries; sleep(3); } while(1); return -1; } /* * Returns allocated string with username or NULL. */ char *mnt_get_username(const uid_t uid) { struct passwd pwd; struct passwd *res; size_t sz = sysconf(_SC_GETPW_R_SIZE_MAX); char *buf, *username = NULL; if (sz <= 0) sz = 16384; /* Should be more than enough */ buf = malloc(sz); if (!buf) return NULL; if (!getpwuid_r(uid, &pwd, buf, sz, &res) && res) username = strdup(pwd.pw_name); free(buf); return username; }