openvt: handle -ws correctly. By James Simmons <jsimmons AT infradead.org>
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 19 Apr 2008 03:44:45 +0000 (03:44 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 19 Apr 2008 03:44:45 +0000 (03:44 -0000)
function                                             old     new   delta
openvt_main                                          343     429     +86

console-tools/openvt.c

index 6f2aa19c40501d8e3a25f1290e3638dd454c4636..3bb0a9210e6944429e074d9f0db4a9bb2ba4a466 100644 (file)
@@ -107,6 +107,7 @@ int openvt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int openvt_main(int argc ATTRIBUTE_UNUSED, char **argv)
 {
        char vtname[sizeof(VC_FORMAT) + sizeof(int)*3];
+       struct vt_stat vtstat;
        char *str_c;
        int vtno;
        int flags;
@@ -137,6 +138,7 @@ int openvt_main(int argc ATTRIBUTE_UNUSED, char **argv)
        close(0);
        /*setsid(); - BAD IDEA: after we exit, child is SIGHUPed... */
        xopen(vtname, O_RDWR);
+       xioctl(0, VT_GETSTATE, &vtstat);        
 
        if (flags & OPT_s) {
                xioctl(0, VT_ACTIVATE, (void*)(ptrdiff_t)vtno);
@@ -163,9 +165,16 @@ int openvt_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        vfork_child(argv);
        if (flags & OPT_w) {
-               wait(NULL);
-// TODO: -ws handling should be here
+               /* We have only one child, wait for it */
+               safe_waitpid(-1, NULL, 0); /* loops on EINTR */
+               if (flags & OPT_s) {
+                       xioctl(0, VT_ACTIVATE, (void*)(ptrdiff_t)(vtstat.v_active));
+                       xioctl(0, VT_WAITACTIVE, (void*)(ptrdiff_t)(vtstat.v_active));
+                       // Compat: even with -c N (try to) disallocate:
+                       // # /usr/app/kbd-1.12/bin/openvt -f -c 9 -ws sleep 5
+                       // openvt: could not deallocate console 9
+                       xioctl(0, VT_DISALLOCATE, (void*)(ptrdiff_t)vtno);
+               }
        }
-
        return EXIT_SUCCESS;
 }