sade.h revision 161120
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 161120 2006-08-09 11:25:10Z netchild $
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_LABEL			"label"
97#define VAR_LABEL_COUNT			"labelCount"
98#define VAR_NEWFS_ARGS			"newfsArgs"
99#define VAR_NO_CONFIRM			"noConfirm"
100#define VAR_NO_ERROR			"noError"
101#define VAR_NO_WARN			"noWarn"
102#define VAR_NO_USR			"noUsr"
103#define VAR_NO_TMP			"noTmp"
104#define VAR_NO_HOME			"noHome"
105#define VAR_NONINTERACTIVE		"nonInteractive"
106#define VAR_PARTITION			"partition"
107#define VAR_RELNAME			"releaseName"
108#define VAR_ROOT_SIZE			"rootSize"
109#define VAR_SWAP_SIZE			"swapSize"
110#define VAR_TAPE_BLOCKSIZE		"tapeBlocksize"
111#define VAR_UFS_PATH			"ufs"
112#define VAR_USR_SIZE			"usrSize"
113#define VAR_VAR_SIZE			"varSize"
114#define VAR_TMP_SIZE			"tmpSize"
115#define VAR_TERM			"TERM"
116#define VAR_CONSTERM                    "_consterm"
117
118#define DEFAULT_TAPE_BLOCKSIZE	"20"
119
120/* One MB worth of blocks */
121#define ONE_MEG				2048
122#define ONE_GIG				(ONE_MEG * 1024)
123
124/* Which selection attributes to use */
125#define ATTR_SELECTED			(ColorDisplay ? item_selected_attr : item_attr)
126#define ATTR_TITLE	button_active_attr
127
128/* Handy strncpy() macro */
129#define SAFE_STRCPY(to, from)	sstrncpy((to), (from), sizeof (to) - 1)
130
131/*** Types ***/
132typedef int Boolean;
133typedef struct disk Disk;
134typedef struct chunk Chunk;
135
136/* Bitfields for menu options */
137#define DMENU_NORMAL_TYPE	0x1     /* Normal dialog menu           */
138#define DMENU_RADIO_TYPE	0x2     /* Radio dialog menu            */
139#define DMENU_CHECKLIST_TYPE	0x4     /* Multiple choice menu         */
140#define DMENU_SELECTION_RETURNS 0x8     /* Immediate return on item selection */
141
142typedef struct _dmenu {
143    int type;				/* What sort of menu we are	*/
144    char *title;			/* Our title			*/
145    char *prompt;			/* Our prompt			*/
146    char *helpline;			/* Line of help at bottom	*/
147    char *helpfile;			/* Help file for "F1"		*/
148    dialogMenuItem items[];		/* Array of menu items		*/
149} DMenu;
150
151/* An rc.conf variable */
152typedef struct _variable {
153    struct _variable *next;
154    char *name;
155    char *value;
156    int dirty;
157} Variable;
158
159#define NO_ECHO_OBJ(type)	((type) | (DITEM_NO_ECHO << 16))
160#define TYPE_OF_OBJ(type)	((type) & 0xff)
161#define ATTR_OF_OBJ(type)	((type) >> 16)
162
163/* A screen layout structure */
164typedef struct _layout {
165    int         y;              /* x & Y co-ordinates */
166    int         x;
167    int         len;            /* The size of the dialog on the screen */
168    int         maxlen;         /* How much the user can type in ... */
169    char        *prompt;        /* The string for the prompt */
170    char        *help;          /* The display for the help line */
171    void        *var;           /* The var to set when this changes */
172    int         type;           /* The type of the dialog to create */
173    void        *obj;           /* The obj pointer returned by libdialog */
174} Layout;
175
176typedef enum {
177    DEVICE_TYPE_NONE,
178    DEVICE_TYPE_DISK,
179    DEVICE_TYPE_DOS,
180    DEVICE_TYPE_UFS,
181    DEVICE_TYPE_ANY,
182} DeviceType;
183
184/* A "device" from sade's point of view */
185typedef struct _device {
186    char name[DEV_NAME_MAX];
187    char *description;
188    char *devname;
189    DeviceType type;
190    Boolean enabled;
191    Boolean (*init)(struct _device *dev);
192    FILE * (*get)(struct _device *dev, char *file, Boolean probe);
193    void (*shutdown)(struct _device *dev);
194    void *private;
195    unsigned int flags;
196    unsigned int volume;
197} Device;
198
199/* Some internal representations of partitions */
200typedef enum {
201    PART_NONE,
202    PART_SLICE,
203    PART_SWAP,
204    PART_FILESYSTEM,
205    PART_FAT,
206    PART_EFI
207} PartType;
208
209#define	NEWFS_UFS_CMD		"newfs"
210#define	NEWFS_MSDOS_CMD		"newfs_msdos"
211
212enum newfs_type { NEWFS_UFS, NEWFS_MSDOS, NEWFS_CUSTOM };
213#define	NEWFS_UFS_STRING	"UFS"
214#define	NEWFS_MSDOS_STRING	"FAT"
215#define	NEWFS_CUSTOM_STRING	"CST"
216
217/* The longest set of custom command line arguments we'll pass. */
218#define NEWFS_CMD_ARGS_MAX	256
219
220typedef struct _part_info {
221	char mountpoint[FILENAME_MAX];
222
223	/* Is invocation of newfs desired? */
224	Boolean do_newfs;
225
226	enum newfs_type newfs_type;
227	union {
228		struct {
229			char user_options[NEWFS_CMD_ARGS_MAX];
230			Boolean acls;		/* unused */
231			Boolean multilabel;	/* unused */
232			Boolean softupdates;
233			Boolean ufs1;
234		} newfs_ufs;
235		struct {
236			/* unused */
237		} newfs_msdos;
238		struct {
239			char command[NEWFS_CMD_ARGS_MAX];
240		} newfs_custom;
241	} newfs_data;
242} PartInfo;
243
244/* An option */
245typedef struct _opt {
246    char *name;
247    char *desc;
248    enum { OPT_IS_STRING, OPT_IS_INT, OPT_IS_FUNC, OPT_IS_VAR } type;
249    void *data;
250    void *aux;
251    char *(*check)(void);
252} Option;
253
254typedef int (*commandFunc)(char *key, void *data);
255
256#define EXTRAS_FIELD_LEN	128
257
258/*** Externs ***/
259extern jmp_buf		BailOut;		/* Used to get the heck out */
260extern int		DebugFD;		/* Where diagnostic output goes			*/
261extern Boolean		Fake;			/* Don't actually modify anything - testing	*/
262extern Boolean		Restarting;		/* Are we restarting sysinstall?		*/
263extern Boolean		SystemWasInstalled;	/* Did we install it?				*/
264extern Boolean		RunningAsInit;		/* Are we running stand-alone?			*/
265extern Boolean		DialogActive;		/* Is the dialog() stuff up?			*/
266extern Boolean		ColorDisplay;		/* Are we on a color display?			*/
267extern Boolean		OnVTY;			/* On a syscons VTY?				*/
268extern Variable		*VarHead;		/* The head of the variable chain		*/
269extern int		BootMgr;		/* Which boot manager to use 			*/
270extern int		StatusLine;		/* Where to print our status messages		*/
271#if defined(__i386__) || defined(__amd64__)
272#ifdef PC98
273extern DMenu		MenuIPLType;		/* Type of IPL to write on the disk		*/
274#else
275extern DMenu		MenuMBRType;		/* Type of MBR to write on the disk		*/
276#endif
277#endif
278extern DMenu		MenuMain;       /* New main menu */
279extern DMenu    MenuDiskDevices;        /* Disk type devices                            */
280extern const char *	StartName;		/* Which name we were started as */
281
282/* Important chunks. */
283extern Chunk *HomeChunk;
284extern Chunk *RootChunk;
285extern Chunk *SwapChunk;
286extern Chunk *TmpChunk;
287extern Chunk *UsrChunk;
288extern Chunk *VarChunk;
289#ifdef __ia64__
290extern Chunk *EfiChunk;
291#endif
292
293/* Stuff from libdialog which isn't properly declared outside */
294extern void display_helpfile(void);
295extern void display_helpline(WINDOW *w, int y, int width);
296
297/*** Prototypes ***/
298
299/* command.c */
300extern void	command_clear(void);
301extern void	command_sort(void);
302extern void	command_execute(void);
303extern void	command_shell_add(char *key, const char *fmt, ...) __printflike(2, 3);
304extern void	command_func_add(char *key, commandFunc func, void *data);
305
306/* config.c */
307extern void	configEnvironmentRC_conf(void);
308extern void	configRC_conf(void);
309extern int	configFstab(dialogMenuItem *self);
310extern int	configRC(dialogMenuItem *self);
311extern int	configWriteRC_conf(dialogMenuItem *self);
312
313/* devices.c */
314extern DMenu	*deviceCreateMenu(DMenu *menu, DeviceType type, int (*hook)(dialogMenuItem *d),
315				  int (*check)(dialogMenuItem *d));
316extern void	deviceGetAll(void);
317extern void	deviceReset(void);
318extern void	deviceRescan(void);
319extern Device	**deviceFind(char *name, DeviceType type);
320extern Device	**deviceFindDescr(char *name, char *desc, DeviceType class);
321extern int	deviceCount(Device **devs);
322extern Device	*new_device(char *name);
323extern Device	*deviceRegister(char *name, char *desc, char *devicename, DeviceType type, Boolean enabled,
324				Boolean (*init)(Device *mediadev),
325				FILE * (*get)(Device *dev, char *file, Boolean probe),
326				void (*shutDown)(Device *mediadev),
327				void *private);
328extern Boolean	dummyInit(Device *dev);
329extern FILE	*dummyGet(Device *dev, char *dist, Boolean probe);
330extern void	dummyShutdown(Device *dev);
331
332/* disks.c */
333#ifdef WITH_SLICES
334extern void	diskPartition(Device *dev);
335extern int	diskPartitionEditor(dialogMenuItem *self);
336#endif
337extern int	diskPartitionWrite(dialogMenuItem *self);
338extern int	diskGetSelectCount(Device ***devs);
339
340/* dispatch.c */
341extern int	dispatchCommand(char *command);
342extern int	dispatch_load_floppy(dialogMenuItem *self);
343extern int	dispatch_load_file_int(int);
344extern int	dispatch_load_file(dialogMenuItem *self);
345
346/* dmenu.c */
347extern int	dmenuDisplayFile(dialogMenuItem *tmp);
348extern int	dmenuSubmenu(dialogMenuItem *tmp);
349extern int	dmenuSystemCommand(dialogMenuItem *tmp);
350extern int	dmenuSystemCommandBox(dialogMenuItem *tmp);
351extern int	dmenuExit(dialogMenuItem *tmp);
352extern int	dmenuISetVariable(dialogMenuItem *tmp);
353extern int	dmenuSetVariable(dialogMenuItem *tmp);
354extern int	dmenuSetVariables(dialogMenuItem *tmp);
355extern int	dmenuToggleVariable(dialogMenuItem *tmp);
356extern int	dmenuSetFlag(dialogMenuItem *tmp);
357extern int	dmenuSetValue(dialogMenuItem *tmp);
358extern Boolean	dmenuOpen(DMenu *menu, int *choice, int *bscroll, int *curr, int *max, Boolean buttons);
359extern Boolean	dmenuOpenSimple(DMenu *menu, Boolean buttons);
360extern int	dmenuVarCheck(dialogMenuItem *item);
361extern int	dmenuVarsCheck(dialogMenuItem *item);
362extern int	dmenuFlagCheck(dialogMenuItem *item);
363extern int	dmenuRadioCheck(dialogMenuItem *item);
364
365/* dos.c */
366extern Boolean mediaCloseDOS(Device *dev, FILE *fp);
367extern Boolean mediaInitDOS(Device *dev);
368extern FILE    *mediaGetDOS(Device *dev, char *file, Boolean probe);
369extern void    mediaShutdownDOS(Device *dev);
370
371/* globals.c */
372extern void	globalsInit(void);
373
374/* install.c */
375extern Boolean	checkLabels(Boolean whinge);
376extern int	installCommit(dialogMenuItem *self);
377extern int	installCustomCommit(dialogMenuItem *self);
378extern int	installFilesystems(dialogMenuItem *self);
379extern int	installVarDefaults(dialogMenuItem *self);
380extern void	installEnvironment(void);
381extern Boolean	copySelf(void);
382
383/* kget.c */
384extern int	kget(char *out);
385
386/* label.c */
387extern int	diskLabelEditor(dialogMenuItem *self);
388extern int	diskLabelCommit(dialogMenuItem *self);
389
390/* misc.c */
391extern Boolean	file_readable(char *fname);
392extern Boolean	file_executable(char *fname);
393extern Boolean	directory_exists(const char *dirname);
394extern char	*root_bias(char *path);
395extern char	*itoa(int value);
396extern char	*string_concat(char *p1, char *p2);
397extern char	*string_concat3(char *p1, char *p2, char *p3);
398extern char	*string_prune(char *str);
399extern char	*string_skipwhite(char *str);
400extern char	*string_copy(char *s1, char *s2);
401extern char	*pathBaseName(const char *path);
402extern void	safe_free(void *ptr);
403extern void	*safe_malloc(size_t size);
404extern void	*safe_realloc(void *orig, size_t size);
405extern dialogMenuItem *item_add(dialogMenuItem *list, char *prompt, char *title,
406				int (*checked)(dialogMenuItem *self),
407				int (*fire)(dialogMenuItem *self),
408				void (*selected)(dialogMenuItem *self, int is_selected),
409				void *data, int *aux, int *curr, int *max);
410extern void	items_free(dialogMenuItem *list, int *curr, int *max);
411extern int	Mkdir(char *);
412extern int	Mkdir_command(char *key, void *data);
413extern int	Mount(char *, void *data);
414extern WINDOW	*openLayoutDialog(char *helpfile, char *title, int x, int y, int width, int height);
415extern ComposeObj *initLayoutDialog(WINDOW *win, Layout *layout, int x, int y, int *max);
416extern int	layoutDialogLoop(WINDOW *win, Layout *layout, ComposeObj **obj,
417				 int *n, int max, int *cbutton, int *cancel);
418
419extern WINDOW	*savescr(void);
420extern void	restorescr(WINDOW *w);
421extern char	*sstrncpy(char *dst, const char *src, int size);
422
423/* msg.c */
424extern Boolean	isDebug(void);
425extern void	msgInfo(const char *fmt, ...) __printf0like(1, 2);
426extern void	msgYap(const char *fmt, ...) __printflike(1, 2);
427extern void	msgWarn(const char *fmt, ...) __printflike(1, 2);
428extern void	msgDebug(const char *fmt, ...) __printflike(1, 2);
429extern void	msgError(const char *fmt, ...) __printflike(1, 2);
430extern void	msgFatal(const char *fmt, ...) __printflike(1, 2);
431extern void	msgConfirm(const char *fmt, ...) __printflike(1, 2);
432extern void	msgNotify(const char *fmt, ...) __printflike(1, 2);
433extern void	msgWeHaveOutput(const char *fmt, ...) __printflike(1, 2);
434extern int	msgYesNo(const char *fmt, ...) __printflike(1, 2);
435extern int	msgNoYes(const char *fmt, ...) __printflike(1, 2);
436extern char	*msgGetInput(char *buf, const char *fmt, ...) __printflike(2, 3);
437extern int	msgSimpleConfirm(const char *);
438extern int	msgSimpleNotify(const char *);
439
440/* pccard.c */
441extern void	pccardInitialize(void);
442
443/* system.c */
444extern void	systemInitialize(int argc, char **argv);
445extern void	systemShutdown(int status);
446extern int	execExecute(char *cmd, char *name);
447extern int	systemExecute(char *cmd);
448extern void	systemSuspendDialog(void);
449extern void	systemResumeDialog(void);
450extern int	systemDisplayHelp(char *file);
451extern char	*systemHelpFile(char *file, char *buf);
452extern void	systemChangeFont(const u_char font[]);
453extern void	systemChangeLang(char *lang);
454extern void	systemChangeTerminal(char *color, const u_char c_termcap[], char *mono, const u_char m_termcap[]);
455extern void	systemChangeScreenmap(const u_char newmap[]);
456extern int	vsystem(const char *fmt, ...) __printflike(1, 2);
457
458/* termcap.c */
459extern int	set_termcap(void);
460
461/* variable.c */
462extern void	variable_set(char *var, int dirty);
463extern void	variable_set2(char *name, char *value, int dirty);
464extern char 	*variable_get(char *var);
465extern int 	variable_cmp(char *var, char *value);
466extern void	variable_unset(char *var);
467extern char	*variable_get_value(char *var, char *prompt, int dirty);
468extern int 	variable_check(char *data);
469extern int 	variable_check2(char *data);
470extern int	dump_variables(dialogMenuItem *self);
471extern void	free_variables(void);
472extern void     pvariable_set(char *var);
473extern char     *pvariable_get(char *var);
474
475/* wizard.c */
476extern void	slice_wizard(Disk *d);
477
478/*
479 * Macros.  Please find a better place for us!
480 */
481#define DEVICE_INIT(d)		((d) != NULL ? (d)->init((d)) : (Boolean)0)
482#define DEVICE_GET(d, b, f)	((d) != NULL ? (d)->get((d), (b), (f)) : NULL)
483#define DEVICE_SHUTDOWN(d)	((d) != NULL ? (d)->shutdown((d)) : (void)0)
484
485#endif
486/* _SYSINSTALL_H_INCLUDE */
487