diff --git a/release/sysinstall/config.c b/release/sysinstall/config.c index f432c478867f..5a6eb7be8714 100644 --- a/release/sysinstall/config.c +++ b/release/sysinstall/config.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: config.c,v 1.63 1996/12/11 09:34:55 jkh Exp $ + * $Id: config.c,v 1.64 1996/12/12 22:38:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -47,6 +47,7 @@ static Chunk *chunk_list[MAX_CHUNKS]; static int nchunks; +static int rootdev_is_od; /* arg to sort */ static int @@ -85,6 +86,21 @@ chunk_sort(void) } } +static void +check_rootdev(Chunk **list, int n) +{ + int i; + Chunk *c; + + rootdev_is_od = 0; + for (i = 0; i < n; i++) { + c = *list++; + if (c->type == part && (c->flags & CHUNK_IS_ROOT) + && strncmp(c->disk->name, "od", 2) == 0) + rootdev_is_od = 1; + } +} + static char * name_of(Chunk *c1) { @@ -127,21 +143,33 @@ static char * fstype_short(Chunk *c1) { if (c1->type == part) { - if (c1->subtype != FS_SWAP) - return "rw"; + if (c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return "rw,noauto"; + else + return "rw"; + } else return "sw"; } - else if (c1->type == fat) - return "ro"; + else if (c1->type == fat) { + if (strncmp(c1->name, "od", 2) == 0) + return "ro,noauto"; + else + return "ro"; + } return "bog"; } static int seq_num(Chunk *c1) { - if (c1->type == part && c1->subtype != FS_SWAP) - return 1; + if (c1->type == part && c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return 0; + else + return 1; + } return 0; } @@ -199,6 +227,8 @@ configFstab(void) return DITEM_FAILURE; } + check_rootdev(chunk_list, nchunks); + /* Go for the burn */ msgDebug("Generating /etc/fstab file\n"); for (i = 0; i < nchunks; i++) diff --git a/release/sysinstall/devices.c b/release/sysinstall/devices.c index 35ae6e8c4b8a..61d0b9d1a901 100644 --- a/release/sysinstall/devices.c +++ b/release/sysinstall/devices.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: devices.c,v 1.53 1996/12/09 08:22:11 jkh Exp $ + * $Id: devices.c,v 1.54 1996/12/11 09:34:55 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -68,8 +69,10 @@ static struct { { DEVICE_TYPE_TAPE, "rwt0", "Wangtek tape drive" }, { DEVICE_TYPE_DISK, "sd", "SCSI disk device" }, { DEVICE_TYPE_DISK, "wd", "IDE/ESDI/MFM/ST506 disk device" }, + { DEVICE_TYPE_DISK, "od", "SCSI optical disk device" }, { DEVICE_TYPE_FLOPPY, "fd0", "floppy drive unit A" }, { DEVICE_TYPE_FLOPPY, "fd1", "floppy drive unit B" }, + { DEVICE_TYPE_FLOPPY, "od0", "SCSI optical disk/floppy format" }, { DEVICE_TYPE_NETWORK, "cuaa0", "%s on serial port 0 (COM1)" }, { DEVICE_TYPE_NETWORK, "cuaa1", "%s on serial port 1 (COM2)" }, { DEVICE_TYPE_NETWORK, "cuaa2", "%s on serial port 2 (COM3)" }, diff --git a/release/sysinstall/dispatch.c b/release/sysinstall/dispatch.c index 493f4d6c24b2..f5899cc693ac 100644 --- a/release/sysinstall/dispatch.c +++ b/release/sysinstall/dispatch.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dispatch.c,v 1.5 1996/10/01 12:13:10 jkh Exp $ + * $Id: dispatch.c,v 1.6 1996/11/04 12:56:20 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -83,6 +83,8 @@ static struct _word { { "mediaSetCPIOVerbosity", mediaSetCPIOVerbosity }, { "mediaGetType", mediaGetType }, { "optionsEditor", optionsEditor }, + { "addGroup", userAddGroup }, + { "addUser", userAddUser }, { NULL, NULL }, }; diff --git a/release/sysinstall/dist.c b/release/sysinstall/dist.c index 9fde44eada76..fc802d2263ff 100644 --- a/release/sysinstall/dist.c +++ b/release/sysinstall/dist.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dist.c,v 1.82 1996/12/11 18:23:17 jkh Exp $ + * $Id: dist.c,v 1.83 1996/12/12 08:33:36 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -411,7 +411,7 @@ distExtract(char *parent, Distribution *me) } else { /* Try to get the distribution as a single file */ - snprintf(buf, 512, "%s/%s.tgz", path, dist); + snprintf(buf, sizeof buf, "%s/%s.tgz", path, dist); /* * Passing TRUE as 3rd parm to get routine makes this a "probing" get, for which errors * are not considered too significant. @@ -421,7 +421,7 @@ distExtract(char *parent, Distribution *me) char *dir = root_bias(me[i].my_dir); msgNotify("Extracting %s into %s directory...", dist, dir); - status = mediaExtractDist(dir, fp); + status = mediaExtractDist(dir, dist, fp); fclose(fp); goto done; } @@ -452,7 +452,7 @@ distExtract(char *parent, Distribution *me) last_msg = 0; - snprintf(buf, 512, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); + snprintf(buf, sizeof buf, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); if (isDebug()) msgDebug("trying for piece %d of %d: %s\n", chunk + 1, numchunks, buf); fp = mediaDevice->get(mediaDevice, buf, FALSE); @@ -461,7 +461,7 @@ distExtract(char *parent, Distribution *me) "Aborting the transfer", buf); goto punt; } - snprintf(prompt, 80, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir)); + snprintf(prompt, sizeof prompt, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir)); dialog_gauge("Progress", prompt, 8, 15, 6, 50, (int)((float)(chunk + 1) / numchunks * 100)); while (1) { int seconds; diff --git a/release/sysinstall/media.c b/release/sysinstall/media.c index b8899b9558f9..4337d2708acc 100644 --- a/release/sysinstall/media.c +++ b/release/sysinstall/media.c @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: media.c,v 1.67 1996/12/11 09:35:03 jkh Exp $ + * $Id: media.c,v 1.68 1996/12/12 08:36:25 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -520,29 +520,36 @@ mediaExtractDistEnd(int zpid, int cpid) Boolean -mediaExtractDist(char *dir, FILE *fp) +mediaExtractDist(char *dir, char *dist, FILE *fp) { - int i, j, zpid, cpid, pfd[2]; + int i, j, total, seconds, zpid, cpid, pfd[2], qfd[2]; + char buf[BUFSIZ]; + struct timeval start, stop; if (!dir) dir = "/"; Mkdir(dir); chdir(dir); - pipe(pfd); + pipe(pfd); /* read end */ + pipe(qfd); /* write end */ zpid = fork(); if (!zpid) { char *gunzip = RunningAsInit ? "/stand/gunzip" : "/usr/bin/gunzip"; - dup2(fileno(fp), 0); fclose(fp); + fclose(fp); + close(qfd[1]); + dup2(qfd[0], 0); close(qfd[0]); + + close(pfd[0]); dup2(pfd[1], 1); close(pfd[1]); + if (DebugFD != -1) dup2(DebugFD, 2); else { close(2); open("/dev/null", O_WRONLY); } - close(pfd[0]); i = execl(gunzip, gunzip, 0); if (isDebug()) msgDebug("%s command returns %d status\n", gunzip, i); @@ -552,15 +559,16 @@ mediaExtractDist(char *dir, FILE *fp) if (!cpid) { char *cpio = RunningAsInit ? "/stand/cpio" : "/usr/bin/cpio"; - dup2(pfd[0], 0); close(pfd[0]); - fclose(fp); close(pfd[1]); + dup2(pfd[0], 0); close(pfd[0]); + close (qfd[0]); close(qfd[1]); + fclose(fp); if (DebugFD != -1) { dup2(DebugFD, 1); dup2(DebugFD, 2); } else { - close(1); open("/dev/null", O_WRONLY); + dup2(open("/dev/null", O_WRONLY), 1); dup2(1, 2); } if (strlen(cpioVerbosity())) @@ -571,8 +579,32 @@ mediaExtractDist(char *dir, FILE *fp) msgDebug("%s command returns %d status\n", cpio, i); exit(i); } - close(pfd[0]); - close(pfd[1]); + close(pfd[0]); close(pfd[1]); + close(qfd[0]); + + total = 0; + (void)gettimeofday(&start, (struct timezone *)0); + + while ((i = fread(buf, 1, BUFSIZ, fp)) > 0) { + if (write(qfd[1], buf, i) != i) { + msgDebug("Write error on transfer to cpio process, try of %d bytes\n", i); + break; + } + else { + (void)gettimeofday(&stop, (struct timezone *)0); + stop.tv_sec = stop.tv_sec - start.tv_sec; + stop.tv_usec = stop.tv_usec - start.tv_usec; + if (stop.tv_usec < 0) + stop.tv_sec--, stop.tv_usec += 1000000; + seconds = stop.tv_sec + (stop.tv_usec / 1000000.0); + if (!seconds) + seconds = 1; + total += i; + msgInfo("%10d bytes read from %s dist @ %.1f KB/sec.", + total, dist, (total / seconds) / 1024.0); + } + } + close(qfd[1]); i = waitpid(zpid, &j, 0); /* Don't check exit status - gunzip seems to return a bogus one! */ @@ -620,7 +652,9 @@ mediaSetFTPUserPass(dialogMenuItem *self) dialog_clear_norefresh(); if (variable_get_value(VAR_FTP_USER, "Please enter the username you wish to login as:")) { dialog_clear_norefresh(); + DialogInputAttrs |= DITEM_NO_ECHO; pass = variable_get_value(VAR_FTP_PASS, "Please enter the password for this user:"); + DialogInputAttrs &= ~DITEM_NO_ECHO; } else pass = NULL; diff --git a/release/sysinstall/sysinstall.h b/release/sysinstall/sysinstall.h index 3ee4ec85b32e..3a7c7fd69a62 100644 --- a/release/sysinstall/sysinstall.h +++ b/release/sysinstall/sysinstall.h @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: sysinstall.h,v 1.92 1996/12/11 18:23:19 jkh Exp $ + * $Id: sysinstall.h,v 1.93 1996/12/12 08:33:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -532,7 +532,7 @@ extern int mediaSetNFS(dialogMenuItem *self); extern int mediaSetFTPUserPass(dialogMenuItem *self); extern int mediaSetCPIOVerbosity(dialogMenuItem *self); extern int mediaGetType(dialogMenuItem *self); -extern Boolean mediaExtractDist(char *dir, FILE *fp); +extern Boolean mediaExtractDist(char *dir, char *dist, FILE *fp); extern Boolean mediaExtractDistBegin(char *dir, int *fd, int *zpid, int *cpic); extern Boolean mediaExtractDistEnd(int zpid, int cpid); extern Boolean mediaVerify(void); diff --git a/release/sysinstall/tcpip.c b/release/sysinstall/tcpip.c index 7e4a6e564311..96cbdb64e2ed 100644 --- a/release/sysinstall/tcpip.c +++ b/release/sysinstall/tcpip.c @@ -1,5 +1,5 @@ /* - * $Id: tcpip.c,v 1.51 1996/12/09 08:22:18 jkh Exp $ + * $Id: tcpip.c,v 1.52 1996/12/12 22:44:22 jkh Exp $ * * Copyright (c) 1995 * Gary J Palmer. All rights reserved. @@ -79,47 +79,47 @@ typedef struct _layout { } Layout; static Layout layout[] = { +#define LAYOUT_HOSTNAME 0 { 1, 2, 25, HOSTNAME_FIELD_LEN - 1, "Host:", "Your fully-qualified hostname, e.g. foo.bar.com", hostname, STRINGOBJ, NULL }, -#define LAYOUT_HOSTNAME 0 +#define LAYOUT_DOMAINNAME 1 { 1, 35, 20, HOSTNAME_FIELD_LEN - 1, "Domain:", "The name of the domain that your machine is in, e.g. bar.com", domainname, STRINGOBJ, NULL }, -#define LAYOUT_DOMAINNAME 1 +#define LAYOUT_GATEWAY 2 { 5, 2, 18, IPADDR_FIELD_LEN - 1, "Gateway:", "IP address of host forwarding packets to non-local destinations", gateway, STRINGOBJ, NULL }, -#define LAYOUT_GATEWAY 2 +#define LAYOUT_NAMESERVER 3 { 5, 35, 18, IPADDR_FIELD_LEN - 1, "Name server:", "IP address of your local DNS server", nameserver, STRINGOBJ, NULL }, -#define LAYOUT_NAMESERVER 3 +#define LAYOUT_IPADDR 4 { 10, 10, 18, IPADDR_FIELD_LEN - 1, "IP Address:", "The IP address to be used for this interface", ipaddr, STRINGOBJ, NULL }, -#define LAYOUT_IPADDR 4 +#define LAYOUT_NETMASK 5 { 10, 35, 18, IPADDR_FIELD_LEN - 1, "Netmask:", "The netmask for this interface, e.g. 0xffffff00 for a class C network", netmask, STRINGOBJ, NULL }, -#define LAYOUT_NETMASK 5 +#define LAYOUT_EXTRAS 6 { 14, 10, 37, HOSTNAME_FIELD_LEN - 1, "Extra options to ifconfig:", "Any interface-specific options to ifconfig you would like to add", extras, STRINGOBJ, NULL }, -#define LAYOUT_EXTRAS 6 +#define LAYOUT_OKBUTTON 7 { 19, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_OKBUTTON 7 +#define LAYOUT_CANCELBUTTON 8 { 19, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_CANCELBUTTON 8 { NULL }, }; @@ -314,7 +314,7 @@ tcpOpenDialog(Device *devp) if (n == LAYOUT_HOSTNAME) { /* We are in the Hostname field - calculate the domainname */ if ((tmp = index(hostname, '.')) != NULL) { - sstrncpy(domainname, tmp + 1, strlen(tmp + 1)); + sstrncpy(domainname, tmp + 1, strlen(tmp)); RefreshStringObj(layout[LAYOUT_DOMAINNAME].obj); } } diff --git a/release/sysinstall/user.c b/release/sysinstall/user.c index 523875251f4c..89f4ab8b5879 100644 --- a/release/sysinstall/user.c +++ b/release/sysinstall/user.c @@ -1,5 +1,5 @@ /* - * $Id: user.c,v 1.2 1996/12/09 14:08:26 joerg Exp $ + * $Id: user.c,v 1.3 1996/12/10 02:15:54 joerg Exp $ * * Copyright (c) 1996 * Jörg Wunsch. All rights reserved. @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -54,20 +55,21 @@ #define GID_FIELD_LEN 10 #define GMEMB_FIELD_LEN 64 -#define UNAME_FIELD_LEN 32 #define UID_FIELD_LEN 10 #define UGROUP_FIELD_LEN GNAME_FIELD_LEN #define GECOS_FIELD_LEN 64 #define UMEMB_FIELD_LEN GMEMB_FIELD_LEN #define HOMEDIR_FIELD_LEN 48 #define SHELL_FIELD_LEN 48 +#define PASSWD_FIELD_LEN 32 /* These are nasty, but they make the layout structure a lot easier ... */ static char gname[GNAME_FIELD_LEN], gid[GID_FIELD_LEN], gmemb[GMEMB_FIELD_LEN], - uname[UNAME_FIELD_LEN], + uname[UT_NAMESIZE + 1], + passwd[PASSWD_FIELD_LEN], uid[UID_FIELD_LEN], ugroup[UGROUP_FIELD_LEN], gecos[GECOS_FIELD_LEN], @@ -100,69 +102,71 @@ typedef struct _layout { /* The group configuration menu. */ static Layout groupLayout[] = { +#define LAYOUT_GNAME 0 { 4, 10, 20, GNAME_FIELD_LEN - 1, "Group name:", "The alphanumeric name of the new group (mandatory)", gname, STRINGOBJ, NULL }, -#define LAYOUT_GNAME 0 +#define LAYOUT_GID 1 { 4, 38, 10, GID_FIELD_LEN - 1, "GID:", "The numerical ID for this group (leave blank for automatic choice)", gid, STRINGOBJ, NULL }, -#define LAYOUT_GID 1 +#define LAYOUT_GMEMB 2 { 11, 10, 40, GMEMB_FIELD_LEN - 1, "Group members:", "Who belongs to this group (i.e., gets access rights for it)", gmemb, STRINGOBJ, NULL }, -#define LAYOUT_GMEMB 2 +#define LAYOUT_OKBUTTON 3 { 18, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_OKBUTTON 3 +#define LAYOUT_CANCELBUTTON 4 { 18, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_CANCELBUTTON 4 - { NULL }, }; /* The user configuration menu. */ static Layout userLayout[] = { -{ 3, 6, 20, UNAME_FIELD_LEN - 1, +#define LAYOUT_UNAME 0 +{ 3, 6, UT_NAMESIZE, UT_NAMESIZE + 4, "Login ID:", "The login name of the new user (mandatory)", uname, STRINGOBJ, NULL }, -#define LAYOUT_UNAME 0 -{ 3, 29, 10, UID_FIELD_LEN - 1, +#define LAYOUT_UID 1 +{ 3, 23, 8, UID_FIELD_LEN - 1, "UID:", "The numerical ID for this user (leave blank for automatic choice)", uid, STRINGOBJ, NULL }, -#define LAYOUT_UID 1 -{ 3, 43, 15, UGROUP_FIELD_LEN - 1, +#define LAYOUT_UGROUP 2 +{ 3, 33, 8, UGROUP_FIELD_LEN - 1, "Group:", "The login group name for this user (leave blank for automatic choice)", ugroup, STRINGOBJ, NULL }, -#define LAYOUT_UGROUP 2 +#define LAYOUT_PASSWD 3 +{ 3, 43, 15, PASSWD_FIELD_LEN - 1, + "Password:", "The password for this user (enter this field with care!)", + passwd, STRINGOBJ, NULL }, +#define LAYOUT_GECOS 4 { 8, 6, 33, GECOS_FIELD_LEN - 1, "Full name:", "The user's full name (comment)", gecos, STRINGOBJ, NULL }, -#define LAYOUT_GECOS 3 +#define LAYOUT_UMEMB 5 { 8, 43, 15, UMEMB_FIELD_LEN - 1, "Member groups:", "The groups this user belongs to (i.e. gets access rights for)", umemb, STRINGOBJ, NULL }, -#define LAYOUT_UMEMB 4 +#define LAYOUT_HOMEDIR 6 { 13, 6, 20, HOMEDIR_FIELD_LEN - 1, "Home directory:", "The user's home directory (leave blank for default)", homedir, STRINGOBJ, NULL }, -#define LAYOUT_HOMEDIR 5 +#define LAYOUT_SHELL 7 { 13, 29, 29, SHELL_FIELD_LEN - 1, "Login shell:", "The user's login shell (leave blank for default)", shell, STRINGOBJ, NULL }, -#define LAYOUT_SHELL 6 +#define LAYOUT_U_OKBUTTON 8 { 18, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_U_OKBUTTON 7 +#define LAYOUT_U_CANCELBUTTON 9 { 18, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_U_CANCELBUTTON 8 - { NULL }, }; @@ -661,7 +665,7 @@ static void addUser(WINDOW *ds_win) { char tmp[256], *msg; - int pfd[2], i, j; + int pfd[2], ipfd[2], i, j; ssize_t l; size_t amnt; pid_t pid; @@ -678,9 +682,11 @@ addUser(WINDOW *ds_win) msgNotify("Adding user \"%s\"...", uname); pipe (pfd); + pipe (ipfd); if ((pid = fork()) == 0) { /* The kiddy. */ + dup2(ipfd[0], 0); dup2(pfd[1], 1); dup2(pfd[1], 2); for (i = getdtablesize(); i > 2; i--) @@ -695,6 +701,10 @@ addUser(WINDOW *ds_win) ADDVEC(homedir, "-d"); ADDVEC(shell, "-s"); ADDVEC(umemb, "-G"); + if (passwd[0]) { + vec[i++] = "-h"; + vec[i++] = "0"; + } vec[i] = 0; chroot(variable_get(VAR_INSTALL_ROOT)); @@ -706,6 +716,11 @@ addUser(WINDOW *ds_win) { /* The oldie. */ close(pfd[1]); + close(ipfd[0]); + + if (passwd[0]) + write(ipfd[1], passwd, strlen(passwd)); + close(ipfd[1]); amnt = sizeof tmp; i = 0; while((l = read(pfd[0], &tmp[i], amnt)) > 0) @@ -746,7 +761,7 @@ addUser(WINDOW *ds_win) msgConfirm(msg, j); } } - else + else if (!passwd[0]) msgConfirm("You will need to enter a password for this user\n" "later, using the passwd(1) command from the shell.\n\n" "The account for `%s' is currently still disabled.", @@ -795,6 +810,7 @@ userAddUser(dialogMenuItem *self) CLEAR(uid); CLEAR(ugroup); CLEAR(gecos); + CLEAR(passwd); CLEAR(umemb); CLEAR(homedir); CLEAR(shell); @@ -804,6 +820,8 @@ userAddUser(dialogMenuItem *self) n = 0; #define lt userLayout[n] while (lt.help != NULL) { + if (n == LAYOUT_PASSWD) + DialogInputAttrs = DITEM_NO_ECHO; /* This will affect the new string object if set */ switch (lt.type) { case STRINGOBJ: lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, @@ -820,6 +838,7 @@ userAddUser(dialogMenuItem *self) msgFatal("Don't support this object yet!"); } AddObj(&obj, lt.type, (void *) lt.obj); + DialogInputAttrs = 0; n++; } max = n - 1; diff --git a/usr.sbin/sade/config.c b/usr.sbin/sade/config.c index f432c478867f..5a6eb7be8714 100644 --- a/usr.sbin/sade/config.c +++ b/usr.sbin/sade/config.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: config.c,v 1.63 1996/12/11 09:34:55 jkh Exp $ + * $Id: config.c,v 1.64 1996/12/12 22:38:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -47,6 +47,7 @@ static Chunk *chunk_list[MAX_CHUNKS]; static int nchunks; +static int rootdev_is_od; /* arg to sort */ static int @@ -85,6 +86,21 @@ chunk_sort(void) } } +static void +check_rootdev(Chunk **list, int n) +{ + int i; + Chunk *c; + + rootdev_is_od = 0; + for (i = 0; i < n; i++) { + c = *list++; + if (c->type == part && (c->flags & CHUNK_IS_ROOT) + && strncmp(c->disk->name, "od", 2) == 0) + rootdev_is_od = 1; + } +} + static char * name_of(Chunk *c1) { @@ -127,21 +143,33 @@ static char * fstype_short(Chunk *c1) { if (c1->type == part) { - if (c1->subtype != FS_SWAP) - return "rw"; + if (c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return "rw,noauto"; + else + return "rw"; + } else return "sw"; } - else if (c1->type == fat) - return "ro"; + else if (c1->type == fat) { + if (strncmp(c1->name, "od", 2) == 0) + return "ro,noauto"; + else + return "ro"; + } return "bog"; } static int seq_num(Chunk *c1) { - if (c1->type == part && c1->subtype != FS_SWAP) - return 1; + if (c1->type == part && c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return 0; + else + return 1; + } return 0; } @@ -199,6 +227,8 @@ configFstab(void) return DITEM_FAILURE; } + check_rootdev(chunk_list, nchunks); + /* Go for the burn */ msgDebug("Generating /etc/fstab file\n"); for (i = 0; i < nchunks; i++) diff --git a/usr.sbin/sade/devices.c b/usr.sbin/sade/devices.c index 35ae6e8c4b8a..61d0b9d1a901 100644 --- a/usr.sbin/sade/devices.c +++ b/usr.sbin/sade/devices.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: devices.c,v 1.53 1996/12/09 08:22:11 jkh Exp $ + * $Id: devices.c,v 1.54 1996/12/11 09:34:55 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -68,8 +69,10 @@ static struct { { DEVICE_TYPE_TAPE, "rwt0", "Wangtek tape drive" }, { DEVICE_TYPE_DISK, "sd", "SCSI disk device" }, { DEVICE_TYPE_DISK, "wd", "IDE/ESDI/MFM/ST506 disk device" }, + { DEVICE_TYPE_DISK, "od", "SCSI optical disk device" }, { DEVICE_TYPE_FLOPPY, "fd0", "floppy drive unit A" }, { DEVICE_TYPE_FLOPPY, "fd1", "floppy drive unit B" }, + { DEVICE_TYPE_FLOPPY, "od0", "SCSI optical disk/floppy format" }, { DEVICE_TYPE_NETWORK, "cuaa0", "%s on serial port 0 (COM1)" }, { DEVICE_TYPE_NETWORK, "cuaa1", "%s on serial port 1 (COM2)" }, { DEVICE_TYPE_NETWORK, "cuaa2", "%s on serial port 2 (COM3)" }, diff --git a/usr.sbin/sade/dispatch.c b/usr.sbin/sade/dispatch.c index 493f4d6c24b2..f5899cc693ac 100644 --- a/usr.sbin/sade/dispatch.c +++ b/usr.sbin/sade/dispatch.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dispatch.c,v 1.5 1996/10/01 12:13:10 jkh Exp $ + * $Id: dispatch.c,v 1.6 1996/11/04 12:56:20 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -83,6 +83,8 @@ static struct _word { { "mediaSetCPIOVerbosity", mediaSetCPIOVerbosity }, { "mediaGetType", mediaGetType }, { "optionsEditor", optionsEditor }, + { "addGroup", userAddGroup }, + { "addUser", userAddUser }, { NULL, NULL }, }; diff --git a/usr.sbin/sade/sade.h b/usr.sbin/sade/sade.h index 3ee4ec85b32e..3a7c7fd69a62 100644 --- a/usr.sbin/sade/sade.h +++ b/usr.sbin/sade/sade.h @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: sysinstall.h,v 1.92 1996/12/11 18:23:19 jkh Exp $ + * $Id: sysinstall.h,v 1.93 1996/12/12 08:33:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -532,7 +532,7 @@ extern int mediaSetNFS(dialogMenuItem *self); extern int mediaSetFTPUserPass(dialogMenuItem *self); extern int mediaSetCPIOVerbosity(dialogMenuItem *self); extern int mediaGetType(dialogMenuItem *self); -extern Boolean mediaExtractDist(char *dir, FILE *fp); +extern Boolean mediaExtractDist(char *dir, char *dist, FILE *fp); extern Boolean mediaExtractDistBegin(char *dir, int *fd, int *zpid, int *cpic); extern Boolean mediaExtractDistEnd(int zpid, int cpid); extern Boolean mediaVerify(void); diff --git a/usr.sbin/sysinstall/config.c b/usr.sbin/sysinstall/config.c index f432c478867f..5a6eb7be8714 100644 --- a/usr.sbin/sysinstall/config.c +++ b/usr.sbin/sysinstall/config.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: config.c,v 1.63 1996/12/11 09:34:55 jkh Exp $ + * $Id: config.c,v 1.64 1996/12/12 22:38:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -47,6 +47,7 @@ static Chunk *chunk_list[MAX_CHUNKS]; static int nchunks; +static int rootdev_is_od; /* arg to sort */ static int @@ -85,6 +86,21 @@ chunk_sort(void) } } +static void +check_rootdev(Chunk **list, int n) +{ + int i; + Chunk *c; + + rootdev_is_od = 0; + for (i = 0; i < n; i++) { + c = *list++; + if (c->type == part && (c->flags & CHUNK_IS_ROOT) + && strncmp(c->disk->name, "od", 2) == 0) + rootdev_is_od = 1; + } +} + static char * name_of(Chunk *c1) { @@ -127,21 +143,33 @@ static char * fstype_short(Chunk *c1) { if (c1->type == part) { - if (c1->subtype != FS_SWAP) - return "rw"; + if (c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return "rw,noauto"; + else + return "rw"; + } else return "sw"; } - else if (c1->type == fat) - return "ro"; + else if (c1->type == fat) { + if (strncmp(c1->name, "od", 2) == 0) + return "ro,noauto"; + else + return "ro"; + } return "bog"; } static int seq_num(Chunk *c1) { - if (c1->type == part && c1->subtype != FS_SWAP) - return 1; + if (c1->type == part && c1->subtype != FS_SWAP) { + if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0) + return 0; + else + return 1; + } return 0; } @@ -199,6 +227,8 @@ configFstab(void) return DITEM_FAILURE; } + check_rootdev(chunk_list, nchunks); + /* Go for the burn */ msgDebug("Generating /etc/fstab file\n"); for (i = 0; i < nchunks; i++) diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c index 35ae6e8c4b8a..61d0b9d1a901 100644 --- a/usr.sbin/sysinstall/devices.c +++ b/usr.sbin/sysinstall/devices.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: devices.c,v 1.53 1996/12/09 08:22:11 jkh Exp $ + * $Id: devices.c,v 1.54 1996/12/11 09:34:55 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -68,8 +69,10 @@ static struct { { DEVICE_TYPE_TAPE, "rwt0", "Wangtek tape drive" }, { DEVICE_TYPE_DISK, "sd", "SCSI disk device" }, { DEVICE_TYPE_DISK, "wd", "IDE/ESDI/MFM/ST506 disk device" }, + { DEVICE_TYPE_DISK, "od", "SCSI optical disk device" }, { DEVICE_TYPE_FLOPPY, "fd0", "floppy drive unit A" }, { DEVICE_TYPE_FLOPPY, "fd1", "floppy drive unit B" }, + { DEVICE_TYPE_FLOPPY, "od0", "SCSI optical disk/floppy format" }, { DEVICE_TYPE_NETWORK, "cuaa0", "%s on serial port 0 (COM1)" }, { DEVICE_TYPE_NETWORK, "cuaa1", "%s on serial port 1 (COM2)" }, { DEVICE_TYPE_NETWORK, "cuaa2", "%s on serial port 2 (COM3)" }, diff --git a/usr.sbin/sysinstall/dispatch.c b/usr.sbin/sysinstall/dispatch.c index 493f4d6c24b2..f5899cc693ac 100644 --- a/usr.sbin/sysinstall/dispatch.c +++ b/usr.sbin/sysinstall/dispatch.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dispatch.c,v 1.5 1996/10/01 12:13:10 jkh Exp $ + * $Id: dispatch.c,v 1.6 1996/11/04 12:56:20 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -83,6 +83,8 @@ static struct _word { { "mediaSetCPIOVerbosity", mediaSetCPIOVerbosity }, { "mediaGetType", mediaGetType }, { "optionsEditor", optionsEditor }, + { "addGroup", userAddGroup }, + { "addUser", userAddUser }, { NULL, NULL }, }; diff --git a/usr.sbin/sysinstall/dist.c b/usr.sbin/sysinstall/dist.c index 9fde44eada76..fc802d2263ff 100644 --- a/usr.sbin/sysinstall/dist.c +++ b/usr.sbin/sysinstall/dist.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: dist.c,v 1.82 1996/12/11 18:23:17 jkh Exp $ + * $Id: dist.c,v 1.83 1996/12/12 08:33:36 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -411,7 +411,7 @@ distExtract(char *parent, Distribution *me) } else { /* Try to get the distribution as a single file */ - snprintf(buf, 512, "%s/%s.tgz", path, dist); + snprintf(buf, sizeof buf, "%s/%s.tgz", path, dist); /* * Passing TRUE as 3rd parm to get routine makes this a "probing" get, for which errors * are not considered too significant. @@ -421,7 +421,7 @@ distExtract(char *parent, Distribution *me) char *dir = root_bias(me[i].my_dir); msgNotify("Extracting %s into %s directory...", dist, dir); - status = mediaExtractDist(dir, fp); + status = mediaExtractDist(dir, dist, fp); fclose(fp); goto done; } @@ -452,7 +452,7 @@ distExtract(char *parent, Distribution *me) last_msg = 0; - snprintf(buf, 512, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); + snprintf(buf, sizeof buf, "%s/%s.%c%c", path, dist, (chunk / 26) + 'a', (chunk % 26) + 'a'); if (isDebug()) msgDebug("trying for piece %d of %d: %s\n", chunk + 1, numchunks, buf); fp = mediaDevice->get(mediaDevice, buf, FALSE); @@ -461,7 +461,7 @@ distExtract(char *parent, Distribution *me) "Aborting the transfer", buf); goto punt; } - snprintf(prompt, 80, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir)); + snprintf(prompt, sizeof prompt, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir)); dialog_gauge("Progress", prompt, 8, 15, 6, 50, (int)((float)(chunk + 1) / numchunks * 100)); while (1) { int seconds; diff --git a/usr.sbin/sysinstall/media.c b/usr.sbin/sysinstall/media.c index b8899b9558f9..4337d2708acc 100644 --- a/usr.sbin/sysinstall/media.c +++ b/usr.sbin/sysinstall/media.c @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: media.c,v 1.67 1996/12/11 09:35:03 jkh Exp $ + * $Id: media.c,v 1.68 1996/12/12 08:36:25 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -520,29 +520,36 @@ mediaExtractDistEnd(int zpid, int cpid) Boolean -mediaExtractDist(char *dir, FILE *fp) +mediaExtractDist(char *dir, char *dist, FILE *fp) { - int i, j, zpid, cpid, pfd[2]; + int i, j, total, seconds, zpid, cpid, pfd[2], qfd[2]; + char buf[BUFSIZ]; + struct timeval start, stop; if (!dir) dir = "/"; Mkdir(dir); chdir(dir); - pipe(pfd); + pipe(pfd); /* read end */ + pipe(qfd); /* write end */ zpid = fork(); if (!zpid) { char *gunzip = RunningAsInit ? "/stand/gunzip" : "/usr/bin/gunzip"; - dup2(fileno(fp), 0); fclose(fp); + fclose(fp); + close(qfd[1]); + dup2(qfd[0], 0); close(qfd[0]); + + close(pfd[0]); dup2(pfd[1], 1); close(pfd[1]); + if (DebugFD != -1) dup2(DebugFD, 2); else { close(2); open("/dev/null", O_WRONLY); } - close(pfd[0]); i = execl(gunzip, gunzip, 0); if (isDebug()) msgDebug("%s command returns %d status\n", gunzip, i); @@ -552,15 +559,16 @@ mediaExtractDist(char *dir, FILE *fp) if (!cpid) { char *cpio = RunningAsInit ? "/stand/cpio" : "/usr/bin/cpio"; - dup2(pfd[0], 0); close(pfd[0]); - fclose(fp); close(pfd[1]); + dup2(pfd[0], 0); close(pfd[0]); + close (qfd[0]); close(qfd[1]); + fclose(fp); if (DebugFD != -1) { dup2(DebugFD, 1); dup2(DebugFD, 2); } else { - close(1); open("/dev/null", O_WRONLY); + dup2(open("/dev/null", O_WRONLY), 1); dup2(1, 2); } if (strlen(cpioVerbosity())) @@ -571,8 +579,32 @@ mediaExtractDist(char *dir, FILE *fp) msgDebug("%s command returns %d status\n", cpio, i); exit(i); } - close(pfd[0]); - close(pfd[1]); + close(pfd[0]); close(pfd[1]); + close(qfd[0]); + + total = 0; + (void)gettimeofday(&start, (struct timezone *)0); + + while ((i = fread(buf, 1, BUFSIZ, fp)) > 0) { + if (write(qfd[1], buf, i) != i) { + msgDebug("Write error on transfer to cpio process, try of %d bytes\n", i); + break; + } + else { + (void)gettimeofday(&stop, (struct timezone *)0); + stop.tv_sec = stop.tv_sec - start.tv_sec; + stop.tv_usec = stop.tv_usec - start.tv_usec; + if (stop.tv_usec < 0) + stop.tv_sec--, stop.tv_usec += 1000000; + seconds = stop.tv_sec + (stop.tv_usec / 1000000.0); + if (!seconds) + seconds = 1; + total += i; + msgInfo("%10d bytes read from %s dist @ %.1f KB/sec.", + total, dist, (total / seconds) / 1024.0); + } + } + close(qfd[1]); i = waitpid(zpid, &j, 0); /* Don't check exit status - gunzip seems to return a bogus one! */ @@ -620,7 +652,9 @@ mediaSetFTPUserPass(dialogMenuItem *self) dialog_clear_norefresh(); if (variable_get_value(VAR_FTP_USER, "Please enter the username you wish to login as:")) { dialog_clear_norefresh(); + DialogInputAttrs |= DITEM_NO_ECHO; pass = variable_get_value(VAR_FTP_PASS, "Please enter the password for this user:"); + DialogInputAttrs &= ~DITEM_NO_ECHO; } else pass = NULL; diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h index 3ee4ec85b32e..3a7c7fd69a62 100644 --- a/usr.sbin/sysinstall/sysinstall.h +++ b/usr.sbin/sysinstall/sysinstall.h @@ -4,7 +4,7 @@ * This is probably the last attempt in the `sysinstall' line, the next * generation being slated to essentially a complete rewrite. * - * $Id: sysinstall.h,v 1.92 1996/12/11 18:23:19 jkh Exp $ + * $Id: sysinstall.h,v 1.93 1996/12/12 08:33:38 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -532,7 +532,7 @@ extern int mediaSetNFS(dialogMenuItem *self); extern int mediaSetFTPUserPass(dialogMenuItem *self); extern int mediaSetCPIOVerbosity(dialogMenuItem *self); extern int mediaGetType(dialogMenuItem *self); -extern Boolean mediaExtractDist(char *dir, FILE *fp); +extern Boolean mediaExtractDist(char *dir, char *dist, FILE *fp); extern Boolean mediaExtractDistBegin(char *dir, int *fd, int *zpid, int *cpic); extern Boolean mediaExtractDistEnd(int zpid, int cpid); extern Boolean mediaVerify(void); diff --git a/usr.sbin/sysinstall/tcpip.c b/usr.sbin/sysinstall/tcpip.c index 7e4a6e564311..96cbdb64e2ed 100644 --- a/usr.sbin/sysinstall/tcpip.c +++ b/usr.sbin/sysinstall/tcpip.c @@ -1,5 +1,5 @@ /* - * $Id: tcpip.c,v 1.51 1996/12/09 08:22:18 jkh Exp $ + * $Id: tcpip.c,v 1.52 1996/12/12 22:44:22 jkh Exp $ * * Copyright (c) 1995 * Gary J Palmer. All rights reserved. @@ -79,47 +79,47 @@ typedef struct _layout { } Layout; static Layout layout[] = { +#define LAYOUT_HOSTNAME 0 { 1, 2, 25, HOSTNAME_FIELD_LEN - 1, "Host:", "Your fully-qualified hostname, e.g. foo.bar.com", hostname, STRINGOBJ, NULL }, -#define LAYOUT_HOSTNAME 0 +#define LAYOUT_DOMAINNAME 1 { 1, 35, 20, HOSTNAME_FIELD_LEN - 1, "Domain:", "The name of the domain that your machine is in, e.g. bar.com", domainname, STRINGOBJ, NULL }, -#define LAYOUT_DOMAINNAME 1 +#define LAYOUT_GATEWAY 2 { 5, 2, 18, IPADDR_FIELD_LEN - 1, "Gateway:", "IP address of host forwarding packets to non-local destinations", gateway, STRINGOBJ, NULL }, -#define LAYOUT_GATEWAY 2 +#define LAYOUT_NAMESERVER 3 { 5, 35, 18, IPADDR_FIELD_LEN - 1, "Name server:", "IP address of your local DNS server", nameserver, STRINGOBJ, NULL }, -#define LAYOUT_NAMESERVER 3 +#define LAYOUT_IPADDR 4 { 10, 10, 18, IPADDR_FIELD_LEN - 1, "IP Address:", "The IP address to be used for this interface", ipaddr, STRINGOBJ, NULL }, -#define LAYOUT_IPADDR 4 +#define LAYOUT_NETMASK 5 { 10, 35, 18, IPADDR_FIELD_LEN - 1, "Netmask:", "The netmask for this interface, e.g. 0xffffff00 for a class C network", netmask, STRINGOBJ, NULL }, -#define LAYOUT_NETMASK 5 +#define LAYOUT_EXTRAS 6 { 14, 10, 37, HOSTNAME_FIELD_LEN - 1, "Extra options to ifconfig:", "Any interface-specific options to ifconfig you would like to add", extras, STRINGOBJ, NULL }, -#define LAYOUT_EXTRAS 6 +#define LAYOUT_OKBUTTON 7 { 19, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_OKBUTTON 7 +#define LAYOUT_CANCELBUTTON 8 { 19, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_CANCELBUTTON 8 { NULL }, }; @@ -314,7 +314,7 @@ tcpOpenDialog(Device *devp) if (n == LAYOUT_HOSTNAME) { /* We are in the Hostname field - calculate the domainname */ if ((tmp = index(hostname, '.')) != NULL) { - sstrncpy(domainname, tmp + 1, strlen(tmp + 1)); + sstrncpy(domainname, tmp + 1, strlen(tmp)); RefreshStringObj(layout[LAYOUT_DOMAINNAME].obj); } } diff --git a/usr.sbin/sysinstall/user.c b/usr.sbin/sysinstall/user.c index 523875251f4c..89f4ab8b5879 100644 --- a/usr.sbin/sysinstall/user.c +++ b/usr.sbin/sysinstall/user.c @@ -1,5 +1,5 @@ /* - * $Id: user.c,v 1.2 1996/12/09 14:08:26 joerg Exp $ + * $Id: user.c,v 1.3 1996/12/10 02:15:54 joerg Exp $ * * Copyright (c) 1996 * Jörg Wunsch. All rights reserved. @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -54,20 +55,21 @@ #define GID_FIELD_LEN 10 #define GMEMB_FIELD_LEN 64 -#define UNAME_FIELD_LEN 32 #define UID_FIELD_LEN 10 #define UGROUP_FIELD_LEN GNAME_FIELD_LEN #define GECOS_FIELD_LEN 64 #define UMEMB_FIELD_LEN GMEMB_FIELD_LEN #define HOMEDIR_FIELD_LEN 48 #define SHELL_FIELD_LEN 48 +#define PASSWD_FIELD_LEN 32 /* These are nasty, but they make the layout structure a lot easier ... */ static char gname[GNAME_FIELD_LEN], gid[GID_FIELD_LEN], gmemb[GMEMB_FIELD_LEN], - uname[UNAME_FIELD_LEN], + uname[UT_NAMESIZE + 1], + passwd[PASSWD_FIELD_LEN], uid[UID_FIELD_LEN], ugroup[UGROUP_FIELD_LEN], gecos[GECOS_FIELD_LEN], @@ -100,69 +102,71 @@ typedef struct _layout { /* The group configuration menu. */ static Layout groupLayout[] = { +#define LAYOUT_GNAME 0 { 4, 10, 20, GNAME_FIELD_LEN - 1, "Group name:", "The alphanumeric name of the new group (mandatory)", gname, STRINGOBJ, NULL }, -#define LAYOUT_GNAME 0 +#define LAYOUT_GID 1 { 4, 38, 10, GID_FIELD_LEN - 1, "GID:", "The numerical ID for this group (leave blank for automatic choice)", gid, STRINGOBJ, NULL }, -#define LAYOUT_GID 1 +#define LAYOUT_GMEMB 2 { 11, 10, 40, GMEMB_FIELD_LEN - 1, "Group members:", "Who belongs to this group (i.e., gets access rights for it)", gmemb, STRINGOBJ, NULL }, -#define LAYOUT_GMEMB 2 +#define LAYOUT_OKBUTTON 3 { 18, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_OKBUTTON 3 +#define LAYOUT_CANCELBUTTON 4 { 18, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_CANCELBUTTON 4 - { NULL }, }; /* The user configuration menu. */ static Layout userLayout[] = { -{ 3, 6, 20, UNAME_FIELD_LEN - 1, +#define LAYOUT_UNAME 0 +{ 3, 6, UT_NAMESIZE, UT_NAMESIZE + 4, "Login ID:", "The login name of the new user (mandatory)", uname, STRINGOBJ, NULL }, -#define LAYOUT_UNAME 0 -{ 3, 29, 10, UID_FIELD_LEN - 1, +#define LAYOUT_UID 1 +{ 3, 23, 8, UID_FIELD_LEN - 1, "UID:", "The numerical ID for this user (leave blank for automatic choice)", uid, STRINGOBJ, NULL }, -#define LAYOUT_UID 1 -{ 3, 43, 15, UGROUP_FIELD_LEN - 1, +#define LAYOUT_UGROUP 2 +{ 3, 33, 8, UGROUP_FIELD_LEN - 1, "Group:", "The login group name for this user (leave blank for automatic choice)", ugroup, STRINGOBJ, NULL }, -#define LAYOUT_UGROUP 2 +#define LAYOUT_PASSWD 3 +{ 3, 43, 15, PASSWD_FIELD_LEN - 1, + "Password:", "The password for this user (enter this field with care!)", + passwd, STRINGOBJ, NULL }, +#define LAYOUT_GECOS 4 { 8, 6, 33, GECOS_FIELD_LEN - 1, "Full name:", "The user's full name (comment)", gecos, STRINGOBJ, NULL }, -#define LAYOUT_GECOS 3 +#define LAYOUT_UMEMB 5 { 8, 43, 15, UMEMB_FIELD_LEN - 1, "Member groups:", "The groups this user belongs to (i.e. gets access rights for)", umemb, STRINGOBJ, NULL }, -#define LAYOUT_UMEMB 4 +#define LAYOUT_HOMEDIR 6 { 13, 6, 20, HOMEDIR_FIELD_LEN - 1, "Home directory:", "The user's home directory (leave blank for default)", homedir, STRINGOBJ, NULL }, -#define LAYOUT_HOMEDIR 5 +#define LAYOUT_SHELL 7 { 13, 29, 29, SHELL_FIELD_LEN - 1, "Login shell:", "The user's login shell (leave blank for default)", shell, STRINGOBJ, NULL }, -#define LAYOUT_SHELL 6 +#define LAYOUT_U_OKBUTTON 8 { 18, 15, 0, 0, "OK", "Select this if you are happy with these settings", &okbutton, BUTTONOBJ, NULL }, -#define LAYOUT_U_OKBUTTON 7 +#define LAYOUT_U_CANCELBUTTON 9 { 18, 35, 0, 0, "CANCEL", "Select this if you wish to cancel this screen", &cancelbutton, BUTTONOBJ, NULL }, -#define LAYOUT_U_CANCELBUTTON 8 - { NULL }, }; @@ -661,7 +665,7 @@ static void addUser(WINDOW *ds_win) { char tmp[256], *msg; - int pfd[2], i, j; + int pfd[2], ipfd[2], i, j; ssize_t l; size_t amnt; pid_t pid; @@ -678,9 +682,11 @@ addUser(WINDOW *ds_win) msgNotify("Adding user \"%s\"...", uname); pipe (pfd); + pipe (ipfd); if ((pid = fork()) == 0) { /* The kiddy. */ + dup2(ipfd[0], 0); dup2(pfd[1], 1); dup2(pfd[1], 2); for (i = getdtablesize(); i > 2; i--) @@ -695,6 +701,10 @@ addUser(WINDOW *ds_win) ADDVEC(homedir, "-d"); ADDVEC(shell, "-s"); ADDVEC(umemb, "-G"); + if (passwd[0]) { + vec[i++] = "-h"; + vec[i++] = "0"; + } vec[i] = 0; chroot(variable_get(VAR_INSTALL_ROOT)); @@ -706,6 +716,11 @@ addUser(WINDOW *ds_win) { /* The oldie. */ close(pfd[1]); + close(ipfd[0]); + + if (passwd[0]) + write(ipfd[1], passwd, strlen(passwd)); + close(ipfd[1]); amnt = sizeof tmp; i = 0; while((l = read(pfd[0], &tmp[i], amnt)) > 0) @@ -746,7 +761,7 @@ addUser(WINDOW *ds_win) msgConfirm(msg, j); } } - else + else if (!passwd[0]) msgConfirm("You will need to enter a password for this user\n" "later, using the passwd(1) command from the shell.\n\n" "The account for `%s' is currently still disabled.", @@ -795,6 +810,7 @@ userAddUser(dialogMenuItem *self) CLEAR(uid); CLEAR(ugroup); CLEAR(gecos); + CLEAR(passwd); CLEAR(umemb); CLEAR(homedir); CLEAR(shell); @@ -804,6 +820,8 @@ userAddUser(dialogMenuItem *self) n = 0; #define lt userLayout[n] while (lt.help != NULL) { + if (n == LAYOUT_PASSWD) + DialogInputAttrs = DITEM_NO_ECHO; /* This will affect the new string object if set */ switch (lt.type) { case STRINGOBJ: lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, @@ -820,6 +838,7 @@ userAddUser(dialogMenuItem *self) msgFatal("Don't support this object yet!"); } AddObj(&obj, lt.type, (void *) lt.obj); + DialogInputAttrs = 0; n++; } max = n - 1;