On Saturday, 7 October 2006 14:56, Stefan Seyfried wrote:
> On Fri, Oct 06, 2006 at 07:37:23PM +0200, Stefan Seyfried wrote:
> > On Fri, Oct 06, 2006 at 03:54:08PM +0200, Stefan Seyfried wrote:
> > > Hi,
> > >
> > > i just had an idea :-)
> >
> > ok, so how about this:
>
> it does not work.
>
> > Index: s2ram.c
> > ===================================================================
> > RCS file: /cvsroot/suspend/suspend/s2ram.c,v
> > retrieving revision 1.45
> > diff -u -p -r1.45 s2ram.c
> > --- s2ram.c 20 Sep 2006 16:23:51 -0000 1.45
> > +++ s2ram.c 6 Oct 2006 17:32:56 -0000
> > @@ -10,11 +10,15 @@
> > #include <getopt.h>
> > #include <errno.h>
> > #include <string.h>
> > +#include <sys/ioctl.h>
> > +#include <syscall.h>
> > +#include <unistd.h>
> >
> > #define S2RAM
> > #include "vbetool/vbetool.h"
> > #include "vt.h"
> > #include "s2ram.h"
> > +#include "swsusp.h"
> >
> > static void *vbe_buffer;
> > /* Flags set from whitelist */
> > @@ -192,9 +196,15 @@ int s2ram_prepare(void)
> > }
> >
> > /* Actually enter the suspend. May be ran on frozen system. */
> > -int s2ram_do(void)
> > +int s2ram_do(int frozen, int snapshot_fd)
> > {
> > int ret = 0;
> > + if (frozen) {
> > + printf("calling suspend_to_ram ioctl\n");
> > + ret = suspend_to_ram(snapshot_fd);
> > + goto out;
> > + }
> > +
> > FILE *f = fopen("/sys/power/state", "w");
> > if (!f) {
> > printf("/sys/power/state does not exist; what kind of ninja
> > mutant machine is this?\n");
> > @@ -211,6 +221,7 @@ int s2ram_do(void)
> > ret = errno;
> > perror("s2ram_do");
> > }
> > + out:
> > return ret;
> > }
> >
> > @@ -267,7 +278,7 @@ static void usage(void)
> > int main(int argc, char *argv[])
> > {
> > int i, id = -1, ret = 0, test_mode = 0, force = 0;
> > - int active_console = -1;
> > + int active_console = -1, snapshot_fd = -1, frozen = 0;
> > struct option options[] = {
> > { "test", no_argument, NULL, 'n'},
> > { "help", no_argument, NULL, 'h'},
> > @@ -354,13 +365,24 @@ int main(int argc, char *argv[])
> > printf("Switching from vt%d to vt1\n", active_console);
> > chvt(1);
> >
> > + snapshot_fd = open("/dev/snapshot", O_RDONLY);
> > + if (snapshot_fd < 0)
> > + fprintf(stderr, "s2ram: Could not open the snapshot device\n");
> > + else
> > + frozen = !freeze(snapshot_fd);
> > +
> > + fprintf(stderr, "frozen: %d\n", frozen);
> > ret = s2ram_hacks();
> > if (ret)
> > goto out;
> > - ret = s2ram_do();
> > + ret = s2ram_do(frozen, snapshot_fd);
> > s2ram_resume();
> >
> > out:
> > + if (frozen)
> > + unfreeze(snapshot_fd);
> > + if (snapshot_fd > 0)
> > + close(snapshot_fd);
>
> usually it segfaults somewhere around here. Or more exactly, since i
> tried reordering the stuff, it segfaults in the first glibc function
> used. Not always, but every second or third suspend.
Hm, actually I'd prefer if it segfaulted every time. ;-)
Anyway, have you tried to replace suspend_to_ram(snapshot_fd) in s2ram_do
with a noop and see what happens?
Rafael
--
You never change things by fighting the existing reality.
R. Buckminster Fuller
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Suspend-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/suspend-devel