(linenum→info "unix/slp.c:2238")

glibc/2.7/nis/nis_local_names.c

    1: /* Copyright (c) 1997, 1998, 2004, 2006 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3:    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <errno.h>
   21: #include <string.h>
   22: #include <unistd.h>
   23: #include <libintl.h>
   24: #include <rpcsvc/nis.h>
   25: 
   26: nis_name
   27: nis_local_group (void)
   28: {
   29:   static char __nisgroup[NIS_MAXNAMELEN + 1];
   30: 
   31:   char *cptr;
   32:   if (__nisgroup[0] == '\0'
   33:       && (cptr = getenv ("NIS_GROUP")) != NULL
   34:       && strlen (cptr) < NIS_MAXNAMELEN)
   35:     {
   36:       char *cp = stpcpy (__nisgroup, cptr);
   37: 
   38:       if (cp[-1] != '.')
   39:         {
   40:           cptr = nis_local_directory ();
   41:           if ((cp - __nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
   42:             {
   43:               *cp++ = '.';
   44:               strcpy (cp, cptr);
   45:             }
   46:           else
   47:             __nisgroup[0] = '\0';
   48:         }
   49:     }
   50: 
   51:   return __nisgroup;
   52: }
   53: libnsl_hidden_def (nis_local_group)
   54: 
   55: nis_name
   56: nis_local_directory (void)
   57: {
   58:   static char __nisdomainname[NIS_MAXNAMELEN + 1];
   59: 
   60:   if (__nisdomainname[0] == '\0')
   61:     {
   62:       if (getdomainname (__nisdomainname, NIS_MAXNAMELEN) < 0)
   63:         __nisdomainname[0] = '\0';
   64:       else
   65:         {
   66:           char *cp = rawmemchr (__nisdomainname, '\0');
   67: 
   68:           /* Missing trailing dot? */
   69:           if (cp[-1] != '.')
   70:             {
   71:               *cp++ = '.';
   72:               *cp = '\0';
   73:             }
   74:         }
   75:     }
   76: 
   77:   return __nisdomainname;
   78: }
   79: libnsl_hidden_def (nis_local_directory)
   80: 
   81: nis_name
   82: nis_local_principal (void)
   83: {
   84:   static char __principal[NIS_MAXNAMELEN + 1];
   85: 
   86:   if (__principal[0] == '\0')
   87:     {
   88:       char buf[NIS_MAXNAMELEN + 1];
   89:       nis_result *res;
   90:       uid_t uid = geteuid ();
   91: 
   92:       if (uid != 0)
   93:         {
   94:           int len = snprintf (buf, NIS_MAXNAMELEN - 1,
   95:                               "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
   96:                               uid, nis_local_directory ());
   97: 
   98:           if (len >= NIS_MAXNAMELEN - 1)
   99:             nobody:
  100:             /* XXX The buffer is too small.  Can this happen???  */
  101:             return strcpy (__principal, "nobody");
  102: 
  103:           if (buf[len - 1] != '.')
  104:             {
  105:               buf[len++] = '.';
  106:               buf[len] = '\0';
  107:             }
  108: 
  109:           res = nis_list (buf, USE_DGRAM + NO_AUTHINFO + FOLLOW_LINKS +
  110:                           FOLLOW_PATH, NULL, NULL);
  111: 
  112:           if (res == NULL)
  113:             goto nobody;
  114: 
  115:           if (NIS_RES_STATUS (res) == NIS_SUCCESS)
  116:             {
  117:               if (res->objects.objects_len > 1)
  118:                 {
  119:                   /* More than one principal with same uid?  something
  120:                      wrong with cred table.  Should be unique.  Warn user
  121:                      and continue.  */
  122:                   printf (_("\
  123: LOCAL entry for UID %d in directory %s not unique\n"),
  124:                           uid, nis_local_directory ());
  125:                 }
  126:               strcpy (__principal, ENTRY_VAL (res->objects.objects_val, 0));
  127:               nis_freeresult (res);
  128:               return __principal;
  129:             }
  130:           else
  131:             {
  132:               nis_freeresult (res);
  133:               goto nobody;
  134:             }
  135:         }
  136:       else
  137:         return strcpy (__principal, nis_local_host ());
  138: 
  139:       /* Should be never reached */
  140:       goto nobody;
  141:     }
  142:   return __principal;
  143: }
  144: libnsl_hidden_def (nis_local_principal)
  145: 
  146: nis_name
  147: nis_local_host (void)
  148: {
  149:   static char __nishostname[NIS_MAXNAMELEN + 1];
  150: 
  151:   if (__nishostname[0] == '\0')
  152:     {
  153:       if (gethostname (__nishostname, NIS_MAXNAMELEN) < 0)
  154:         __nishostname[0] = '\0';
  155:       else
  156:         {
  157:           char *cp = rawmemchr (__nishostname, '\0');
  158:           int len = cp - __nishostname;
  159: 
  160:           /* Hostname already fully qualified? */
  161:           if (cp[-1] == '.')
  162:             return __nishostname;
  163: 
  164:           if (len + strlen (nis_local_directory ()) + 1 > NIS_MAXNAMELEN)
  165:             {
  166:               __nishostname[0] = '\0';
  167:               return __nishostname;
  168:             }
  169: 
  170:           *cp++ = '.';
  171:           strncpy (cp, nis_local_directory (), NIS_MAXNAMELEN - len -1);
  172:           __nishostname[NIS_MAXNAMELEN] = '\0';
  173:         }
  174:     }
  175: 
  176:   return __nishostname;
  177: }
  178: libnsl_hidden_def (nis_local_host)
Syntax (Markdown)