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$
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 */
281extern const char *	ProgName;		/* Program's proper name */
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	dmenuSetVariables(dialogMenuItem *tmp);
356extern int	dmenuToggleVariable(dialogMenuItem *tmp);
357extern int	dmenuSetFlag(dialogMenuItem *tmp);
358extern int	dmenuSetValue(dialogMenuItem *tmp);
359extern Boolean	dmenuOpen(DMenu *menu, int *choice, int *bscroll, int *curr, int *max, Boolean buttons);
360extern Boolean	dmenuOpenSimple(DMenu *menu, Boolean buttons);
361extern int	dmenuVarCheck(dialogMenuItem *item);
362extern int	dmenuVarsCheck(dialogMenuItem *item);
363extern int	dmenuFlagCheck(dialogMenuItem *item);
364extern int	dmenuRadioCheck(dialogMenuItem *item);
365
366/* dos.c */
367extern Boolean mediaCloseDOS(Device *dev, FILE *fp);
368extern Boolean mediaInitDOS(Device *dev);
369extern FILE    *mediaGetDOS(Device *dev, char *file, Boolean probe);
370extern void    mediaShutdownDOS(Device *dev);
371
372/* globals.c */
373extern void	globalsInit(void);
374
375/* install.c */
376extern Boolean	checkLabels(Boolean whinge);
377extern int	installCommit(dialogMenuItem *self);
378extern int	installCustomCommit(dialogMenuItem *self);
379extern int	installFilesystems(dialogMenuItem *self);
380extern int	installVarDefaults(dialogMenuItem *self);
381extern void	installEnvironment(void);
382extern Boolean	copySelf(void);
383
384/* kget.c */
385extern int	kget(char *out);
386
387/* label.c */
388extern int	diskLabelEditor(dialogMenuItem *self);
389extern int	diskLabelCommit(dialogMenuItem *self);
390
391/* misc.c */
392extern Boolean	file_readable(char *fname);
393extern Boolean	file_executable(char *fname);
394extern Boolean	directory_exists(const char *dirname);
395extern char	*root_bias(char *path);
396extern char	*itoa(int value);
397extern char	*string_concat(char *p1, char *p2);
398extern char	*string_concat3(char *p1, char *p2, char *p3);
399extern char	*string_prune(char *str);
400extern char	*string_skipwhite(char *str);
401extern char	*string_copy(char *s1, char *s2);
402extern char	*pathBaseName(const char *path);
403extern void	safe_free(void *ptr);
404extern void	*safe_malloc(size_t size);
405extern void	*safe_realloc(void *orig, size_t size);
406extern dialogMenuItem *item_add(dialogMenuItem *list, char *prompt, char *title,
407				int (*checked)(dialogMenuItem *self),
408				int (*fire)(dialogMenuItem *self),
409				void (*selected)(dialogMenuItem *self, int is_selected),
410				void *data, int *aux, int *curr, int *max);
411extern void	items_free(dialogMenuItem *list, int *curr, int *max);
412extern int	Mkdir(char *);
413extern int	Mkdir_command(char *key, void *data);
414extern int	Mount(char *, void *data);
415extern WINDOW	*openLayoutDialog(char *helpfile, char *title, int x, int y, int width, int height);
416extern ComposeObj *initLayoutDialog(WINDOW *win, Layout *layout, int x, int y, int *max);
417extern int	layoutDialogLoop(WINDOW *win, Layout *layout, ComposeObj **obj,
418				 int *n, int max, int *cbutton, int *cancel);
419
420extern WINDOW	*savescr(void);
421extern void	restorescr(WINDOW *w);
422extern char	*sstrncpy(char *dst, const char *src, int size);
423
424/* msg.c */
425extern Boolean	isDebug(void);
426extern void	msgInfo(const char *fmt, ...) __printf0like(1, 2);
427extern void	msgYap(const char *fmt, ...) __printflike(1, 2);
428extern void	msgWarn(const char *fmt, ...) __printflike(1, 2);
429extern void	msgDebug(const char *fmt, ...) __printflike(1, 2);
430extern void	msgError(const char *fmt, ...) __printflike(1, 2);
431extern void	msgFatal(const char *fmt, ...) __printflike(1, 2);
432extern void	msgConfirm(const char *fmt, ...) __printflike(1, 2);
433extern void	msgNotify(const char *fmt, ...) __printflike(1, 2);
434extern void	msgWeHaveOutput(const char *fmt, ...) __printflike(1, 2);
435extern int	msgYesNo(const char *fmt, ...) __printflike(1, 2);
436extern int	msgNoYes(const char *fmt, ...) __printflike(1, 2);
437extern char	*msgGetInput(char *buf, const char *fmt, ...) __printflike(2, 3);
438extern int	msgSimpleConfirm(const char *);
439extern int	msgSimpleNotify(const char *);
440
441/* pccard.c */
442extern void	pccardInitialize(void);
443
444/* system.c */
445extern void	systemInitialize(int argc, char **argv);
446extern void	systemShutdown(int status);
447extern int	execExecute(char *cmd, char *name);
448extern int	systemExecute(char *cmd);
449extern void	systemSuspendDialog(void);
450extern void	systemResumeDialog(void);
451extern int	systemDisplayHelp(char *file);
452extern char	*systemHelpFile(char *file, char *buf);
453extern void	systemChangeFont(const u_char font[]);
454extern void	systemChangeLang(char *lang);
455extern void	systemChangeTerminal(char *color, const u_char c_termcap[], char *mono, const u_char m_termcap[]);
456extern void	systemChangeScreenmap(const u_char newmap[]);
457extern int	vsystem(const char *fmt, ...) __printflike(1, 2);
458
459/* termcap.c */
460extern int	set_termcap(void);
461
462/* variable.c */
463extern void	variable_set(char *var, int dirty);
464extern void	variable_set2(char *name, char *value, int dirty);
465extern char 	*variable_get(char *var);
466extern int 	variable_cmp(char *var, char *value);
467extern void	variable_unset(char *var);
468extern char	*variable_get_value(char *var, char *prompt, int dirty);
469extern int 	variable_check(char *data);
470extern int 	variable_check2(char *data);
471extern int	dump_variables(dialogMenuItem *self);
472extern void	free_variables(void);
473extern void     pvariable_set(char *var);
474extern char     *pvariable_get(char *var);
475
476/* wizard.c */
477extern void	slice_wizard(Disk *d);
478
479/*
480 * Macros.  Please find a better place for us!
481 */
482#define DEVICE_INIT(d)		((d) != NULL ? (d)->init((d)) : (Boolean)0)
483#define DEVICE_GET(d, b, f)	((d) != NULL ? (d)->get((d), (b), (f)) : NULL)
484#define DEVICE_SHUTDOWN(d)	((d) != NULL ? (d)->shutdown((d)) : (void)0)
485
486#endif
487/* _SYSINSTALL_H_INCLUDE */
488