(root)/
glibc-2.38/
nis/
nis_creategroup.c
       1  /* Copyright (c) 1997-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <time.h>
      19  #include <string.h>
      20  #include <rpcsvc/nis.h>
      21  #include <shlib-compat.h>
      22  
      23  nis_error
      24  nis_creategroup (const_nis_name group, unsigned int flags)
      25  {
      26    if (group != NULL && group[0] != '\0')
      27      {
      28        size_t grouplen = strlen (group);
      29        char buf[grouplen + 50];
      30        char leafbuf[grouplen + 2];
      31        char domainbuf[grouplen + 2];
      32        nis_error status;
      33        nis_result *res;
      34        char *cp, *cp2;
      35        nis_object *obj;
      36  
      37        cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
      38        cp = stpcpy (cp, ".groups_dir");
      39        cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
      40        if (cp2 != NULL && cp2[0] != '\0')
      41          {
      42  	  *cp++ = '.';
      43            stpcpy (cp, cp2);
      44          }
      45        else
      46  	return NIS_BADNAME;
      47  
      48        obj = calloc (1, sizeof (nis_object));
      49        if (__glibc_unlikely (obj == NULL))
      50  	return NIS_NOMEMORY;
      51  
      52        obj->zo_oid.ctime = obj->zo_oid.mtime = time (NULL);
      53        obj->zo_name = strdup (leafbuf);
      54        obj->zo_owner = __nis_default_owner (NULL);
      55        obj->zo_group = __nis_default_group (NULL);
      56        obj->zo_domain = strdup (domainbuf);
      57        if (obj->zo_name == NULL || obj->zo_owner == NULL
      58  	  || obj->zo_group == NULL || obj->zo_domain == NULL)
      59  	{
      60  	  free (obj->zo_group);
      61  	  free (obj->zo_owner);
      62  	  free (obj->zo_name);
      63  	  free (obj);
      64  	  return NIS_NOMEMORY;
      65  	}
      66        obj->zo_access = __nis_default_access (NULL, 0);
      67        obj->zo_ttl = 60 * 60;
      68        obj->zo_data.zo_type = NIS_GROUP_OBJ;
      69        obj->zo_data.objdata_u.gr_data.gr_flags = flags;
      70        obj->zo_data.objdata_u.gr_data.gr_members.gr_members_len = 0;
      71        obj->zo_data.objdata_u.gr_data.gr_members.gr_members_val = NULL;
      72  
      73        res = nis_add (buf, obj);
      74        nis_free_object (obj);
      75        if (res == NULL)
      76  	return NIS_NOMEMORY;
      77        status = NIS_RES_STATUS (res);
      78        nis_freeresult (res);
      79  
      80        return status;
      81      }
      82    return NIS_FAIL;
      83  }
      84  libnsl_hidden_nolink_def (nis_creategroup, GLIBC_2_1)