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 | #define kEnableHibernate␉"EnableHibernateModule"␊ |
20 | ␊ |
21 | void HibernateEnabler_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
22 | {␊ |
23 | ␉bool tryresume,tryresumedefault, forceresume;␊ |
24 | ␉␊ |
25 | ␉if (!getBoolForKey (kWake, &tryresume, &bootInfo->bootConfig)) {␊ |
26 | ␉␉tryresume = true;␊ |
27 | ␉␉tryresumedefault = true;␊ |
28 | ␉} else {␊ |
29 | ␉␉tryresumedefault = false;␊ |
30 | ␉}␊ |
31 | ␉␊ |
32 | ␉if (!getBoolForKey (kForceWake, &forceresume, &bootInfo->bootConfig)) {␊ |
33 | ␉␉forceresume = false;␊ |
34 | ␉}␊ |
35 | ␉␊ |
36 | ␉if (forceresume) {␊ |
37 | ␉␉tryresume = true;␊ |
38 | ␉␉tryresumedefault = false;␊ |
39 | ␉}␊ |
40 | ␉␊ |
41 | ␉while (tryresume) {␊ |
42 | ␉␉const char *tmp, *val;␊ |
43 | ␉␉int len, ret = -1;␊ |
44 | ␉␉long flags, sleeptime;␊ |
45 | ␉␉BVRef bvr;␊ |
46 | ␉␉if (!getValueForKey(kWakeImage, &val, &len, &bootInfo->bootConfig))␊ |
47 | ␉␉␉val="/private/var/vm/sleepimage";␊ |
48 | ␉␉␊ |
49 | ␉␉// Do this first to be sure that root volume is mounted␊ |
50 | ␉␉ret = GetFileInfo(0, val, &flags, &sleeptime);␊ |
51 | ␉␉␊ |
52 | ␉␉if ((bvr = getBootVolumeRef(val, &tmp)) == NULL)␊ |
53 | ␉␉␉break;␊ |
54 | ␉␉␊ |
55 | ␉␉// Can't check if it was hibernation Wake=y is required␊ |
56 | ␉␉if (bvr->modTime == 0 && tryresumedefault)␊ |
57 | ␉␉␉break;␊ |
58 | ␉␉␊ |
59 | ␉␉if ((ret != 0) || ((flags & kFileTypeMask) != kFileTypeFlat))␊ |
60 | ␉␉␉break;␊ |
61 | ␉␉␊ |
62 | ␉␉if (!forceresume && ((sleeptime+3)<bvr->modTime)) {␊ |
63 | ␉␉␉printf ("Hibernate image is too old by %d seconds. Use ForceWake=y to override\n",bvr->modTime-sleeptime);␊ |
64 | ␉␉␉break;␊ |
65 | ␉␉}␊ |
66 | ␉␉␊ |
67 | ␉␉HibernateBoot((char *)val);␊ |
68 | ␉␉break;␊ |
69 | ␉}␊ |
70 | ␉␊ |
71 | }␊ |
72 | ␊ |
73 | void HibernateEnabler_start()␊ |
74 | {␊ |
75 | ␉bool enable = true;␊ |
76 | ␉getBoolForKey(kEnableHibernate, &enable, &bootInfo->bootConfig) ;␊ |
77 | ␉␊ |
78 | ␉if (enable) {␊ |
79 | ␉␉register_hook_callback("PreBoot", &HibernateEnabler_hook);␊ |
80 | ␉␉register_hook_callback("spinActivity_hook", &spinActivityIndicator_hook);␊ |
81 | ␉}␊ |
82 | } |