/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include "hardware_legacy/power.h"
int main(int argc, char **argv)
{
int pid, fd, mode;
unsigned int delay = 0;
int status = 0;
char *file = 0;
char lockid[32];
if (argc < 2) {
printf("Usage: %s [-f logfile] [-a] [-d delay] <program>\n", argv[0]);
exit(1);
}
close(0); open("/dev/null", 0);
close(1);
mode = O_TRUNC;
while(**++argv == '-') {
while(*++*argv) {
switch(**argv) {
case 'f':
if(*++*argv)
file = *argv;
else
file = *++argv;
goto next_arg;
case 'd':
if(*++*argv)
delay = atoi(*argv);
else
delay = atoi(*++argv);
goto next_arg;
case 'a':
mode = O_APPEND;
break;
}
}
next_arg: ;
}
if (file) {
if(open(file, O_WRONLY|mode|O_CREAT, 0666) < 0) {
perror(file);
exit(1);
}
}
else {
if(open("/dev/null", O_WRONLY) < 0) {
perror("/dev/null");
exit(1);
}
}
switch(pid = fork()) {
case -1:
perror(argv[0]);
exit(1);
break;
case 0:
fflush(stdout);
close(2); dup(1); /* join stdout and stderr */
chdir("/");
umask(0);
setpgrp();
setsid();
for (fd = 3; fd < 256; fd++) {
close(fd);
}
if(delay) {
snprintf(lockid, 32, "daemonize%d", (int) getpid());
acquire_wake_lock(PARTIAL_WAKE_LOCK, lockid);
}
switch(pid = fork()) {
case -1:
break;
case 0:
if(delay) {
sleep(delay);
}
execv(argv[0], argv);
execvp(argv[0], argv);
perror(argv[0]);
break;
default:
if(delay) {
waitpid(pid, &status, 0);
release_wake_lock(lockid);
}
_exit(0);
}
_exit(1);
break;
default:
exit(0);
break;
}
}
/* vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab */