sade.h revision 161099
1/*
2 * Copyright (c) 1995
3 *	Jordan Hubbard.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer,
10 *    verbatim and that no modifications are made prior to this
11 *    point in the file.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: head/usr.sbin/sade/sade.h 161099 2006-08-08 13:45:46Z delphij $
29 */
30
31#ifndef _SADE_H_INCLUDE
32#define _SADE_H_INCLUDE
33
34#include <sys/types.h>
35#include <sys/wait.h>
36#include <errno.h>
37#include <setjmp.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <string.h>
41#include <unistd.h>
42#include <dialog.h>
43#include "ui_objects.h"
44#include "dir.h"
45#include "colors.h"
46
47/*** Defines ***/
48
49#if defined(__i386__) || defined(__amd64__)
50#define	WITH_SYSCONS
51#define	WITH_MICE
52#endif
53
54#if defined(__i386__) || defined(__amd64__)
55#define	WITH_SLICES
56#endif
57
58#if defined(__i386__)
59#define	WITH_LINUX
60#endif
61
62/* device limits */
63#define DEV_NAME_MAX		128	/* The maximum length of a device name	*/
64#define DEV_MAX			100	/* The maximum number of devices we'll deal with */
65#define IO_ERROR		-2	/* Status code for I/O error rather than normal EOF */
66
67/*
68 * I make some pretty gross assumptions about having a max of 50 chunks
69 * total - 8 slices and 42 partitions.  I can't easily display many more
70 * than that on the screen at once!
71 *
72 * For 2.1 I'll revisit this and try to make it more dynamic, but since
73 * this will catch 99.99% of all possible cases, I'm not too worried.
74 */
75#define MAX_CHUNKS	40
76
77/* Internal environment variable names */
78#define DISK_PARTITIONED		"_diskPartitioned"
79#define DISK_LABELLED			"_diskLabelled"
80#define DISK_SELECTED			"_diskSelected"
81#define SYSTEM_STATE			"_systemState"
82#define RUNNING_ON_ROOT			"_runningOnRoot"
83
84/* Ones that can be tweaked from config files */
85#define VAR_BLANKTIME			"blanktime"
86#define VAR_BOOTMGR			"bootManager"
87#define VAR_DEBUG			"debug"
88#define VAR_DISK			"disk"
89#define VAR_DISKINTERACTIVE		"diskInteractive"
90#define VAR_DEDICATE_DISK		"dedicateDisk"
91#define VAR_COMMAND			"command"
92#define VAR_CONFIG_FILE			"configFile"
93#define VAR_GEOMETRY			"geometry"
94#define VAR_INSTALL_CFG			"installConfig"
95#define VAR_INSTALL_ROOT		"installRoot"
96#define VAR_KEYMAP			"keymap"
97#define VAR_LABEL			"label"
98#define VAR_LABEL_COUNT			"labelCount"
99#define VAR_NEWFS_ARGS			"newfsArgs"
100#define VAR_NO_CONFIRM			"noConfirm"
101#define VAR_NO_ERROR			"noError"
102#define VAR_NO_WARN			"noWarn"
103#define VAR_NO_USR			"noUsr"
104#define VAR_NO_TMP			"noTmp"
105#define VAR_NO_HOME			"noHome"
106#define VAR_NONINTERACTIVE		"nonInteractive"
107#define VAR_PARTITION			"partition"
108#define VAR_RELNAME			"releaseName"
109#define VAR_ROOT_SIZE			"rootSize"
110#define VAR_SWAP_SIZE			"swapSize"
111#define VAR_TAPE_BLOCKSIZE		"tapeBlocksize"
112#define VAR_UFS_PATH			"ufs"
113#define VAR_USR_SIZE			"usrSize"
114#define VAR_VAR_SIZE			"varSize"
115#define VAR_TMP_SIZE			"tmpSize"
116#define VAR_TERM			"TERM"
117#define VAR_CONSTERM                    "_consterm"
118
119#define DEFAULT_TAPE_BLOCKSIZE	"20"
120
121/* One MB worth of blocks */
122#define ONE_MEG				2048
123#define ONE_GIG				(ONE_MEG * 1024)
124
125/* Which selection attributes to use */
126#define ATTR_SELECTED			(ColorDisplay ? item_selected_attr : item_attr)
127#define ATTR_TITLE	button_active_attr
128
129/* Handy strncpy() macro */
130#define SAFE_STRCPY(to, from)	sstrncpy((to), (from), sizeof (to) - 1)
131
132/*** Types ***/
133typedef int Boolean;
134typedef struct disk Disk;
135typedef struct chunk Chunk;
136
137/* Bitfields for menu options */
138#define DMENU_NORMAL_TYPE	0x1     /* Normal dialog menu           */
139#define DMENU_RADIO_TYPE	0x2     /* Radio dialog menu            */
140#define DMENU_CHECKLIST_TYPE	0x4     /* Multiple choice menu         */
141#define DMENU_SELECTION_RETURNS 0x8     /* Immediate return on item selection */
142
143typedef struct _dmenu {
144    int type;				/* What sort of menu we are	*/
145    char *title;			/* Our title			*/
146    char *prompt;			/* Our prompt			*/
147    char *helpline;			/* Line of help at bottom	*/
148    char *helpfile;			/* Help file for "F1"		*/
149    dialogMenuItem items[];		/* Array of menu items		*/
150} DMenu;
151
152/* An rc.conf variable */
153typedef struct _variable {
154    struct _variable *next;
155    char *name;
156    char *value;
157    int dirty;
158} Variable;
159
160#define NO_ECHO_OBJ(type)	((type) | (DITEM_NO_ECHO << 16))
161#define TYPE_OF_OBJ(type)	((type) & 0xff)
162#define ATTR_OF_OBJ(type)	((type) >> 16)
163
164/* A screen layout structure */
165typedef struct _layout {
166    int         y;              /* x & Y co-ordinates */
167    int         x;
168    int         len;            /* The size of the dialog on the screen */
169    int         maxlen;         /* How much the user can type in ... */
170    char        *prompt;        /* The string for the prompt */
171    char        *help;          /* The display for the help line */
172    void        *var;           /* The var to set when this changes */
173    int         type;           /* The type of the dialog to create */
174    void        *obj;           /* The obj pointer returned by libdialog */
175} Layout;
176
177typedef enum {
178    DEVICE_TYPE_NONE,
179    DEVICE_TYPE_DISK,
180    DEVICE_TYPE_DOS,
181    DEVICE_TYPE_UFS,
182    DEVICE_TYPE_ANY,
183} DeviceType;
184
185/* A "device" from sade's point of view */
186typedef struct _device {
187    char name[DEV_NAME_MAX];
188    char *description;
189    char *devname;
190    DeviceType type;
191    Boolean enabled;
192    Boolean (*init)(struct _device *dev);
193    FILE * (*get)(struct _device *dev, char *file, Boolean probe);
194    void (*shutdown)(struct _device *dev);
195    void *private;
196    unsigned int flags;
197    unsigned int volume;
198} Device;
199
200/* Some internal representations of partitions */
201typedef enum {
202    PART_NONE,
203    PART_SLICE,
204    PART_SWAP,
205    PART_FILESYSTEM,
206    PART_FAT,
207    PART_EFI
208} PartType;
209
210#define	NEWFS_UFS_CMD		"newfs"
211#define	NEWFS_MSDOS_CMD		"newfs_msdos"
212
213enum newfs_type { NEWFS_UFS, NEWFS_MSDOS, NEWFS_CUSTOM };
214#define	NEWFS_UFS_STRING	"UFS"
215#define	NEWFS_MSDOS_STRING	"FAT"
216#define	NEWFS_CUSTOM_STRING	"CST"
217
218/* The longest set of custom command line arguments we'll pass. */
219#define NEWFS_CMD_ARGS_MAX	256
220
221typedef struct _part_info {
222	char mountpoint[FILENAME_MAX];
223
224	/* Is invocation of newfs desired? */
225	Boolean do_newfs;
226
227	enum newfs_type newfs_type;
228	union {
229		struct {
230			char user_options[NEWFS_CMD_ARGS_MAX];
231			Boolean acls;		/* unused */
232			Boolean multilabel;	/* unused */
233			Boolean softupdates;
234			Boolean ufs1;
235		} newfs_ufs;
236		struct {
237			/* unused */
238		} newfs_msdos;
239		struct {
240			char command[NEWFS_CMD_ARGS_MAX];
241		} newfs_custom;
242	} newfs_data;
243} PartInfo;
244
245/* An option */
246typedef struct _opt {
247    char *name;
248    char *desc;
249    enum { OPT_IS_STRING, OPT_IS_INT, OPT_IS_FUNC, OPT_IS_VAR } type;
250    void *data;
251    void *aux;
252    char *(*check)(void);
253} Option;
254
255typedef int (*commandFunc)(char *key, void *data);
256
257#define EXTRAS_FIELD_LEN	128
258
259/*** Externs ***/
260extern jmp_buf		BailOut;		/* Used to get the heck out */
261extern int		DebugFD;		/* Where diagnostic output goes			*/
262extern Boolean		Fake;			/* Don't actually modify anything - testing	*/
263extern Boolean		Restarting;		/* Are we restarting sysinstall?		*/
264extern Boolean		SystemWasInstalled;	/* Did we install it?				*/
265extern Boolean		RunningAsInit;		/* Are we running stand-alone?			*/
266extern Boolean		DialogActive;		/* Is the dialog() stuff up?			*/
267extern Boolean		ColorDisplay;		/* Are we on a color display?			*/
268extern Boolean		OnVTY;			/* On a syscons VTY?				*/
269extern Variable		*VarHead;		/* The head of the variable chain		*/
270extern int		BootMgr;		/* Which boot manager to use 			*/
271extern int		StatusLine;		/* Where to print our status messages		*/
272#if defined(__i386__) || defined(__amd64__)
273#ifdef PC98
274extern DMenu		MenuIPLType;		/* Type of IPL to write on the disk		*/
275#else
276extern DMenu		MenuMBRType;		/* Type of MBR to write on the disk		*/
277#endif
278#endif
279extern DMenu		MenuMain;       /* New main menu */
280extern DMenu    MenuDiskDevices;        /* Disk type devices                            */
281extern const char *	StartName;		/* Which name we were started as */
282
283/* Important chunks. */
284extern Chunk *HomeChunk;
285extern Chunk *RootChunk;
286extern Chunk *SwapChunk;
287extern Chunk *TmpChunk;
288extern Chunk *UsrChunk;
289extern Chunk *VarChunk;
290#ifdef __ia64__
291extern Chunk *EfiChunk;
292#endif
293
294/* Stuff from libdialog which isn't properly declared outside */
295extern void display_helpfile(void);
296extern void display_helpline(WINDOW *w, int y, int width);
297
298/*** Prototypes ***/
299
300/* command.c */
301extern void	command_clear(void);
302extern void	command_sort(void);
303extern void	command_execute(void);
304extern void	command_shell_add(char *key, const char *fmt, ...) __printflike(2, 3);
305extern void	command_func_add(char *key, commandFunc func, void *data);
306
307/* config.c */
308extern void	configEnvironmentRC_conf(void);
309extern void	configRC_conf(void);
310extern int	configFstab(dialogMenuItem *self);
311extern int	configRC(dialogMenuItem *self);
312extern int	configWriteRC_conf(dialogMenuItem *self);
313
314/* devices.c */
315extern DMenu	*deviceCreateMenu(DMenu *menu, DeviceType type, int (*hook)(dialogMenuItem *d),
316				  int (*check)(dialogMenuItem *d));
317extern void	deviceGetAll(void);
318extern void	deviceReset(void);
319extern void	deviceRescan(void);
320extern Device	**deviceFind(char *name, DeviceType type);
321extern Device	**deviceFindDescr(char *name, char *desc, DeviceType class);
322extern int	deviceCount(Device **devs);
323extern Device	*new_device(char *name);
324extern Device	*deviceRegister(char *name, char *desc, char *devicename, DeviceType type, Boolean enabled,
325				Boolean (*init)(Device *mediadev),
326				FILE * (*get)(Device *dev, char *file, Boolean probe),
327				void (*shutDown)(Device *mediadev),
328				void *private);
329extern Boolean	dummyInit(Device *dev);
330extern FILE	*dummyGet(Device *dev, char *dist, Boolean probe);
331extern void	dummyShutdown(Device *dev);
332
333/* disks.c */
334#ifdef WITH_SLICES
335extern void	diskPartition(Device *dev);
336extern int	diskPartitionEditor(dialogMenuItem *self);
337#endif
338extern int	diskPartitionWrite(dialogMenuItem *self);
339extern int	diskGetSelectCount(Device ***devs);
340
341/* dispatch.c */
342extern int	dispatchCommand(char *command);
343extern int	dispatch_load_floppy(dialogMenuItem *self);
344extern int	dispatch_load_file_int(int);
345extern int	dispatch_load_file(dialogMenuItem *self);
346
347/* dmenu.c */
348extern int	dmenuDisplayFile(dialogMenuItem *tmp);
349extern int	dmenuSubmenu(dialogMenuItem *tmp);
350extern int	dmenuSystemCommand(dialogMenuItem *tmp);
351extern int	dmenuSystemCommandBox(dialogMenuItem *tmp);
352extern int	dmenuExit(dialogMenuItem *tmp);
353extern int	dmenuISetVariable(dialogMenuItem *tmp);
354extern int	dmenuSetVariable(dialogMenuItem *tmp);
355extern int	dmenuSetKmapVariable(dialogMenuItem *tmp);
356extern int	dmenuSetVariables(dialogMenuItem *tmp);
357extern int	dmenuToggleVariable(dialogMenuItem *tmp);
358extern int	dmenuSetFlag(dialogMenuItem *tmp);
359extern int	dmenuSetValue(dialogMenuItem *tmp);
360extern Boolean	dmenuOpen(DMenu *menu, int *choice, int *bscroll, int *curr, int *max, Boolean buttons);
361extern Boolean	dmenuOpenSimple(DMenu *menu, Boolean buttons);
362extern int	dmenuVarCheck(dialogMenuItem *item);
363extern int	dmenuVarsCheck(dialogMenuItem *item);
364extern int	dmenuFlagCheck(dialogMenuItem *item);
365extern int	dmenuRadioCheck(dialogMenuItem *item);
366
367/* dos.c */
368extern Boolean mediaCloseDOS(Device *dev, FILE *fp);
369extern Boolean mediaInitDOS(Device *dev);
370extern FILE    *mediaGetDOS(Device *dev, char *file, Boolean probe);
371extern void    mediaShutdownDOS(Device *dev);
372
373/* globals.c */
374extern void	globalsInit(void);
375
376/* install.c */
377extern Boolean	checkLabels(Boolean whinge);
378extern int	installCommit(dialogMenuItem *self);
379extern int	installCustomCommit(dialogMenuItem *self);
380extern int	installFilesystems(dialogMenuItem *self);
381extern int	installVarDefaults(dialogMenuItem *self);
382extern void	installEnvironment(void);
383extern Boolean	copySelf(void);
384
385/* kget.c */
386extern int	kget(char *out);
387
388/* keymap.c */
389extern int	loadKeymap(const char *lang);
390
391/* label.c */
392extern int	diskLabelEditor(dialogMenuItem *self);
393extern int	diskLabelCommit(dialogMenuItem *self);
394
395/* makedevs.c (auto-generated) */
396extern const char	termcap_ansi[];
397extern const char	termcap_vt100[];
398extern const char	termcap_cons25w[];
399extern const char	termcap_cons25[];
400extern const char	termcap_cons25_m[];
401extern const char	termcap_cons25r[];
402extern const char	termcap_cons25r_m[];
403extern const char	termcap_cons25l1[];
404extern const char	termcap_cons25l1_m[];
405extern const char	termcap_xterm[];
406extern const u_char	font_iso_8x16[];
407extern const u_char	font_cp850_8x16[];
408extern const u_char	font_cp866_8x16[];
409extern const u_char	koi8_r2cp866[];
410extern u_char		default_scrnmap[];
411
412/* misc.c */
413extern Boolean	file_readable(char *fname);
414extern Boolean	file_executable(char *fname);
415extern Boolean	directory_exists(const char *dirname);
416extern char	*root_bias(char *path);
417extern char	*itoa(int value);
418extern char	*string_concat(char *p1, char *p2);
419extern char	*string_concat3(char *p1, char *p2, char *p3);
420extern char	*string_prune(char *str);
421extern char	*string_skipwhite(char *str);
422extern char	*string_copy(char *s1, char *s2);
423extern char	*pathBaseName(const char *path);
424extern void	safe_free(void *ptr);
425extern void	*safe_malloc(size_t size);
426extern void	*safe_realloc(void *orig, size_t size);
427extern dialogMenuItem *item_add(dialogMenuItem *list, char *prompt, char *title,
428				int (*checked)(dialogMenuItem *self),
429				int (*fire)(dialogMenuItem *self),
430				void (*selected)(dialogMenuItem *self, int is_selected),
431				void *data, int *aux, int *curr, int *max);
432extern void	items_free(dialogMenuItem *list, int *curr, int *max);
433extern int	Mkdir(char *);
434extern int	Mkdir_command(char *key, void *data);
435extern int	Mount(char *, void *data);
436extern int	Mount_msdosfs(char *mountp, void *devicename);
437extern WINDOW	*openLayoutDialog(char *helpfile, char *title, int x, int y, int width, int height);
438extern ComposeObj *initLayoutDialog(WINDOW *win, Layout *layout, int x, int y, int *max);
439extern int	layoutDialogLoop(WINDOW *win, Layout *layout, ComposeObj **obj,
440				 int *n, int max, int *cbutton, int *cancel);
441
442extern WINDOW	*savescr(void);
443extern void	restorescr(WINDOW *w);
444extern char	*sstrncpy(char *dst, const char *src, int size);
445
446/* msg.c */
447extern Boolean	isDebug(void);
448extern void	msgInfo(const char *fmt, ...) __printf0like(1, 2);
449extern void	msgYap(const char *fmt, ...) __printflike(1, 2);
450extern void	msgWarn(const char *fmt, ...) __printflike(1, 2);
451extern void	msgDebug(const char *fmt, ...) __printflike(1, 2);
452extern void	msgError(const char *fmt, ...) __printflike(1, 2);
453extern void	msgFatal(const char *fmt, ...) __printflike(1, 2);
454extern void	msgConfirm(const char *fmt, ...) __printflike(1, 2);
455extern void	msgNotify(const char *fmt, ...) __printflike(1, 2);
456extern void	msgWeHaveOutput(const char *fmt, ...) __printflike(1, 2);
457extern int	msgYesNo(const char *fmt, ...) __printflike(1, 2);
458extern int	msgNoYes(const char *fmt, ...) __printflike(1, 2);
459extern char	*msgGetInput(char *buf, const char *fmt, ...) __printflike(2, 3);
460extern int	msgSimpleConfirm(const char *);
461extern int	msgSimpleNotify(const char *);
462
463/* pccard.c */
464extern void	pccardInitialize(void);
465
466/* system.c */
467extern void	systemInitialize(int argc, char **argv);
468extern void	systemShutdown(int status);
469extern int	execExecute(char *cmd, char *name);
470extern int	systemExecute(char *cmd);
471extern void	systemSuspendDialog(void);
472extern void	systemResumeDialog(void);
473extern int	systemDisplayHelp(char *file);
474extern char	*systemHelpFile(char *file, char *buf);
475extern void	systemChangeFont(const u_char font[]);
476extern void	systemChangeLang(char *lang);
477extern void	systemChangeTerminal(char *color, const u_char c_termcap[], char *mono, const u_char m_termcap[]);
478extern void	systemChangeScreenmap(const u_char newmap[]);
479extern int	vsystem(const char *fmt, ...) __printflike(1, 2);
480
481/* termcap.c */
482extern int	set_termcap(void);
483
484/* variable.c */
485extern void	variable_set(char *var, int dirty);
486extern void	variable_set2(char *name, char *value, int dirty);
487extern char 	*variable_get(char *var);
488extern int 	variable_cmp(char *var, char *value);
489extern void	variable_unset(char *var);
490extern char	*variable_get_value(char *var, char *prompt, int dirty);
491extern int 	variable_check(char *data);
492extern int 	variable_check2(char *data);
493extern int	dump_variables(dialogMenuItem *self);
494extern void	free_variables(void);
495extern void     pvariable_set(char *var);
496extern char     *pvariable_get(char *var);
497
498/* wizard.c */
499extern void	slice_wizard(Disk *d);
500
501/*
502 * Macros.  Please find a better place for us!
503 */
504#define DEVICE_INIT(d)		((d) != NULL ? (d)->init((d)) : (Boolean)0)
505#define DEVICE_GET(d, b, f)	((d) != NULL ? (d)->get((d), (b), (f)) : NULL)
506#define DEVICE_SHUTDOWN(d)	((d) != NULL ? (d)->shutdown((d)) : (void)0)
507
508#endif
509/* _SYSINSTALL_H_INCLUDE */
510