1183375Skmacy/*- 2183375Skmacy * Copyright (c) 2005 Marcel Moolenaar 3183375Skmacy * All rights reserved. 4183375Skmacy * 5183375Skmacy * Redistribution and use in source and binary forms, with or without 6183375Skmacy * modification, are permitted provided that the following conditions 7183375Skmacy * are met: 8183375Skmacy * 9183375Skmacy * 1. Redistributions of source code must retain the above copyright 10183375Skmacy * notice, this list of conditions and the following disclaimer. 11183375Skmacy * 2. Redistributions in binary form must reproduce the above copyright 12183375Skmacy * notice, this list of conditions and the following disclaimer in the 13183375Skmacy * documentation and/or other materials provided with the distribution. 14183375Skmacy * 15183375Skmacy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16183375Skmacy * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17183375Skmacy * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18183375Skmacy * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19183375Skmacy * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20183375Skmacy * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21183375Skmacy * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22183375Skmacy * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23183375Skmacy * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24183375Skmacy * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25183375Skmacy */ 26183375Skmacy 27183375Skmacy#if HAVE_NBTOOL_CONFIG_H 28183375Skmacy#include "nbtool_config.h" 29183375Skmacy#endif 30183375Skmacy 31183375Skmacy#include <sys/cdefs.h> 32183375Skmacy#ifdef __FBSDID 33183375Skmacy__FBSDID("$FreeBSD: src/sbin/gpt/label.c,v 1.3 2006/10/04 18:20:25 marcel Exp $"); 34183375Skmacy#endif 35183375Skmacy#ifdef __RCSID 36183375Skmacy__RCSID("$NetBSD: label.c,v 1.30 2019/06/21 02:14:59 jnemeth Exp $"); 37183375Skmacy#endif 38183375Skmacy 39183375Skmacy#include <sys/types.h> 40183375Skmacy 41183375Skmacy#include <err.h> 42183375Skmacy#include <stddef.h> 43183375Skmacy#include <stdio.h> 44183375Skmacy#include <stdlib.h> 45183375Skmacy#include <string.h> 46183375Skmacy#include <unistd.h> 47183375Skmacy 48183375Skmacy#include "map.h" 49183375Skmacy#include "gpt.h" 50183375Skmacy#include "gpt_private.h" 51183375Skmacy#include "gpt_uuid.h" 52183375Skmacy 53183375Skmacystatic int cmd_label(gpt_t, int, char *[]); 54183375Skmacy 55183375Skmacystatic const char *labelhelp[] = { 56183375Skmacy "-a <-l label | -f file>", 57183375Skmacy "[-b blocknr] [-i index] [-L label] [-s sectors] [-t uuid] " 58183375Skmacy "<-l label | -f file>", 59251767Sgibbs}; 60251767Sgibbs 61251767Sgibbsstruct gpt_cmd c_label = { 62251767Sgibbs "label", 63251767Sgibbs cmd_label, 64251767Sgibbs labelhelp, __arraycount(labelhelp), 65251767Sgibbs GPT_SYNC, 66183375Skmacy}; 67251767Sgibbs 68251767Sgibbs#define usage() gpt_usage(NULL, &c_label) 69251767Sgibbs 70251767Sgibbsstatic void 71251767Sgibbschange(struct gpt_ent *ent, void *v, int backup) 72251767Sgibbs{ 73183375Skmacy uint8_t *name = v; 74183375Skmacy utf8_to_utf16(name, ent->ent_name, __arraycount(ent->ent_name)); 75183375Skmacy} 76183375Skmacy 77183375Skmacystatic int 78183375Skmacyname_from_file(gpt_t gpt, void *v) 79183375Skmacy{ 80183375Skmacy FILE *f; 81183375Skmacy char *p; 82183375Skmacy size_t maxlen = 1024; 83183375Skmacy size_t len; 84183375Skmacy const char *fn = optarg; 85183375Skmacy char **name = v; 86183375Skmacy 87183375Skmacy if (*name != NULL) 88183375Skmacy return -1; 89183375Skmacy 90183375Skmacy if (strcmp(fn, "-") != 0) { 91183375Skmacy f = fopen(fn, "r"); 92183375Skmacy if (f == NULL) { 93183375Skmacy gpt_warn(gpt, "Can't open `%s'", fn); 94183375Skmacy return -1; 95183375Skmacy } 96183375Skmacy } else 97183375Skmacy f = stdin; 98183375Skmacy 99183375Skmacy if ((*name = malloc(maxlen)) == NULL) { 100183375Skmacy gpt_warn(gpt, "Can't copy string"); 101183375Skmacy goto cleanup; 102183375Skmacy } 103183375Skmacy len = fread(*name, 1, maxlen - 1, f); 104183375Skmacy if (ferror(f)) { 105183375Skmacy gpt_warn(gpt, "Can't label from `%s'", fn); 106183375Skmacy goto cleanup; 107251767Sgibbs } 108183375Skmacy if (f != stdin) 109183375Skmacy fclose(f); 110183375Skmacy (*name)[len] = '\0'; 111183375Skmacy /* Only keep the first line, excluding the newline character. */ 112183375Skmacy p = strchr(*name, '\n'); 113183375Skmacy if (p != NULL) 114183375Skmacy *p = '\0'; 115183375Skmacy return 0; 116183375Skmacycleanup: 117251767Sgibbs free(*name); 118251767Sgibbs if (f != stdin) 119251767Sgibbs fclose(f); 120251767Sgibbs return -1; 121251767Sgibbs} 122183375Skmacy 123183375Skmacystatic int 124183375Skmacycmd_label(gpt_t gpt, int argc, char *argv[]) 125183375Skmacy{ 126183375Skmacy int ch; 127183375Skmacy struct gpt_find find; 128251767Sgibbs char *name = NULL; 129183375Skmacy 130183375Skmacy memset(&find, 0, sizeof(find)); 131183375Skmacy find.msg = "label changed"; 132251767Sgibbs 133251767Sgibbs /* Get the label options */ 134183375Skmacy while ((ch = getopt(argc, argv, GPT_FIND "f:l:")) != -1) { 135183375Skmacy switch(ch) { 136183375Skmacy case 'f': 137183375Skmacy if (name_from_file(gpt, &name) == -1) 138183375Skmacy goto usage; 139183375Skmacy break; 140183375Skmacy case 'l': 141183375Skmacy if (gpt_name_get(gpt, &name) == -1) 142183375Skmacy goto usage; 143183375Skmacy break; 144183375Skmacy default: 145183375Skmacy if (gpt_add_find(gpt, &find, ch) == -1) 146183375Skmacy goto usage; 147183375Skmacy break; 148251767Sgibbs } 149251767Sgibbs } 150183375Skmacy 151183375Skmacy if (name == NULL || argc != optind) 152183375Skmacy goto usage; 153183375Skmacy 154183375Skmacy return gpt_change_ent(gpt, &find, change, name); 155183375Skmacyusage: 156183375Skmacy usage(); 157183375Skmacy free(name); 158183375Skmacy return -1; 159183375Skmacy} 160183375Skmacy