(root)/
glibc-2.38/
nis/
nis_clone_obj.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  nis_object *
      26  nis_clone_object (const nis_object *src, nis_object *dest)
      27  {
      28    char *addr;
      29    unsigned int size;
      30    XDR xdrs;
      31    nis_object *res = NULL;
      32  
      33    if (src == NULL)
      34      return (NULL);
      35  
      36    size = xdr_sizeof ((xdrproc_t)_xdr_nis_object, (char *) src);
      37    if ((addr = calloc (1, size)) == NULL)
      38      return NULL;
      39  
      40    if (dest == NULL)
      41      {
      42        if ((res = calloc (1, sizeof (nis_object))) == NULL)
      43  	goto out;
      44      }
      45    else
      46      res = dest;
      47  
      48    xdrmem_create (&xdrs, addr, size, XDR_ENCODE);
      49    if (!_xdr_nis_object (&xdrs, (nis_object *) src))
      50      goto out2;
      51    xdr_destroy (&xdrs);
      52    xdrmem_create (&xdrs, addr, size, XDR_DECODE);
      53    if (!_xdr_nis_object (&xdrs, res))
      54      {
      55      out2:
      56        if (dest == NULL)
      57  	free (res);
      58        res = NULL;
      59      }
      60  
      61    xdr_destroy (&xdrs);
      62   out:
      63    free (addr);
      64  
      65    return res;
      66  }
      67  libnsl_hidden_nolink_def (nis_clone_object, GLIBC_2_1)