Re: About-me-password backend



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Great, thanks for the tip!

Best regards,

Johannes H. Jensen
deworks


On 11. apr. 2006, at 14:36:08, Gustavo J. A. M. Carneiro wrote:

  Note that glib already has g_child_watch_add, which is a lot simpler
and safer to use than signal(). In the callback you can see what status
the child returned and if it received a signal instead.

  Regards.

On Ter, 2006-04-11 at 09:42 +0100, Darren Kenny wrote:
Hi Johannes,

The most correct way to handle the status of a child process is to catch the unix signal 18 - SIGCHLD - this should be fired by the OS (assuming
unix based) should the fork/execed process exit.

So you need to set up a signal handler for SIGCHLD, before you enter the
processing loop, and have this signal handler store the pid of the
passwd process so that later you can check if this is the one that exited.

Meanwhile, a loop with a read on an file descriptor (e.g. waiting for
the "Password: " string from passwd) will be interrupted due to the
SIGCHLD and return -1, and errno will be set to EINTR - if you check for
these conditions and then call the child_exited call then you should
know if passwd exited.

For example:

    signal( SIGCHLD, reapChildProcess );
    while ( ! done ) {
        if (read(...) < 0 ) {
if ( errno == EINTR && child_exitied( passwd_pid) == TRUE ) { done = TRUE; /* or whatever you want to do to exit gracefully */ continue; /* or break if you want to force exit of the loop */
            }
        }
        /* normal processing */
    }


(BTW, I'm assuming you don't have multiple processes forked, if you do you probably need to store the last N processed exited for check to work).

There should be loads of examples of this type of thing on the net...

Darren.

Johannes H. Jensen wrote:
Dear almighty GNOME hackers, I'm in need of some pointers!

I'm currently hacking on the about-me password dialog (see #321567),
which is spawning /usr/bin/passwd to authenticate and change the
password. In the new dialog, I'm dividing the process in two, so that
the user has to authenticate with his current password first (which
spawns passwd to verify). If passwd doesn't complain and prompts for
the new password, he can enter his new password, retype it and hit
"Change password". When he hits the button, some time has elapsed
since he first authenticated (and thus passwd was spawned).

Now my question is, what happens if passwd suddenly dies during that
time period? Is it likely it will? If so, what's the best way to
periodically(?) ensure that the process is running? Check every n
seconds with waitpid() in the main loop? As far as I can see, this is how it's done in the current version - wait_child() is called every 4
seconds to check what the backend is doing...

Any pointers greatly appreciated :)

Btw, a more detailed mockup of the program/process flow can be found
at http://joh.deworks.net/password-dialog/GnomeAboutMePassword.html

Best regards,

Johannes H. Jensen
deworks


_______________________________________________
desktop-devel-list mailing list
desktop-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/desktop-devel-list
_______________________________________________
desktop-devel-list mailing list
desktop-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/desktop-devel-list
--
Gustavo J. A. M. Carneiro
<gjc inescporto pt> <gustavo users sourceforge net>
The universe is always one step beyond logic.



-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD8DBQFEPsmx3qI8abXZ8HcRAjOpAJ94nz64cd38SZnpewzyV/LXRpTsJQCeO8P2
xwZ72lJhJrVopgvo3hNpfv0=
=atbc
-----END PGP SIGNATURE-----



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]