| /* 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) ""; |
| |
| return strncpy (default_group, cptr, i); |
| } |
| |
| 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)""; |
| |
| return strncpy (default_owner, cptr, i); |
| } |
| |
| 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; |
| } |