]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - libutil/login_cap.c
Add utility functions for checking if a given kernel module is loaded,
[pw-darwin.git] / libutil / login_cap.c
index 9797c8bcc6abc45d50ededa84a8012221322eadf..6d965e307c3457f06ddfae69801d5602fb1a572b 100644 (file)
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <sys/param.h>
-#include <pwd.h>
+#include <errno.h>
+#include <fcntl.h>
 #include <libutil.h>
-#include <syslog.h>
 #include <login_cap.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
 
 /*
  * allocstr()
@@ -60,10 +59,10 @@ static int lc_object_count = 0;
 static size_t internal_stringsz = 0;
 static char * internal_string = NULL;
 static size_t internal_arraysz = 0;
-static char ** internal_array = NULL;
+static const char ** internal_array = NULL;
 
 static char *
-allocstr(char *str)
+allocstr(const char *str)
 {
     char    *p;
 
@@ -78,10 +77,10 @@ allocstr(char *str)
 }
 
 
-static char **
+static const char **
 allocarray(size_t sz)
 {
-    char    **p;
+    static const char    **p;
 
     if (sz <= internal_arraysz)
        p = internal_array;
@@ -101,25 +100,26 @@ allocarray(size_t sz)
  * Free using freearraystr()
  */
 
-static char **
-arrayize(char *str, const char *chars, int *size)
+static const char **
+arrayize(const char *str, const char *chars, int *size)
 {
     int            i;
-    char    *ptr;
-    char    **res = NULL;
+    char *ptr;
+    const char *cptr;
+    const char **res = NULL;
 
     /* count the sub-strings */
-    for (i = 0, ptr = str; *ptr; i++) {
-       int count = strcspn(ptr, chars);
-       ptr += count;
-       if (*ptr)
-           ++ptr;
+    for (i = 0, cptr = str; *cptr; i++) {
+       int count = strcspn(cptr, chars);
+       cptr += count;
+       if (*cptr)
+           ++cptr;
     }
 
     /* alloc the array */
     if ((ptr = allocstr(str)) != NULL) {
        if ((res = allocarray(++i)) == NULL)
-           free(str);
+           free((void *)(uintptr_t)(const void *)str);
        else {
            /* now split the string */
            i = 0;
@@ -172,9 +172,10 @@ login_close(login_cap_t * lc)
  * login_getclassbyname() get the login class by its name.
  * If the name given is NULL or empty, the default class
  * LOGIN_DEFCLASS (ie. "default") is fetched. If the
- * 'dir' argument contains a non-NULL non-empty string,
- * then the file _FILE_LOGIN_CONF is picked up from that
- * directory instead of the system login database.
+ * 'pwd' argument is non-NULL and contains an non-NULL
+ * dir entry, then the file _FILE_LOGIN_CONF is picked
+ * up from that directory and used before the system
+ * login database.
  * Return a filled-out login_cap_t structure, including
  * class name, and the capability record buffer.
  */
@@ -225,7 +226,7 @@ login_getclassbyname(char const *name, const struct passwd *pwd)
        if (name == NULL || *name == '\0')
            name = LOGIN_DEFCLASS;
 
-       switch (cgetent(&lc->lc_cap, login_dbarray, (char*)name)) {
+       switch (cgetent(&lc->lc_cap, login_dbarray, name)) {
        case -1:                /* Failed, entry does not exist */
            if (me)
                break;  /* Don't retry default on 'me' */
@@ -243,9 +244,9 @@ login_getclassbyname(char const *name, const struct passwd *pwd)
            /* fall-back to default class */
            name = LOGIN_DEFCLASS;
            msg = "%s: no default/fallback class '%s'";
-           if (cgetent(&lc->lc_cap, login_dbarray, (char*)name) != 0 && r >= 0)
+           if (cgetent(&lc->lc_cap, login_dbarray, name) != 0 && r >= 0)
                break;
-           /* Fallthru - just return system defaults */
+           /* FALLTHROUGH - just return system defaults */
        case 0:         /* success! */
            if ((lc->lc_class = strdup(name)) != NULL) {
                if (dir) {
@@ -340,12 +341,12 @@ login_getuserclass(const struct passwd *pwd)
 /*
  * login_getcapstr()
  * Given a login_cap entry, and a capability name, return the
- * value defined for that capability, a defualt if not found, or
+ * value defined for that capability, a default if not found, or
  * an error string on error.
  */
 
-char *
-login_getcapstr(login_cap_t *lc, const char *cap, char *def, char *error)
+const char *
+login_getcapstr(login_cap_t *lc, const char *cap, const char *def, const char *error)
 {
     char    *res;
     int            ret;
@@ -353,7 +354,7 @@ login_getcapstr(login_cap_t *lc, const char *cap, char *def, char *error)
     if (lc == NULL || cap == NULL || lc->lc_cap == NULL || *cap == '\0')
        return def;
 
-    if ((ret = cgetstr(lc->lc_cap, (char *)cap, &res)) == -1)
+    if ((ret = cgetstr(lc->lc_cap, cap, &res)) == -1)
        return def;
     return (ret >= 0) ? res : error;
 }
@@ -366,10 +367,10 @@ login_getcapstr(login_cap_t *lc, const char *cap, char *def, char *error)
  * strings.
  */
 
-char **
+const char **
 login_getcaplist(login_cap_t *lc, const char *cap, const char *chars)
 {
-    char    *lstring;
+    const char *lstring;
 
     if (chars == NULL)
        chars = ", \t";
@@ -387,22 +388,22 @@ login_getcaplist(login_cap_t *lc, const char *cap, const char *chars)
  * If there is an error of any kind, return <error>.
  */
 
-char *
-login_getpath(login_cap_t *lc, const char *cap, char * error)
+const char *
+login_getpath(login_cap_t *lc, const char *cap, const char *error)
 {
-    char    *str;
-
-    if ((str = login_getcapstr(lc, (char*)cap, NULL, NULL)) == NULL)
-       str = error;
-    else {
-       char *ptr = str;
-
-       while (*ptr) {
-           int count = strcspn(ptr, ", \t");
-           ptr += count;
-           if (*ptr)
-               *ptr++ = ':';
-       }
+    const char *str;
+    char *ptr;
+    int count;
+
+    str = login_getcapstr(lc, cap, NULL, NULL);
+    if (str == NULL)
+       return error;
+    ptr = __DECONST(char *, str); /* XXXX Yes, very dodgy */
+    while (*ptr) {
+       count = strcspn(ptr, ", \t");
+       ptr += count;
+       if (*ptr)
+           *ptr++ = ':';
     }
     return str;
 }
@@ -536,7 +537,7 @@ login_getcaptime(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
      * If there's an error, return <error>.
      */
 
-    if ((r = cgetstr(lc->lc_cap, (char *)cap, &res)) == -1)
+    if ((r = cgetstr(lc->lc_cap, cap, &res)) == -1)
        return def;
     else if (r < 0) {
        errno = ERANGE;
@@ -623,10 +624,10 @@ login_getcapnum(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
     /*
      * For BSDI compatibility, try for the tag=<val> first
      */
-    if ((r = cgetstr(lc->lc_cap, (char *)cap, &res)) == -1) {
+    if ((r = cgetstr(lc->lc_cap, cap, &res)) == -1) {
        long    lval;
        /* string capability not present, so try for tag#<val> as numeric */
-       if ((r = cgetnum(lc->lc_cap, (char *)cap, &lval)) == -1)
+       if ((r = cgetnum(lc->lc_cap, cap, &lval)) == -1)
            return def; /* Not there, so return default */
        else if (r >= 0)
            return (rlim_t)lval;
@@ -672,7 +673,7 @@ login_getcapsize(login_cap_t *lc, const char *cap, rlim_t def, rlim_t error)
     if (lc == NULL || lc->lc_cap == NULL)
        return def;
 
-    if ((r = cgetstr(lc->lc_cap, (char *)cap, &res)) == -1)
+    if ((r = cgetstr(lc->lc_cap, cap, &res)) == -1)
        return def;
     else if (r < 0) {
        errno = ERANGE;
@@ -740,7 +741,7 @@ login_getcapbool(login_cap_t *lc, const char *cap, int def)
 {
     if (lc == NULL || lc->lc_cap == NULL)
        return def;
-    return (cgetcap(lc->lc_cap, (char *)cap, ':') != NULL);
+    return (cgetcap(lc->lc_cap, cap, ':') != NULL);
 }
 
 
@@ -764,18 +765,18 @@ login_getcapbool(login_cap_t *lc, const char *cap, int def)
  *     login_getstyle(lc, "skey", "network");
  */
 
-char *
-login_getstyle(login_cap_t *lc, char *style, const char *auth)
+const char *
+login_getstyle(login_cap_t *lc, const char *style, const char *auth)
 {
     int            i;
-    char    **authtypes = NULL;
+    const char **authtypes = NULL;
     char    *auths= NULL;
     char    realauth[64];
 
-    static char *defauthtypes[] = { LOGIN_DEFSTYLE, NULL };
+    static const char *defauthtypes[] = { LOGIN_DEFSTYLE, NULL };
 
     if (auth != NULL && *auth != '\0') {
-       if (snprintf(realauth, sizeof realauth, "auth-%s", auth) < sizeof realauth)
+       if (snprintf(realauth, sizeof realauth, "auth-%s", auth) < (int)sizeof(realauth))
            authtypes = login_getcaplist(lc, realauth, NULL);
     }