1 /* @(#)label.c	1.35 21/08/20 Copyright 1988-2021 J. Schilling */
2 #include <schily/mconfig.h>
3 #ifndef lint
4 static	UConst char sccsid[] =
5 	"@(#)label.c	1.35 21/08/20 Copyright 1988-2021 J. Schilling";
6 #endif
7 /*
8  *	Copyright (c) 1988-2021 J. Schilling
9  */
10 /*
11  * The contents of this file are subject to the terms of the
12  * Common Development and Distribution License, Version 1.0 only
13  * (the "License").  You may not use this file except in compliance
14  * with the License.
15  *
16  * See the file CDDL.Schily.txt in this distribution for details.
17  * A copy of the CDDL is also available via the Internet at
18  * http://www.opensource.org/licenses/cddl1.txt
19  *
20  * When distributing Covered Code, include this CDDL HEADER in each
21  * file and include the License file CDDL.Schily.txt from this distribution.
22  */
23 
24 #include <schily/stdio.h>
25 #include <schily/stdlib.h>
26 #include <schily/standard.h>
27 #include <schily/param.h>	/* Include various defs needed with some OS */
28 #include <schily/ioctl.h>
29 #define	GT_COMERR		/* #define comerr gtcomerr */
30 #define	GT_ERROR		/* #define error gterror   */
31 #include <schily/schily.h>
32 #include <schily/nlsdefs.h>
33 #include "dsklabel.h"
34 #include "fmt.h"
35 
36 struct disk	cur_disk;
37 struct	dk_label x_label;
38 struct  dk_label *d_label = &x_label;
39 	char	*disknm;
40 
41 char	opt[] = "help,version,print,p,Prpart,P,set,s,if*,lproto*,of*,lname*,f*";
42 
43 extern char	*Lname;
44 extern char	*Lproto;
45 
46 LOCAL	void	usage		__PR((int ret));
47 EXPORT	int	main		__PR((int, char **));
48 EXPORT	void	disk_null	__PR((struct disk *dp, int init));
49 
50 void
get_lgeom_defaults(scgp,dp)51 get_lgeom_defaults(scgp, dp)
52 	SCSI	*scgp;
53 	struct disk	*dp;
54 {
55 }
56 
57 LOCAL void
usage(ret)58 usage(ret)
59 	int	ret;
60 {
61 	error("Usage: label [options]\n");
62 	error("Options:\n");
63 	error("	-help		Print this help.\n");
64 	error("	-version	Print version number.\n");
65 	error("\t-print,-p\tonly print label\n");
66 	error("\t-set,-s\t\tset driver tables from disk label\n");
67 	error("\tof=name\t\tname of output Label (default: '%s')\n", Lname);
68 	error("\tlname=name\tname of output Label (default: '%s')\n", Lname);
69 	error("\tif=name\t\tname of input  Label (default: '%s')\n", Lproto);
70 	error("\tlproto=name\tname of input  Label (default: '%s')\n", Lproto);
71 	error("\tf=name\tname of input & output  Label\n");
72 	exit(ret);
73 }
74 
75 int
main(ac,av)76 main(ac, av)
77 	int	ac;
78 	char	*av[];
79 {
80 	BOOL	help	= FALSE;
81 	BOOL	prversion = FALSE;
82 	int	print	= 0;
83 	int	Prpart	= 0;
84 	int	set	= 0;
85 	int	cac	= ac;
86 	char	*const *cav= av;
87 	SCSI	scg;
88 
89 	save_args(ac, av);
90 
91 	(void) setlocale(LC_ALL, "");
92 
93 #ifdef  USE_NLS
94 #if !defined(TEXT_DOMAIN)	/* Should be defined by cc -D */
95 #define	TEXT_DOMAIN "p"		/* Use this only if it weren't */
96 #endif
97 	{ char	*dir;
98 	dir = searchfileinpath("share/locale", F_OK,
99 					SIP_ANY_FILE|SIP_NO_PATH, NULL);
100 	if (dir)
101 		(void) bindtextdomain(TEXT_DOMAIN, dir);
102 	else
103 #if defined(PROTOTYPES) && defined(INS_BASE)
104 	(void) bindtextdomain(TEXT_DOMAIN, INS_BASE "/share/locale");
105 #else
106 	(void) bindtextdomain(TEXT_DOMAIN, "/usr/share/locale");
107 #endif
108 	(void) textdomain(TEXT_DOMAIN);
109 	}
110 #endif 	/* USE_NLS */
111 
112 	disk_null(&cur_disk, TRUE);
113 
114 	cac--;
115 	cav++;
116 	if (getallargs(&cac, &cav, opt, &help, &prversion,
117 						&print, &print,
118 						&Prpart, &Prpart,
119 						&set, &set,
120 						&Lproto, &Lproto,
121 						&Lname, &Lname,
122 						&disknm) < 0) {
123 		errmsgno(EX_BAD, "Bad flag: %s.\n", cav[0]);
124 		usage(EX_BAD);
125 	}
126 	if (help)
127 		usage(0);
128 	if (prversion) {
129 		gtprintf("Label release %s (%s-%s-%s) Copyright (C) 1988-2021 %s\n",
130 				"1.35",
131 				HOST_CPU, HOST_VENDOR, HOST_OS,
132 				_("J�rg Schilling"));
133 		exit(0);
134 	}
135 
136 	if (disknm)
137 		Lname = Lproto = disknm;
138 
139 	if (print || Prpart || set) {
140 		if (readlabel(Lproto, d_label)) {
141 			cur_disk.labelread = 0;
142 
143 			if (Prpart) {
144 				prpartab(stdout, "UNKNOWN", d_label);
145 			} else {
146 				printlabel(d_label);
147 				checklabel(&cur_disk, d_label, 0);
148 			}
149 			if (!setval_from_label(&cur_disk, d_label))
150 				comerrno(EX_BAD, "Bad Label '%s'\n", Lproto);
151 			if (set)
152 				exit(setlabel(Lname, d_label));
153 			exit(0);
154 		}
155 		exit(-1);
156 	}
157 
158 	if (readlabel(Lproto, d_label)) {
159 		cur_disk.labelread = 0;
160 		if (setval_from_label(&cur_disk, d_label))
161 			cur_disk.labelread = 1;
162 	}
163 	do {
164 		getlong("Enter number of physical cylinders",
165 						&cur_disk.pcyl, 1L, 0xFFFE);
166 						cur_disk.lpcyl = cur_disk.pcyl;
167 		getlong("Enter number of data cylinders",
168 						&cur_disk.lncyl, 1L, 0xFFFE);
169 		getlong("Enter number of alternate cylinders (Label)",
170 						&cur_disk.lacyl,0L, 10000);
171 		getlong("Enter number of data      heads     (Label)",
172 						&cur_disk.lhead, 1L, 100);
173 		getlong("Enter number of data sectors/track  (Label)",
174 						&cur_disk.lspt, 1L, 0xFFFE);
175 		getlong("Enter rpm of drive",
176 						&cur_disk.rpm, 0L, 10000L);
177 
178 		makelabel(&scg, &cur_disk, d_label);
179 		printlabel(d_label);
180 		checklabel(&cur_disk, d_label, 1);
181 	} while(!yes("Use this label? "));
182 	/*
183 	 * fill in default vtmap if not done yet
184 	 */
185 	check_vtmap(d_label, 1);
186 	writelabel(Lname, d_label);
187 	return (0);
188 }
189 
190 EXPORT void
disk_null(dp,init)191 disk_null(dp, init)
192 	struct disk	*dp;
193 	int		init;
194 {
195 	register int i = sizeof(struct disk);
196 	register char *p = (char *)dp;
197 
198 	while (--i >= 0) {
199 		*p++ = -1;
200 	}
201 }
202