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

Reply via email to