1 /* Copyright (c) 1997 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.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
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 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
21 #include <rpcsvc/nis.h>
22 #include <rpcsvc/nislib.h>
25 nis_clone_directory (const directory_obj
*src
, directory_obj
*dest
)
34 res
= calloc (1, sizeof (directory_obj
));
42 res
->do_name
= strdup (src
->do_name
);
45 res
->do_type
= src
->do_type
;
46 if (src
->do_servers
.do_servers_len
> 0)
50 res
->do_servers
.do_servers_len
= src
->do_servers
.do_servers_len
;
51 if ((res
->do_servers
.do_servers_val
=
52 malloc (src
->do_servers
.do_servers_len
* sizeof (nis_server
)))
56 for (i
= 0; i
< src
->do_servers
.do_servers_len
; ++i
)
58 if (src
->do_servers
.do_servers_val
[i
].name
!= NULL
)
59 res
->do_servers
.do_servers_val
[i
].name
=
60 strdup (src
->do_servers
.do_servers_val
[i
].name
);
62 res
->do_servers
.do_servers_val
[i
].name
= NULL
;
64 res
->do_servers
.do_servers_val
[i
].ep
.ep_len
=
65 src
->do_servers
.do_servers_val
[i
].ep
.ep_len
;
66 if (res
->do_servers
.do_servers_val
[i
].ep
.ep_len
> 0)
70 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
=
71 malloc (src
->do_servers
.do_servers_val
[i
].ep
.ep_len
*
73 for (j
= 0; j
< res
->do_servers
.do_servers_val
[i
].ep
.ep_len
; ++j
)
75 if (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].uaddr
)
76 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].uaddr
77 = strdup (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].uaddr
);
79 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].uaddr
= NULL
;
81 if (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].family
)
82 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].family
83 = strdup (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].family
);
85 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].family
= NULL
;
87 if (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].proto
)
88 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].proto
89 = strdup (src
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].proto
);
91 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
[j
].proto
= NULL
;
96 res
->do_servers
.do_servers_val
[i
].ep
.ep_val
= NULL
;
98 res
->do_servers
.do_servers_val
[i
].key_type
=
99 src
->do_servers
.do_servers_val
[i
].key_type
;
100 res
->do_servers
.do_servers_val
[i
].pkey
.n_len
=
101 src
->do_servers
.do_servers_val
[i
].pkey
.n_len
;
102 if (res
->do_servers
.do_servers_val
[i
].pkey
.n_len
> 0)
104 res
->do_servers
.do_servers_val
[i
].pkey
.n_bytes
=
105 malloc (src
->do_servers
.do_servers_val
[i
].pkey
.n_len
);
106 if (res
->do_servers
.do_servers_val
[i
].pkey
.n_bytes
== NULL
)
108 memcpy (res
->do_servers
.do_servers_val
[i
].pkey
.n_bytes
,
109 src
->do_servers
.do_servers_val
[i
].pkey
.n_bytes
,
110 src
->do_servers
.do_servers_val
[i
].pkey
.n_len
);
113 res
->do_servers
.do_servers_val
[i
].pkey
.n_bytes
= NULL
;
118 res
->do_servers
.do_servers_len
= 0;
119 res
->do_servers
.do_servers_val
= NULL
;
121 res
->do_ttl
= src
->do_ttl
;
122 res
->do_armask
.do_armask_len
= src
->do_armask
.do_armask_len
;
123 if (res
->do_armask
.do_armask_len
> 0)
125 if ((res
->do_armask
.do_armask_val
=
126 malloc (src
->do_armask
.do_armask_len
* sizeof (oar_mask
))) == NULL
)
128 memcpy (res
->do_armask
.do_armask_val
, src
->do_armask
.do_armask_val
,
129 src
->do_armask
.do_armask_len
* sizeof (oar_mask
));
133 res
->do_armask
.do_armask_val
= NULL
;
140 nis_clone_group (const group_obj
*src
, group_obj
*dest
)
143 group_obj
*res
= NULL
;
150 res
= calloc (1, sizeof (group_obj
));
157 res
->gr_flags
= src
->gr_flags
;
159 res
->gr_members
.gr_members_len
= src
->gr_members
.gr_members_len
;
160 if (res
->gr_members
.gr_members_len
> 0)
162 if (res
->gr_members
.gr_members_val
== NULL
)
164 if ((res
->gr_members
.gr_members_val
=
165 malloc (res
->gr_members
.gr_members_len
* sizeof (nis_name
))) == NULL
)
168 for (i
= 0; i
< res
->gr_members
.gr_members_len
; ++i
)
169 if (src
->gr_members
.gr_members_val
[i
] != NULL
)
170 res
->gr_members
.gr_members_val
[i
] =
171 strdup (src
->gr_members
.gr_members_val
[i
]);
173 res
->gr_members
.gr_members_val
[i
] = NULL
;
180 nis_clone_table (const table_obj
*src
, table_obj
*dest
)
183 table_obj
*res
= NULL
;
190 res
= calloc (1, sizeof (table_obj
));
197 if (src
->ta_type
!= NULL
)
199 if ((res
->ta_type
= strdup (src
->ta_type
)) == NULL
)
205 res
->ta_maxcol
= src
->ta_maxcol
;
206 res
->ta_sep
= src
->ta_sep
;
207 res
->ta_cols
.ta_cols_len
= src
->ta_cols
.ta_cols_len
;
208 if (res
->ta_cols
.ta_cols_val
== NULL
)
210 if ((res
->ta_cols
.ta_cols_val
=
211 calloc (1, src
->ta_cols
.ta_cols_len
* sizeof (table_col
))) == NULL
)
214 for (i
= 0; i
< res
->ta_cols
.ta_cols_len
; i
++)
216 if (src
->ta_cols
.ta_cols_val
[i
].tc_name
== NULL
)
217 res
->ta_cols
.ta_cols_val
[i
].tc_name
= NULL
;
219 res
->ta_cols
.ta_cols_val
[i
].tc_name
=
220 strdup (src
->ta_cols
.ta_cols_val
[i
].tc_name
);
221 res
->ta_cols
.ta_cols_val
[i
].tc_flags
=
222 src
->ta_cols
.ta_cols_val
[i
].tc_flags
;
223 res
->ta_cols
.ta_cols_val
[i
].tc_rights
=
224 src
->ta_cols
.ta_cols_val
[i
].tc_rights
;
227 if (src
->ta_path
!= NULL
)
229 if ((res
->ta_path
= strdup (src
->ta_path
)) == NULL
)
239 nis_clone_entry (const entry_obj
*src
, entry_obj
*dest
)
242 entry_obj
*res
= NULL
;
249 res
= calloc (1, sizeof (entry_obj
));
257 res
->en_type
= strdup (src
->en_type
);
261 res
->en_cols
.en_cols_len
= src
->en_cols
.en_cols_len
;
262 if (res
->en_cols
.en_cols_val
== NULL
&& src
->en_cols
.en_cols_len
> 0)
264 res
->en_cols
.en_cols_val
=
265 calloc (1, src
->en_cols
.en_cols_len
* sizeof (entry_col
));
266 if (res
->en_cols
.en_cols_val
== NULL
)
269 for (i
= 0; i
< res
->en_cols
.en_cols_len
; ++i
)
271 res
->en_cols
.en_cols_val
[i
].ec_flags
=
272 src
->en_cols
.en_cols_val
[i
].ec_flags
;
273 res
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_len
=
274 src
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_len
;
275 if (res
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_val
== NULL
&&
276 src
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_len
> 0)
277 res
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_val
=
278 malloc (src
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_len
);
279 memcpy (res
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_val
,
280 src
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_val
,
281 res
->en_cols
.en_cols_val
[i
].ec_value
.ec_value_len
);
288 nis_clone_nis_attr (const nis_attr
*src
, nis_attr
*dest
)
290 nis_attr
*res
= NULL
;
297 res
= calloc (1, sizeof (nis_attr
));
304 if (src
->zattr_ndx
!= NULL
)
306 if ((res
->zattr_ndx
= strdup (src
->zattr_ndx
)) == NULL
)
310 res
->zattr_ndx
= NULL
;
312 res
->zattr_val
.zattr_val_len
= src
->zattr_val
.zattr_val_len
;
313 if (res
->zattr_val
.zattr_val_len
> 0)
315 if (res
->zattr_val
.zattr_val_val
== NULL
)
317 if ((res
->zattr_val
.zattr_val_val
=
318 calloc (1, src
->zattr_val
.zattr_val_len
)) == NULL
)
321 memcpy (res
->zattr_val
.zattr_val_val
, src
->zattr_val
.zattr_val_val
,
322 src
->zattr_val
.zattr_val_len
);
325 res
->zattr_val
.zattr_val_val
= NULL
;
330 __nis_clone_attrs (const nis_attr
*src
, nis_attr
*dest
, u_int len
)
340 res
= calloc (len
, sizeof (nis_attr
));
347 for (i
= 0; i
< len
; i
++)
348 nis_clone_nis_attr(&src
[i
], &res
[i
]);
354 nis_clone_link (const link_obj
*src
, link_obj
*dest
)
356 link_obj
*res
= NULL
;
363 res
= calloc (1, sizeof (link_obj
));
370 res
->li_rtype
= src
->li_rtype
;
372 res
->li_attrs
.li_attrs_len
= src
->li_attrs
.li_attrs_len
;
373 res
->li_attrs
.li_attrs_val
=
374 __nis_clone_attrs (src
->li_attrs
.li_attrs_val
,
375 res
->li_attrs
.li_attrs_val
,
376 src
->li_attrs
.li_attrs_len
);
380 if ((res
->li_name
= strdup (src
->li_name
)) == NULL
)
390 nis_clone_objdata (const objdata
*src
, objdata
*dest
)
399 res
= calloc (1, sizeof (objdata
));
406 res
->zo_type
= src
->zo_type
;
408 switch (src
->zo_type
)
415 if (nis_clone_directory (&src
->objdata_u
.di_data
,
416 &res
->objdata_u
.di_data
) == NULL
)
420 if (nis_clone_group (&src
->objdata_u
.gr_data
,
421 &res
->objdata_u
.gr_data
) == NULL
)
425 if (nis_clone_table (&src
->objdata_u
.ta_data
,
426 &res
->objdata_u
.ta_data
) == NULL
)
430 if (nis_clone_entry (&src
->objdata_u
.en_data
,
431 &res
->objdata_u
.en_data
) == NULL
)
435 if (nis_clone_link (&src
->objdata_u
.li_data
,
436 &res
->objdata_u
.li_data
) == NULL
)
440 res
->objdata_u
.po_data
.po_data_len
=
441 src
->objdata_u
.po_data
.po_data_len
;
442 if (src
->objdata_u
.po_data
.po_data_val
)
444 if ((res
->objdata_u
.po_data
.po_data_val
=
445 malloc (res
->objdata_u
.po_data
.po_data_len
)) == NULL
)
447 memcpy (res
->objdata_u
.po_data
.po_data_val
,
448 src
->objdata_u
.po_data
.po_data_val
,
449 src
->objdata_u
.po_data
.po_data_len
);
453 res
->objdata_u
.po_data
.po_data_val
= NULL
;
454 res
->objdata_u
.po_data
.po_data_len
= 0;
465 nis_clone_object (const nis_object
*src
, nis_object
*dest
)
467 nis_object
*res
= NULL
;
474 res
= calloc (1, sizeof (nis_object
));
481 res
->zo_oid
= src
->zo_oid
;
485 if ((res
->zo_name
= strdup (src
->zo_name
)) == NULL
)
492 if ((res
->zo_owner
= strdup (src
->zo_owner
)) == NULL
)
496 res
->zo_owner
= NULL
;
499 if ((res
->zo_group
= strdup (src
->zo_group
)) == NULL
)
503 res
->zo_group
= NULL
;
506 if ((res
->zo_domain
= strdup (src
->zo_domain
)) == NULL
)
510 res
->zo_domain
= NULL
;
511 res
->zo_access
= src
->zo_access
;
512 res
->zo_ttl
= src
->zo_ttl
;
514 if (nis_clone_objdata (&src
->zo_data
, &res
->zo_data
) == NULL
)
521 __nis_clone_objects (const nis_object
*src
, nis_object
*dest
, u_int len
)
531 res
= calloc (len
, sizeof (nis_object
));
538 for (i
= 0; i
< len
; ++i
)
539 nis_clone_object(&src
[i
], &res
[i
]);
545 nis_clone_result (const nis_result
*src
, nis_result
*dest
)
547 nis_result
*res
= NULL
;
554 res
= calloc (1, sizeof (nis_result
));
561 res
->status
= src
->status
;
562 res
->objects
.objects_len
= src
->objects
.objects_len
;
563 res
->objects
.objects_val
=
564 __nis_clone_objects (src
->objects
.objects_val
,
565 res
->objects
.objects_val
,
566 src
->objects
.objects_len
);
567 res
->zticks
= src
->zticks
;
568 res
->dticks
= src
->dticks
;
569 res
->aticks
= src
->aticks
;
570 res
->cticks
= src
->cticks
;