108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * CDDL HEADER START
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * The contents of this file are subject to the terms of the
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * Common Development and Distribution License (the "License").
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * You may not use this file except in compliance with the License.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * See the License for the specific language governing permissions
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * and limitations under the License.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * When distributing Covered Code, include this CDDL HEADER in each
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * If applicable, add the following below this CDDL HEADER, with the
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * fields enclosed by brackets "[]" replaced with your own identifying
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * information: Portions Copyright [yyyy] [name of copyright owner]
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * CDDL HEADER END
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * Use is subject to license terms.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj#pragma ident "%Z%%M% %I% %E% SMI"
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * This module contains functions used for reading and writing the scratch zone
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * translation files. These files are used by Live Upgrade to keep track of
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * mappings between actual kernel zone names and the zones in an alternate boot
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * environment.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * The functions are MT-safe.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * The file format looks like this:
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * <zonename> <kernel-zonename> <alt-root>
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * The expected usage model is:
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * fp = zonecfg_open_scratch("", B_TRUE);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * zonecfg_lock_scratch(fp);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * if (zonecfg_find_scratch(fp, zonename, altroot, NULL, 0) == 0) {
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * handle error; zone already mounted
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * mount zone here
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * zonecfg_add_scratch(fp, zonename, kernname, altroot);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * zonecfg_close_scratch(fp);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * fp = zonecfg_open_scratch(zoneroot, B_TRUE);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * ftruncate(fileno(fp), 0);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * zonecfg_add_scratch(fp, zonename, kernname, "/");
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * zonecfg_close_scratch(fp);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_open_scratch(const char *rootpath, boolean_t createfile)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj (void) snprintf(mapfile, sizeof (mapfile), "%s/" PATH_MAPFILE,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (!S_ISREG(lbuf.st_mode) || lbuf.st_nlink != 1 ||
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (lbuf.st_ino != fbuf.st_ino || lbuf.st_dev != fbuf.st_dev) {
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_get_scratch(FILE *fp, char *zonename, size_t namelen, char *kernname,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj /* We always hold at least a read lock on the file */
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (altroot != NULL && strlcpy(altroot, cp2, altlen) >= altlen)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (0);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_find_scratch(FILE *fp, const char *zonename, const char *altroot,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj while (zonecfg_get_scratch(fp, zone, sizeof (zone), kernzone, kernlen,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (strcmp(zone, zonename) == 0 && strcmp(altroot, aroot) == 0)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (0);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_reverse_scratch(FILE *fp, const char *kernzone, char *zonename,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj while (zonecfg_get_scratch(fp, zonename, namelen, kzone,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (0);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_add_scratch(FILE *fp, const char *zonename, const char *kernzone,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj const char *altroot)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (fprintf(fp, "%s %s %s\n", zonename, kernzone, altroot) == EOF)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (0);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonjzonecfg_delete_scratch(FILE *fp, const char *kernzone)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * The implementation here is intentionally quite simple. We could
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * allocate a buffer that's big enough to hold the data up to
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * stat.st_size and then write back out the part we need to, but there
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj * seems to be little point.
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (zonecfg_get_scratch(fp, NULL, 0, kzone, sizeof (kzone),
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (-1);
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj while (zonecfg_get_scratch(fp, zone, sizeof (zone), kzone,
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj if (fprintf(fp, "%s %s %s\n", zone, kzone, aroot) == EOF)
108322fb1c3ed341aba9c80c9774df0ed9e35768carlsonj return (0);