(root)/
glibc-2.38/
nis/
nis_clone_dir.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 <string.h>
      19  #include <rpc/rpc.h>
      20  #include <rpcsvc/nis.h>
      21  #include <shlib-compat.h>
      22  
      23  #include "nis_xdr.h"
      24  
      25  directory_obj *
      26  nis_clone_directory (const directory_obj *src, directory_obj *dest)
      27  {
      28    char *addr;
      29    unsigned int size;
      30    XDR xdrs;
      31  
      32    if (src == NULL)
      33      return NULL;
      34  
      35    size = xdr_sizeof ((xdrproc_t)_xdr_directory_obj, (char *)src);
      36    if ((addr = calloc(1, size)) == NULL)
      37      return NULL;
      38  
      39    xdrmem_create(&xdrs, addr, size, XDR_ENCODE);
      40    if (!_xdr_directory_obj (&xdrs, (directory_obj *)src))
      41      {
      42        xdr_destroy (&xdrs);
      43        free (addr);
      44        return NULL;
      45      }
      46    xdr_destroy (&xdrs);
      47  
      48    directory_obj *res;
      49    if (dest == NULL)
      50      {
      51        if ((res = calloc (1, sizeof (directory_obj))) == NULL)
      52  	{
      53  	  free (addr);
      54  	  return NULL;
      55  	}
      56      }
      57    else
      58      res = dest;
      59  
      60    xdrmem_create (&xdrs, addr, size, XDR_DECODE);
      61    if (!_xdr_directory_obj (&xdrs, res))
      62      {
      63        xdr_destroy (&xdrs);
      64        if (res != dest)
      65  	free (res);
      66        free (addr);
      67        return NULL;
      68      }
      69    xdr_destroy (&xdrs);
      70    free (addr);
      71  
      72    return res;
      73  }
      74  libnsl_hidden_nolink_def(nis_clone_directory, GLIBC_2_1)