Project

General

Profile

Bug #73 » zone_get_zoneids.patch

Igor Pashev, 2012-11-22 04:13 PM

View differences:

usr/src/head/zone.h
63 63
extern int	zone_setattr(zoneid_t, int, void *, size_t);
64 64
extern int	zone_enter(zoneid_t);
65 65
extern int	zone_list(zoneid_t *, uint_t *);
66
extern int	zone_get_zoneids(zoneid_t **, uint_t *);
66 67
extern int	zone_shutdown(zoneid_t);
67 68
extern int	zone_version(int *);
68 69
extern int	zone_add_datalink(zoneid_t, datalink_id_t);
usr/src/lib/libc/port/mapfile-vers
2912 2912
	zone_enter;
2913 2913
	zone_getattr;
2914 2914
	zone_get_id;
2915
	zone_get_zoneids;
2915 2916
	zone_list;
2916 2917
	zone_list_datalink;
2917 2918
	zonept;
usr/src/lib/libc/port/sys/zone.c
185 185
	return (syscall(SYS_zone, ZONE_LIST, zonelist, numzones));
186 186
}
187 187

  
188
int
189
zone_get_zoneids(zoneid_t **zonelist, uint_t *numzones)
190
	zoneid_t        *zids = NULL;
191
	uint_t          nzids, nzids_saved;
192

  
193
	if (zone_list(NULL, &nzids) != 0)
194
		return (errno);
195
again:
196
	nzids *= 2;
197
	if ((zids = malloc(nzids * sizeof (zoneid_t))) == NULL)
198
		return (errno);
199
	nzids_saved = nzids;
200
	if (zone_list(zids, &nzids) != 0) {
201
		free(zids);
202
		return (errno);
203
	}
204
	if (nzids > nzids_saved) {
205
		free(zids);
206
		goto again;
207
	}
208
	if(numzones)
209
		*numzones = nzids;
210
	if(zonelist)
211
		*zonelist = zids;
212
	else
213
		free(zids);
214

  
215
	return 0;
216
}
217

  
188 218
/*
189 219
 * Underlying implementation for getzoneid and getzoneidbyname.
190 220
 */
(1-1/2)