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