3 * Jordan Hubbard. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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
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.
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
31 #ifndef _SADE_H_INCLUDE
32 #define _SADE_H_INCLUDE
34 #include <sys/types.h>
43 #include "ui_objects.h"
49 #if defined(__i386__) || defined(__amd64__)
54 #if defined(__i386__) || defined(__amd64__)
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 */
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!
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.
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"
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"
118 #define DEFAULT_TAPE_BLOCKSIZE "20"
120 /* One MB worth of blocks */
122 #define ONE_GIG (ONE_MEG * 1024)
124 /* Which selection attributes to use */
125 #define ATTR_SELECTED (ColorDisplay ? item_selected_attr : item_attr)
126 #define ATTR_TITLE button_active_attr
128 /* Handy strncpy() macro */
129 #define SAFE_STRCPY(to, from) sstrncpy((to), (from), sizeof (to) - 1)
133 typedef struct disk Disk;
134 typedef struct chunk Chunk;
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 */
142 typedef 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 */
151 /* An rc.conf variable */
152 typedef struct _variable {
153 struct _variable *next;
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)
163 /* A screen layout structure */
164 typedef struct _layout {
165 int y; /* x & Y co-ordinates */
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 */
184 /* A "device" from sade's point of view */
185 typedef struct _device {
186 char name[DEV_NAME_MAX];
191 Boolean (*init)(struct _device *dev);
192 FILE * (*get)(struct _device *dev, char *file, Boolean probe);
193 void (*shutdown)(struct _device *dev);
199 /* Some internal representations of partitions */
209 #define NEWFS_UFS_CMD "newfs"
210 #define NEWFS_MSDOS_CMD "newfs_msdos"
212 enum 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"
217 /* The longest set of custom command line arguments we'll pass. */
218 #define NEWFS_CMD_ARGS_MAX 256
220 typedef struct _part_info {
221 char mountpoint[FILENAME_MAX];
223 /* Is invocation of newfs desired? */
226 enum newfs_type newfs_type;
229 char user_options[NEWFS_CMD_ARGS_MAX];
230 Boolean acls; /* unused */
231 Boolean multilabel; /* unused */
239 char command[NEWFS_CMD_ARGS_MAX];
245 typedef struct _opt {
248 enum { OPT_IS_STRING, OPT_IS_INT, OPT_IS_FUNC, OPT_IS_VAR } type;
251 char *(*check)(void);
254 typedef int (*commandFunc)(char *key, void *data);
256 #define EXTRAS_FIELD_LEN 128
259 extern jmp_buf BailOut; /* Used to get the heck out */
260 extern int DebugFD; /* Where diagnostic output goes */
261 extern Boolean Fake; /* Don't actually modify anything - testing */
262 extern Boolean Restarting; /* Are we restarting sysinstall? */
263 extern Boolean SystemWasInstalled; /* Did we install it? */
264 extern Boolean RunningAsInit; /* Are we running stand-alone? */
265 extern Boolean DialogActive; /* Is the dialog() stuff up? */
266 extern Boolean ColorDisplay; /* Are we on a color display? */
267 extern Boolean OnVTY; /* On a syscons VTY? */
268 extern Variable *VarHead; /* The head of the variable chain */
269 extern int BootMgr; /* Which boot manager to use */
270 extern int StatusLine; /* Where to print our status messages */
271 #if defined(__i386__) || defined(__amd64__)
273 extern DMenu MenuIPLType; /* Type of IPL to write on the disk */
275 extern DMenu MenuMBRType; /* Type of MBR to write on the disk */
278 extern DMenu MenuMain; /* New main menu */
279 extern DMenu MenuDiskDevices; /* Disk type devices */
280 extern const char * StartName; /* Which name we were started as */
281 extern const char * ProgName; /* Program's proper name */
283 /* Important chunks. */
284 extern Chunk *HomeChunk;
285 extern Chunk *RootChunk;
286 extern Chunk *SwapChunk;
287 extern Chunk *TmpChunk;
288 extern Chunk *UsrChunk;
289 extern Chunk *VarChunk;
291 extern Chunk *EfiChunk;
294 /* Stuff from libdialog which isn't properly declared outside */
295 extern void display_helpfile(void);
296 extern void display_helpline(WINDOW *w, int y, int width);
301 extern void command_clear(void);
302 extern void command_sort(void);
303 extern void command_execute(void);
304 extern void command_shell_add(char *key, const char *fmt, ...) __printflike(2, 3);
305 extern void command_func_add(char *key, commandFunc func, void *data);
308 extern void configEnvironmentRC_conf(void);
309 extern void configRC_conf(void);
310 extern int configFstab(dialogMenuItem *self);
311 extern int configRC(dialogMenuItem *self);
312 extern int configWriteRC_conf(dialogMenuItem *self);
315 extern DMenu *deviceCreateMenu(DMenu *menu, DeviceType type, int (*hook)(dialogMenuItem *d),
316 int (*check)(dialogMenuItem *d));
317 extern void deviceGetAll(void);
318 extern void deviceReset(void);
319 extern void deviceRescan(void);
320 extern Device **deviceFind(char *name, DeviceType type);
321 extern Device **deviceFindDescr(char *name, char *desc, DeviceType class);
322 extern int deviceCount(Device **devs);
323 extern Device *new_device(char *name);
324 extern 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),
329 extern Boolean dummyInit(Device *dev);
330 extern FILE *dummyGet(Device *dev, char *dist, Boolean probe);
331 extern void dummyShutdown(Device *dev);
335 extern void diskPartition(Device *dev);
336 extern int diskPartitionEditor(dialogMenuItem *self);
338 extern int diskPartitionWrite(dialogMenuItem *self);
339 extern int diskGetSelectCount(Device ***devs);
342 extern int dispatchCommand(char *command);
343 extern int dispatch_load_floppy(dialogMenuItem *self);
344 extern int dispatch_load_file_int(int);
345 extern int dispatch_load_file(dialogMenuItem *self);
348 extern int dmenuDisplayFile(dialogMenuItem *tmp);
349 extern int dmenuSubmenu(dialogMenuItem *tmp);
350 extern int dmenuSystemCommand(dialogMenuItem *tmp);
351 extern int dmenuSystemCommandBox(dialogMenuItem *tmp);
352 extern int dmenuExit(dialogMenuItem *tmp);
353 extern int dmenuISetVariable(dialogMenuItem *tmp);
354 extern int dmenuSetVariable(dialogMenuItem *tmp);
355 extern int dmenuSetVariables(dialogMenuItem *tmp);
356 extern int dmenuToggleVariable(dialogMenuItem *tmp);
357 extern int dmenuSetFlag(dialogMenuItem *tmp);
358 extern int dmenuSetValue(dialogMenuItem *tmp);
359 extern Boolean dmenuOpen(DMenu *menu, int *choice, int *bscroll, int *curr, int *max, Boolean buttons);
360 extern Boolean dmenuOpenSimple(DMenu *menu, Boolean buttons);
361 extern int dmenuVarCheck(dialogMenuItem *item);
362 extern int dmenuVarsCheck(dialogMenuItem *item);
363 extern int dmenuFlagCheck(dialogMenuItem *item);
364 extern int dmenuRadioCheck(dialogMenuItem *item);
367 extern Boolean mediaCloseDOS(Device *dev, FILE *fp);
368 extern Boolean mediaInitDOS(Device *dev);
369 extern FILE *mediaGetDOS(Device *dev, char *file, Boolean probe);
370 extern void mediaShutdownDOS(Device *dev);
373 extern void globalsInit(void);
376 extern Boolean checkLabels(Boolean whinge);
377 extern int installCommit(dialogMenuItem *self);
378 extern int installCustomCommit(dialogMenuItem *self);
379 extern int installFilesystems(dialogMenuItem *self);
380 extern int installVarDefaults(dialogMenuItem *self);
381 extern void installEnvironment(void);
382 extern Boolean copySelf(void);
385 extern int kget(char *out);
388 extern int diskLabelEditor(dialogMenuItem *self);
389 extern int diskLabelCommit(dialogMenuItem *self);
392 extern Boolean file_readable(char *fname);
393 extern Boolean file_executable(char *fname);
394 extern Boolean directory_exists(const char *dirname);
395 extern char *root_bias(char *path);
396 extern char *itoa(int value);
397 extern char *string_concat(char *p1, char *p2);
398 extern char *string_concat3(char *p1, char *p2, char *p3);
399 extern char *string_prune(char *str);
400 extern char *string_skipwhite(char *str);
401 extern char *string_copy(char *s1, char *s2);
402 extern char *pathBaseName(const char *path);
403 extern void safe_free(void *ptr);
404 extern void *safe_malloc(size_t size);
405 extern void *safe_realloc(void *orig, size_t size);
406 extern 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);
411 extern void items_free(dialogMenuItem *list, int *curr, int *max);
412 extern int Mkdir(char *);
413 extern int Mkdir_command(char *key, void *data);
414 extern int Mount(char *, void *data);
415 extern WINDOW *openLayoutDialog(char *helpfile, char *title, int x, int y, int width, int height);
416 extern ComposeObj *initLayoutDialog(WINDOW *win, Layout *layout, int x, int y, int *max);
417 extern int layoutDialogLoop(WINDOW *win, Layout *layout, ComposeObj **obj,
418 int *n, int max, int *cbutton, int *cancel);
420 extern WINDOW *savescr(void);
421 extern void restorescr(WINDOW *w);
422 extern char *sstrncpy(char *dst, const char *src, int size);
425 extern Boolean isDebug(void);
426 extern void msgInfo(const char *fmt, ...) __printf0like(1, 2);
427 extern void msgYap(const char *fmt, ...) __printflike(1, 2);
428 extern void msgWarn(const char *fmt, ...) __printflike(1, 2);
429 extern void msgDebug(const char *fmt, ...) __printflike(1, 2);
430 extern void msgError(const char *fmt, ...) __printflike(1, 2);
431 extern void msgFatal(const char *fmt, ...) __printflike(1, 2);
432 extern void msgConfirm(const char *fmt, ...) __printflike(1, 2);
433 extern void msgNotify(const char *fmt, ...) __printflike(1, 2);
434 extern void msgWeHaveOutput(const char *fmt, ...) __printflike(1, 2);
435 extern int msgYesNo(const char *fmt, ...) __printflike(1, 2);
436 extern int msgNoYes(const char *fmt, ...) __printflike(1, 2);
437 extern char *msgGetInput(char *buf, const char *fmt, ...) __printflike(2, 3);
438 extern int msgSimpleConfirm(const char *);
439 extern int msgSimpleNotify(const char *);
442 extern void pccardInitialize(void);
445 extern void systemInitialize(int argc, char **argv);
446 extern void systemShutdown(int status);
447 extern int execExecute(char *cmd, char *name);
448 extern int systemExecute(char *cmd);
449 extern void systemSuspendDialog(void);
450 extern void systemResumeDialog(void);
451 extern int systemDisplayHelp(char *file);
452 extern char *systemHelpFile(char *file, char *buf);
453 extern void systemChangeFont(const u_char font[]);
454 extern void systemChangeLang(char *lang);
455 extern void systemChangeTerminal(char *color, const u_char c_termcap[], char *mono, const u_char m_termcap[]);
456 extern void systemChangeScreenmap(const u_char newmap[]);
457 extern int vsystem(const char *fmt, ...) __printflike(1, 2);
460 extern int set_termcap(void);
463 extern void variable_set(char *var, int dirty);
464 extern void variable_set2(char *name, char *value, int dirty);
465 extern char *variable_get(char *var);
466 extern int variable_cmp(char *var, char *value);
467 extern void variable_unset(char *var);
468 extern char *variable_get_value(char *var, char *prompt, int dirty);
469 extern int variable_check(char *data);
470 extern int variable_check2(char *data);
471 extern int dump_variables(dialogMenuItem *self);
472 extern void free_variables(void);
473 extern void pvariable_set(char *var);
474 extern char *pvariable_get(char *var);
477 extern void slice_wizard(Disk *d);
480 * Macros. Please find a better place for us!
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)
487 /* _SYSINSTALL_H_INCLUDE */