Print this page
OS-4348 libnsl should seek netconfig file in native root
Reviewed by: Robert Mustacchi <rm@joyent.com>
OS-3812 lxbrand nfs mounting fails

*** 20,29 **** --- 20,30 ---- */ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2015 Joyent, Inc. */ /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */
*** 30,41 **** /* * Portions of this source code were derived from Berkeley 4.3 BSD * under license from the Regents of the University of California. */ - #pragma ident "%Z%%M% %I% %E% SMI" - #include "mt.h" #include "../rpc/rpc_mt.h" /* for MT declarations only */ #include <rpc/types.h> #include <stdio.h> #include <stdlib.h> --- 31,40 ----
*** 43,52 **** --- 42,52 ---- #include <ctype.h> #include <netconfig.h> #include <malloc.h> #include <libintl.h> #include <syslog.h> + #include <zone.h> #include "netcspace.h" #define FAILURE (unsigned)(-1) /*
*** 68,77 **** --- 68,80 ---- static void free_entry(void *); static struct netconfig *netconfig_dup(struct netconfig *); extern const char __nsl_dom[]; + static int (*brand_get_sz)(void) = NULL; + static struct netconfig *(*brand_get_net_ent)(int) = NULL; + /* * Static global variables used by the library procedures: * * netpp - points to the beginning of the list of netconfig * entries used by setnetconfig() and setnetpath().
*** 253,262 **** --- 256,273 ---- freenetconfigent(struct netconfig *netp) { netconfig_free(netp); } + void + _nsl_brand_set_hooks(int (*set_sz_func)(void), + struct netconfig *(*get_ent_func)(int)) + { + brand_get_sz = set_sz_func; + brand_get_net_ent = get_ent_func; + } + /* * getnetlist() reads the netconfig file and creates a * NULL-terminated list of entries. * Returns the pointer to the head of the list or a NULL * on failure.
*** 263,279 **** */ static struct netconfig ** getnetlist(void) { ! char line[BUFSIZ]; /* holds each line of NETCONFIG */ ! FILE *fp; /* file stream for NETCONFIG */ struct netconfig **listpp; /* the beginning of the netconfig list */ struct netconfig **tpp; /* used to traverse the netconfig list */ int count; /* the number of entries in file */ ! if ((fp = fopen(NETCONFIG, "rF")) == NULL) { nc_error = NC_OPENFAIL; return (NULL); } count = 0; --- 274,303 ---- */ static struct netconfig ** getnetlist(void) { ! FILE *fp = NULL; /* file stream for NETCONFIG */ struct netconfig **listpp; /* the beginning of the netconfig list */ struct netconfig **tpp; /* used to traverse the netconfig list */ int count; /* the number of entries in file */ + char nc_path[MAXPATHLEN]; + const char *zroot = zone_get_nroot(); ! /* ! * If we are running in a branded zone, ensure we use the "/native" ! * prefix when opening the netconfig file: ! */ ! (void) snprintf(nc_path, sizeof (nc_path), "%s%s", zroot != NULL ? ! zroot : "", NETCONFIG); ! ! if (brand_get_sz != NULL) { ! count = brand_get_sz(); ! } else { ! char line[BUFSIZ]; /* holds each line of NETCONFIG */ ! ! if ((fp = fopen(nc_path, "rF")) == NULL) { nc_error = NC_OPENFAIL; return (NULL); } count = 0;
*** 281,303 **** --- 305,342 ---- if (!(blank(line) || comment(line))) { ++count; } } rewind(fp); + } if (count == 0) { nc_error = NC_NOTFOUND; + if (fp != NULL) (void) fclose(fp); return (NULL); } + if ((listpp = malloc((count + 1) * sizeof (struct netconfig *))) == NULL) { nc_error = NC_NOMEM; + if (fp != NULL) (void) fclose(fp); return (NULL); } + if (brand_get_net_ent != NULL) { + int i; + + tpp = listpp; + for (i = 0; i < count; i++) { + *tpp = brand_get_net_ent(i); + tpp++; + } + *tpp = NULL; + nc_error = NC_NOMOREENTRIES; + } else { /* * The following loop fills in the list (loops until * fgetnetconfig() returns a NULL) and counts the * number of entries placed in the list. Note that * when the loop is completed, the last entry in the
*** 309,318 **** --- 348,359 ---- ; (void) fclose(fp); if (nc_error != NC_NOMOREENTRIES) /* Something is screwed up */ netlist_free(&listpp); + } + return (listpp); } /* * fgetnetconfig() parses a line of the netconfig file into