Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/HibernateEnabler/HibernateEnabler.c

1/*
2 * HibernateEnabler.c
3 * Chameleon
4 *
5 * Created by cparm. <armelcadetpetit@gmail.com>
6 * Copyright 2010. All rights reserved.
7 *
8 */
9
10#include "bootstruct.h"
11#include "modules.h"
12#include "resume.h"
13#include "sl.h"
14#include "graphic_utils.h"
15
16#define kWake"Wake"/* boot.c */
17#define kForceWake"ForceWake"/* boot.c */
18#define kWakeImage"WakeImage"/* boot.c */
19
20void HibernateEnabler_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
21{
22bool tryresume,tryresumedefault, forceresume;
23
24if (!getBoolForKey (kWake, &tryresume, &bootInfo->bootConfig)) {
25tryresume = true;
26tryresumedefault = true;
27} else {
28tryresumedefault = false;
29}
30
31if (!getBoolForKey (kForceWake, &forceresume, &bootInfo->bootConfig)) {
32forceresume = false;
33}
34
35if (forceresume) {
36tryresume = true;
37tryresumedefault = false;
38}
39
40while (tryresume) {
41const char *tmp, *val;
42int len, ret = -1;
43long flags, sleeptime;
44BVRef bvr;
45if (!getValueForKey(kWakeImage, &val, &len, &bootInfo->bootConfig))
46val="/private/var/vm/sleepimage";
47
48// Do this first to be sure that root volume is mounted
49ret = GetFileInfo(0, val, &flags, &sleeptime);
50
51if ((bvr = getBootVolumeRef(val, &tmp)) == NULL)
52break;
53
54// Can't check if it was hibernation Wake=y is required
55if (bvr->modTime == 0 && tryresumedefault)
56break;
57
58if ((ret != 0) || ((flags & kFileTypeMask) != kFileTypeFlat))
59break;
60
61if (!forceresume && ((sleeptime+3)<bvr->modTime)) {
62printf ("Hibernate image is too old by %d seconds. Use ForceWake=y to override\n",bvr->modTime-sleeptime);
63break;
64}
65
66HibernateBoot((char *)val);
67break;
68}
69
70}
71
72void HibernateEnabler_start()
73{
74register_hook_callback("PreBoot", &HibernateEnabler_hook);
75register_hook_callback("spinActivity_hook", &spinActivityIndicator_hook);
76}

Archive Download this file

Revision: 789