Wake Up
I don't know if there exists something better, but I couldn't find it, and I was curious anyway, and so I wrote my own.
I need to wake my computer at 3 a.m. to run nightly backups (using Backup.app from mac.com), but if the computer is asleep, it doesn't work. IOPMSchedulePowerEvent() can wake the computer at a given time, but I had no existing Perl interface to it. I could have added it to a Mac:: module, but in this case, I didn't have the time, and I currently have no use for it other than this one script. Therefore, Inline.
One especially interesting thing about the code -- to me -- is that it uses the CFAbsoluteTime data type, which -- for reasons unknown to me -- is in seconds since January 1, 2001, GMT. So the C code keeps a constant to calculate the difference from perl's time().
I need to wake my computer at 3 a.m. to run nightly backups (using Backup.app from mac.com), but if the computer is asleep, it doesn't work. IOPMSchedulePowerEvent() can wake the computer at a given time, but I had no existing Perl interface to it. I could have added it to a Mac:: module, but in this case, I didn't have the time, and I currently have no use for it other than this one script. Therefore, Inline.
One especially interesting thing about the code -- to me -- is that it uses the CFAbsoluteTime data type, which -- for reasons unknown to me -- is in seconds since January 1, 2001, GMT. So the C code keeps a constant to calculate the difference from perl's time().
#!/usr/local/bin/perl
# i use this to make sure my computer wakes up by 3 a.m. every morning,
# so my backups can run
# i run it from cron every 15 minutes (the computer is set to sleep
# after 15 minutes of inactivity)
# */15 * * * */Users/pudge/bin/wake.plx
# pudge@pobox.com 2004-04-01
use strict;
use warnings;
use Time::Local;
use Inline C => 'DATA',
LDDLFLAGS => '-bundle -flat_namespace -undefined suppress -framework Carbon',
INC => '-I/Developer/Headers/FlatCarbon';
my $now = time();
my @today = localtime($now);
@today[0, 1, 2] = (0, 55, 2);
my $then = timelocal(@today);
$then += 86400 if $now > $then;
schedule_event($then, 'wake');
__END__
__C__
#undef Move
#undef I_POLL
#undef DEBUG
#include <Carbon.h>
#include <mach/error.h>
// "type" defines here
// can be sleep, wake, shutdown, poweron, and wakepoweron
//#include <IOKit/pwr_mgt/IOPMKeys.h>
// difference between Unix epoch and CFAbsoluteTime epoch
#define EPOCH_DIFF 978307200
long schedule_event(long seconds_time_to_wake, const char * event_name)
{
CFDateRef time_to_wake;
CFStringRef type;
IOReturn io_error;
seconds_time_to_wake -= EPOCH_DIFF;
time_to_wake = CFDateCreate(kCFAllocatorDefault, (CFAbsoluteTime)seconds_time_to_wake);
type = CFStringCreateWithCString(kCFAllocatorDefault, event_name, NULL);
io_error = IOPMSchedulePowerEvent(time_to_wake, NULL, type);
CFRelease(time_to_wake);
CFRelease(type);
if (io_error != 0) {
printf("system: 0x%x, subsystem: 0x%x, code: 0x%x\n",
err_get_system(io_error),
err_get_sub(io_error),
err_get_code(io_error)
);
}
return io_error;
}
Leave a comment