]>
git.saurik.com Git - apple/libinfo.git/blob - netinfo.subproj/ni_util.c
4e855b5f7ccb0d1c206cea33515305c551b6872b
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
26 * Utility routines for netinfo data structures
27 * Copyright (C) 1989 by NeXT, Inc.
29 #include <netinfo/ni.h>
45 MM_GROW_ARRAY(cl
->niil_val
, cl
->niil_len
);
46 for (i
= cl
->niil_len
; i
> where
; i
--) {
47 cl
->niil_val
[i
] = cl
->niil_val
[i
- 1];
62 for (i
= 0; i
< idlist
->niil_len
; i
++) {
63 if (idlist
->niil_val
[i
] == id
) {
64 for (j
= i
+ 1; j
< idlist
->niil_len
; j
++) {
65 idlist
->niil_val
[j
- 1] = idlist
->niil_val
[j
];
67 MM_SHRINK_ARRAY(idlist
->niil_val
, idlist
->niil_len
--);
80 if (idlist
->niil_val
!= NULL
) {
81 MM_FREE_ARRAY(idlist
->niil_val
, idlist
->niil_len
);
88 const ni_idlist idlist
94 newlist
.niil_len
= idlist
.niil_len
;
95 MM_ALLOC_ARRAY(newlist
.niil_val
, idlist
.niil_len
);
96 for (i
= 0; i
< idlist
.niil_len
; i
++) {
97 newlist
.niil_val
[i
] = idlist
.niil_val
[i
];
105 const ni_property prop
,
111 MM_GROW_ARRAY(pl
->nipl_val
, pl
->nipl_len
);
112 for (i
= pl
->nipl_len
; i
> where
; i
--) {
113 pl
->nipl_val
[i
] = pl
->nipl_val
[i
- 1];
115 pl
->nipl_val
[i
] = ni_prop_dup(prop
);
127 ni_prop_free(&pl
->nipl_val
[which
]);
128 for (i
= which
+ 1; i
< pl
->nipl_len
; i
++) {
129 pl
->nipl_val
[i
- 1] = pl
->nipl_val
[i
];
131 MM_SHRINK_ARRAY(pl
->nipl_val
, pl
->nipl_len
--);
141 if (pl
->nipl_val
== NULL
) {
144 for (i
= 0; i
< pl
->nipl_len
; i
++) {
145 ni_prop_free(&pl
->nipl_val
[i
]);
147 MM_FREE_ARRAY(pl
->nipl_val
, pl
->nipl_len
);
152 ni_proplist_list_free(
153 ni_proplist_list
*pll
158 if (pll
->nipll_val
== NULL
) {
161 for (i
= 0; i
< pll
->nipll_len
; i
++) {
162 ni_proplist_free(&pll
->nipll_val
[i
]);
164 MM_FREE_ARRAY(pll
->nipll_val
, pll
->nipll_len
);
176 newlist
.nipl_len
= pl
.nipl_len
;
177 MM_ALLOC_ARRAY(newlist
.nipl_val
, pl
.nipl_len
);
178 for (i
= 0; i
< pl
.nipl_len
; i
++) {
179 newlist
.nipl_val
[i
].nip_name
= ni_name_dup(pl
.nipl_val
[i
].nip_name
);
180 newlist
.nipl_val
[i
].nip_val
= ni_namelist_dup(pl
.nipl_val
[i
].nip_val
);
187 const ni_proplist pl
,
196 for (i
= 0; i
< pl
.nipl_len
; i
++) {
197 if (ni_name_match(pname
, pl
.nipl_val
[i
].nip_name
)) {
201 nl
= pl
.nipl_val
[i
].nip_val
;
202 for (j
= 0; j
< nl
.ninl_len
; j
++) {
203 if (ni_name_match(pval
, nl
.ninl_val
[j
])) {
210 return (NI_INDEX_NULL
);
216 const ni_property prop
221 newprop
.nip_name
= ni_name_dup(prop
.nip_name
);
222 newprop
.nip_val
= ni_namelist_dup(prop
.nip_val
);
231 ni_name_free(&prop
->nip_name
);
232 ni_namelist_free(&prop
->nip_val
);
241 return (strcmp(nm1
, nm2
) == 0);
249 return (strcpy(malloc(strlen(nm
) + 1), nm
));
272 newlist
.ninl_len
= nl
.ninl_len
;
273 MM_ALLOC_ARRAY(newlist
.ninl_val
, newlist
.ninl_len
);
274 for (i
= 0; i
< nl
.ninl_len
; i
++) {
275 newlist
.ninl_val
[i
] = ni_name_dup(nl
.ninl_val
[i
]);
287 if (nl
->ninl_val
== NULL
) {
290 for (i
= 0; i
< nl
->ninl_len
; i
++) {
291 ni_name_free(&nl
->ninl_val
[i
]);
293 MM_FREE_ARRAY(nl
->ninl_val
, nl
->ninl_len
);
306 MM_GROW_ARRAY(nl
->ninl_val
, nl
->ninl_len
);
307 for (i
= nl
->ninl_len
; i
> where
; i
--) {
308 nl
->ninl_val
[i
] = nl
->ninl_val
[i
- 1];
310 nl
->ninl_val
[i
] = ni_name_dup(nm
);
322 ni_name_free(&nl
->ninl_val
[which
]);
323 for (i
= which
+ 1; i
< nl
-> ninl_len
; i
++) {
324 nl
->ninl_val
[i
- 1] = nl
->ninl_val
[i
];
326 MM_SHRINK_ARRAY(nl
->ninl_val
, nl
->ninl_len
--);
331 const ni_namelist nl
,
337 for (i
= 0; i
< nl
.ninl_len
; i
++) {
338 if (ni_name_match(nl
.ninl_val
[i
], nm
)) {
342 return (NI_INDEX_NULL
);
353 MM_GROW_ARRAY(el
->niel_val
, el
->niel_len
);
355 if (en
.names
!= NULL
) {
356 MM_ALLOC(entry
.names
);
357 *entry
.names
= ni_namelist_dup(*en
.names
);
361 el
->niel_val
[el
->niel_len
++] = entry
;
372 if (el
->niel_val
[which
].names
!= NULL
) {
373 ni_namelist_free(el
->niel_val
[which
].names
);
375 for (i
= which
+ 1; i
< el
-> niel_len
; i
++) {
376 el
->niel_val
[i
- 1] = el
->niel_val
[i
];
378 MM_SHRINK_ARRAY(el
->niel_val
, el
->niel_len
--);
388 if (el
->niel_val
== NULL
) {
391 for (i
= 0; i
< el
->niel_len
; i
++) {
392 if (el
->niel_val
[i
].names
!= NULL
) {
393 ni_namelist_free(el
->niel_val
[i
].names
);
394 MM_FREE(el
->niel_val
[i
].names
);
397 MM_FREE_ARRAY(el
->niel_val
, el
->niel_len
);
404 * We can do this without an addition to the protocol
419 status
= ni_listprops(ni
, id
, &list
);
420 if (status
!= NI_OK
) {
423 which
= ni_namelist_match(list
, pname
);
424 ni_namelist_free(&list
);
425 if (which
== NI_INDEX_NULL
) {
428 return (ni_readprop(ni
, id
, which
, nl
));
432 * Search from local domain to root domain to locate a path.
435 ni_find(void **dom
, ni_id
*nid
, ni_name dirname
, unsigned int timeout
)
440 struct sockaddr_in addr
;
443 nid
->nii_object
= NI_INDEX_NULL
;
444 nid
->nii_instance
= NI_INDEX_NULL
;
446 memset(&addr
, 0, sizeof(struct sockaddr_in
));
447 addr
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
449 d
= ni_connect(&addr
, "local");
450 if (d
== NULL
) return NI_FAILED
;
456 ni_setreadtimeout(d
, timeout
);
460 status
= ni_pathsearch(d
, &n
, dirname
);
468 status
= ni_open(d
, "..", &p
);
471 if (status
== NI_OK
) d
= p
;
478 ni_search(void *handle
, ni_id
*dir
, ni_name name
, ni_name expr
, int flags
, ni_entrylist
*entries
)
486 /* compile the regular expression */
487 cexp
= (regex_t
*)malloc(sizeof(regex_t
));
488 memset(cexp
, 0, sizeof(regex_t
));
489 i
= regcomp(cexp
, expr
, flags
);
496 /* get subdirectory list */
498 status
= ni_list(handle
, dir
, name
, &el
);
506 for (i
= 0; i
< el
.ni_entrylist_len
; i
++)
508 if (el
.ni_entrylist_val
[i
].names
== NULL
) continue;
510 nl
= el
.ni_entrylist_val
[i
].names
;
513 for (j
= 0; j
< nl
->ni_namelist_len
; j
++)
515 if (regexec(cexp
, nl
->ni_namelist_val
[j
], 0, NULL
, 0) != 0) continue;
520 if (found
== 0) continue;
522 if (entries
->ni_entrylist_len
== 0)
524 entries
->ni_entrylist_val
= malloc(sizeof(ni_entry
));
528 entries
->ni_entrylist_val
= (ni_entry
*)realloc(entries
->ni_entrylist_val
, (entries
->ni_entrylist_len
+ 1) * sizeof(ni_entry
));
531 entries
->ni_entrylist_val
[entries
->ni_entrylist_len
].id
= el
.ni_entrylist_val
[i
].id
;
532 entries
->ni_entrylist_val
[entries
->ni_entrylist_len
].names
= el
.ni_entrylist_val
[i
].names
;
533 el
.ni_entrylist_val
[i
].names
= NULL
;
534 entries
->ni_entrylist_len
++;
537 ni_entrylist_free(&el
);