Hi Frans Please test the attached patch. Bastian -- Beam me up, Scotty! It ate my phaser!
Index: dasd.c =================================================================== --- dasd.c (revision 43505) +++ dasd.c (working copy) @@ -30,6 +30,7 @@ int key; char name[SYSFS_NAME_LEN]; char devtype[SYSFS_NAME_LEN]; + bool configured; bool online; enum channel_type type; }; @@ -56,7 +57,7 @@ SETUP, DETECT_CHANNELS, GET_CHANNEL, - CONFIRM, + FORMAT, WRITE, ERROR, FINISH @@ -123,7 +124,7 @@ attr_online = sysfs_get_device_attr (device, "online"); if (!attr_devtype || !attr_online) return WANT_NONE; - current = di_new (struct channel, 1); + current = di_new0 (struct channel, 1); if (!current) return WANT_ERROR; strncpy (current->name, device->name, sizeof (current->name)); @@ -194,13 +195,17 @@ struct channel *channel = value; char *buf = user_data; if (buf[0]) - strncat (buf, ", ", 512); - strncat (buf, channel->name, 512); + strncat (buf, ", ", 1024); + strncat (buf, channel->name, 1024); + if (channel->configured) + strncat (buf, " (configured)", 1024); + else if (channel->online) + strncat (buf, " (online)", 1024); } static enum state_wanted get_channel_select (void) { - char buf[512], *ptr; + char buf[1024], *ptr; int ret, dev; buf[0] = '\0'; @@ -250,8 +255,41 @@ return 0; } -static enum state_wanted confirm (void) +static enum state_wanted format (void) { + char buf[256], dev[128], *ptr; + int fd, ret; + struct hd_geometry drive_geo; + + debconf_subst (client, TEMPLATE_PREFIX "format", "device", channel_current->name); + debconf_set (client, TEMPLATE_PREFIX "format", "false"); + ret = my_debconf_input ("medium", TEMPLATE_PREFIX "format", &ptr); + + if (ret == 10) + return WANT_BACKUP; + if (strcmp (ptr, "true")) + return WANT_NEXT; + + snprintf (dev, sizeof (dev), "/dev/disk/by-path/ccw-%s", channel_current->name); + + fd = open (dev, O_RDONLY); + if (fd < 0) + return WANT_ERROR; + if (ioctl (fd, HDIO_GETGEO, &drive_geo) < 0) + return WANT_ERROR; + close (fd); + + debconf_subst (client, TEMPLATE_PREFIX "formatting", "device", channel_current->name); + debconf_progress_start (client, 0, drive_geo.cylinders - 1, TEMPLATE_PREFIX "formatting"); + + snprintf (buf, sizeof (buf), "dasdfmt -l LX%04x -b 4096 -m 1 -f %s -y", channel_device (channel_current->name), dev); + ret = di_exec_shell_full (buf, format_handler, NULL, NULL, NULL, NULL, NULL, NULL); + + debconf_progress_stop (client); + + if (ret) + return WANT_ERROR; + return WANT_NEXT; } @@ -274,6 +312,8 @@ sysfs_close_device (device); + channel_current->online = true; + snprintf (buf, sizeof (buf), SYSCONFIG_DIR "config-ccw-%s", channel_current->name); config = fopen (buf, "w"); if (!config) @@ -281,6 +321,8 @@ fclose (config); + channel_current->configured = true; + return WANT_NEXT; } @@ -310,8 +352,8 @@ case GET_CHANNEL: state_want = get_channel (); break; - case CONFIRM: - state_want = confirm (); + case FORMAT: + state_want = format (); break; case WRITE: state_want = write_dasd (); @@ -333,9 +375,9 @@ state = GET_CHANNEL; break; case GET_CHANNEL: - state = CONFIRM; + state = FORMAT; break; - case CONFIRM: + case FORMAT: state = WRITE; break; case WRITE:
Attachment:
signature.asc
Description: Digital signature