diff options
Diffstat (limited to 'nis/nis_defaults.c')
-rw-r--r-- | nis/nis_defaults.c | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/nis/nis_defaults.c b/nis/nis_defaults.c new file mode 100644 index 0000000000..9d152d1f11 --- /dev/null +++ b/nis/nis_defaults.c @@ -0,0 +1,466 @@ +/* Copyright (c) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <rpc/rpc.h> +#include <rpcsvc/nis.h> +#include <rpcsvc/nislib.h> + +#define DEFAULT_TTL 43200 + +/* +** Some functions for parsing the -D param and NIS_DEFAULTS Environ +*/ +static nis_name +searchgroup (char *str) +{ + static char default_group[NIS_MAXNAMELEN]; + char *cptr; + int i; + + cptr = strstr (str, "group="); + if (cptr == NULL) + return NULL; + + cptr += 6; /* points to the begin of the group string */ + i = 0; + while (cptr[i] != '\0' && cptr[i] != ':') + i++; + if (i == 0) /* only "group=" ? */ + return (nis_name)""; + + strncpy (default_group, cptr, i); + + return default_group; +} + +static nis_name +searchowner (char *str) +{ + static char default_owner[NIS_MAXNAMELEN]; + char *cptr; + int i; + + cptr = strstr (str, "owner="); + if (cptr == NULL) + return NULL; + + cptr += 6; /* points to the begin of the owner string */ + i = 0; + while (cptr[i] != '\0' && cptr[i] != ':') + i++; + if (i == 0) /* only "owner=" ? */ + return (nis_name)""; + + strncpy (default_owner, cptr, i); + + return default_owner; +} + +static u_long +searchttl (char *str) +{ + char buf[1024]; + char *cptr, *dptr; + u_long time; + int i; + + dptr = strstr (str, "ttl="); + if (dptr == NULL) /* should (could) not happen */ + return DEFAULT_TTL;; + + dptr += 4; /* points to the begin of the new ttl */ + i = 0; + while (dptr[i] != '\0' && dptr[i] != ':') + i++; + if (i == 0) /* only "ttl=" ? */ + return DEFAULT_TTL; + + strncpy (buf, dptr, i); + time = 0; + + dptr = buf; + cptr = strchr (dptr, 'd'); + if (cptr != NULL) + { + *cptr = '\0'; + cptr++; + time += atoi (dptr) * 60 * 60 * 24; + dptr = cptr; + } + + cptr = strchr (dptr, 'h'); + if (cptr != NULL) + { + *cptr = '\0'; + cptr++; + time += atoi (dptr) * 60 * 60; + dptr = cptr; + } + + cptr = strchr (dptr, 'm'); + if (cptr != NULL) + { + *cptr = '\0'; + cptr++; + time += atoi (dptr) * 60; + dptr = cptr; + } + + cptr = strchr (dptr, 's'); + if (cptr != NULL) + *cptr = '\0'; + + time += atoi (dptr); + + return time; +} + +static u_long +searchaccess (char *str, u_long access) +{ + static char buf[NIS_MAXNAMELEN]; + char *cptr; + u_long result; + int i; + int n, o, g, w; + + cptr = strstr (str, "access="); + if (cptr == NULL) + return 0; + + cptr += 7; /* points to the begin of the access string */ + i = 0; + while (cptr[i] != '\0' && cptr[i] != ':') + i++; + if (i == 0) /* only "access=" ? */ + return 0; + + strncpy (buf, cptr, i); + + result = n = o = g = w = 0; + cptr = buf; + while (*cptr != '\0') + { + switch (*cptr) + { + case 'n': + n = 1; + break; + case 'o': + o = 1; + break; + case 'g': + g = 1; + break; + case 'w': + w = 1; + break; + case 'a': + o = g = w = 1; + break; + case '-': + cptr++; /* Remove "=" from beginning */ + while (*cptr != '\0' && *cptr != ',') + { + switch (*cptr) + { + case 'r': + if (n) + result = result & ~(NIS_READ_ACC << 24); + if (o) + result = result & ~(NIS_READ_ACC << 16); + if (g) + result = result & ~(NIS_READ_ACC << 8); + if (w) + result = result & ~(NIS_READ_ACC); + break; + case 'm': + if (n) + result = result & ~(NIS_MODIFY_ACC << 24); + if (o) + result = result & ~(NIS_MODIFY_ACC << 16); + if (g) + result = result & ~(NIS_MODIFY_ACC << 8); + if (w) + result = result & ~(NIS_MODIFY_ACC); + break; + case 'c': + if (n) + result = result & ~(NIS_CREATE_ACC << 24); + if (o) + result = result & ~(NIS_CREATE_ACC << 16); + if (g) + result = result & ~(NIS_CREATE_ACC << 8); + if (w) + result = result & ~(NIS_CREATE_ACC); + break; + case 'd': + if (n) + result = result & ~(NIS_DESTROY_ACC << 24); + if (o) + result = result & ~(NIS_DESTROY_ACC << 16); + if (g) + result = result & ~(NIS_DESTROY_ACC << 8); + if (w) + result = result & ~(NIS_DESTROY_ACC); + break; + default: + fprintf (stderr, "Parse error in \"%s\"\n", buf); + return 0; + } + cptr++; + } + break; + case '+': + cptr++; /* Remove "=" from beginning */ + while (*cptr != '\0' && *cptr != ',') + { + switch (*cptr) + { + case 'r': + if (n) + result = result | (NIS_READ_ACC << 24); + if (o) + result = result | (NIS_READ_ACC << 16); + if (g) + result = result | (NIS_READ_ACC << 8); + if (w) + result = result | (NIS_READ_ACC); + break; + case 'm': + if (n) + result = result | (NIS_MODIFY_ACC << 24); + if (o) + result = result | (NIS_MODIFY_ACC << 16); + if (g) + result = result | (NIS_MODIFY_ACC << 8); + if (w) + result = result | (NIS_MODIFY_ACC); + break; + case 'c': + if (n) + result = result | (NIS_CREATE_ACC << 24); + if (o) + result = result | (NIS_CREATE_ACC << 16); + if (g) + result = result | (NIS_CREATE_ACC << 8); + if (w) + result = result | (NIS_CREATE_ACC); + break; + case 'd': + if (n) + result = result | (NIS_DESTROY_ACC << 24); + if (o) + result = result | (NIS_DESTROY_ACC << 16); + if (g) + result = result | (NIS_DESTROY_ACC << 8); + if (w) + result = result | (NIS_DESTROY_ACC); + break; + default: + fprintf (stderr, "Parse error in \"%s\"\n", buf); + return 0; + } + cptr++; + } + break; + case '=': + cptr++; /* Remove "=" from beginning */ + /* Clear */ + if (n) + result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC + + NIS_CREATE_ACC + NIS_DESTROY_ACC) << 24); + + if (o) + result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC + + NIS_CREATE_ACC + NIS_DESTROY_ACC) << 16); + if (g) + result = result & ~((NIS_READ_ACC + NIS_MODIFY_ACC + + NIS_CREATE_ACC + NIS_DESTROY_ACC) << 8); + if (w) + result = result & ~(NIS_READ_ACC + NIS_MODIFY_ACC + + NIS_CREATE_ACC + NIS_DESTROY_ACC); + while (*cptr != '\0' && *cptr != ',') + { + switch (*cptr) + { + case 'r': + if (n) + result = result | (NIS_READ_ACC << 24); + if (o) + result = result | (NIS_READ_ACC << 16); + if (g) + result = result | (NIS_READ_ACC << 8); + if (w) + result = result | (NIS_READ_ACC); + break; + case 'm': + if (n) + result = result | (NIS_MODIFY_ACC << 24); + if (o) + result = result | (NIS_MODIFY_ACC << 16); + if (g) + result = result | (NIS_MODIFY_ACC << 8); + if (w) + result = result | (NIS_MODIFY_ACC); + break; + case 'c': + if (n) + result = result | (NIS_CREATE_ACC << 24); + if (o) + result = result | (NIS_CREATE_ACC << 16); + if (g) + result = result | (NIS_CREATE_ACC << 8); + if (w) + result = result | (NIS_CREATE_ACC); + break; + case 'd': + if (n) + result = result | (NIS_DESTROY_ACC << 24); + if (o) + result = result | (NIS_DESTROY_ACC << 16); + if (g) + result = result | (NIS_DESTROY_ACC << 8); + if (w) + result = result | (NIS_DESTROY_ACC); + break; + default: + fprintf (stderr, "Parse error in \"%s\"\n", buf); + return 0; + } + cptr++; + } + break; + default: + fprintf (stderr, "Parse error in \"%s\"\n", buf); + return 0; + } + cptr++; + } + + return 0; +} + +nis_name +__nis_default_owner (char *defaults) +{ + static char default_owner[NIS_MAXNAMELEN]; + char *cptr, *dptr; + + strcpy (default_owner, nis_local_principal ()); + + if (defaults != NULL) + { + dptr = strstr (defaults, "owner="); + if (dptr != NULL) + strcpy (default_owner, searchowner (defaults)); + } + else + { + cptr = getenv ("NIS_DEFAULTS"); + if (cptr != NULL) + { + dptr = strstr (cptr, "owner="); + if (dptr != NULL) + strcpy (default_owner, searchowner (cptr)); + } + } + + return default_owner; +} + +nis_name +__nis_default_group (char *defaults) +{ + static char default_group[NIS_MAXNAMELEN]; + char *cptr, *dptr; + + strcpy (default_group, nis_local_group ()); + + if (defaults != NULL) + { + dptr = strstr (defaults, "group="); + if (dptr != NULL) + strcpy (default_group, searchgroup (defaults)); + } + else + { + cptr = getenv ("NIS_DEFAULTS"); + if (cptr != NULL) + { + dptr = strstr (cptr, "group="); + if (dptr != NULL) + strcpy (default_group, searchgroup (cptr)); + } + } + + return default_group; +} + +u_long +__nis_default_ttl (char *defaults) +{ + char *cptr, *dptr; + + if (defaults != NULL) + { + dptr = strstr (defaults, "ttl="); + if (dptr != NULL) + return searchttl (defaults); + } + + cptr = getenv ("NIS_DEFAULTS"); + if (cptr == NULL) + return DEFAULT_TTL; + + dptr = strstr (cptr, "ttl="); + if (dptr == NULL) + return DEFAULT_TTL; + + return searchttl (cptr); +} + +/* Default access rights are ----rmcdr---r---, but we could change + this with the NIS_DEFAULTS variable. */ +u_long +__nis_default_access (char *param, u_long defaults) +{ + u_long result; + char *cptr; + + if (defaults == 0) + result = 0 | OWNER_DEFAULT | GROUP_DEFAULT | WORLD_DEFAULT; + else + result = defaults; + + if (param != NULL && strstr (param, "access=") != NULL) + result = searchaccess (param, result); + else + { + cptr = getenv ("NIS_DEFAULTS"); + if (cptr != NULL && strstr (cptr, "access=") != NULL) + result = searchaccess (getenv ("NIS_DEFAULTS"), result); + } + + return result; +} |