diff options
| author | deva <deva> | 2008-03-17 09:10:42 +0000 | 
|---|---|---|
| committer | deva <deva> | 2008-03-17 09:10:42 +0000 | 
| commit | 2f10a73cbbe4333e2a41e87a94eda7fb3d442dc5 (patch) | |
| tree | cc023927be890bb4880d6c97ddaf055041c512ea /miavd/daemon.cc | |
| parent | 6ae128fc80dd8a32ec6f062c7767ced32e9ba495 (diff) | |
Major code changes... FFMPEG introduced. Project splitup into subfolders.
Diffstat (limited to 'miavd/daemon.cc')
| -rw-r--r-- | miavd/daemon.cc | 118 | 
1 files changed, 118 insertions, 0 deletions
diff --git a/miavd/daemon.cc b/miavd/daemon.cc new file mode 100644 index 0000000..6e46bd5 --- /dev/null +++ b/miavd/daemon.cc @@ -0,0 +1,118 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            daemon.cc + * + *  Thu Jun  9 10:27:59 CEST 2005 + *  Copyright  2005 Bent Bisballe + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + *   + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + *   + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + +#include "daemon.h" + +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <signal.h> +#include <stdio.h> + +// For getgrent and getgrent +#include <sys/types.h> +#include <grp.h> +#include <pwd.h> + +// For strcmp +#include <string.h> + +Daemon::Daemon() +{} + +Daemon::~Daemon() +{} + +int Daemon::run(const char *user, const char* group) +{ +  int f; +  int fd; + +  // Fetch user id +  int uid = -1; +  struct passwd *p = getpwent(); +  while(p) { +    if(strcmp(p->pw_name, user) == 0) uid = p->pw_uid; +    p = getpwent(); +  } +  if(uid == -1) { +    fprintf(stderr, "Could not find user \"%s\" in /etc/passwd file.\n", user); +  } + +  // Fetch group id +  int gid = -1; +  struct group *g = getgrent(); +  while(g) { +    if(strcmp(g->gr_name, group) == 0) gid = g->gr_gid; +    g = getgrent(); +  } +  if(gid == -1) { +    fprintf(stderr, "Could not find group \"%s\" in /etc/group file.\n", group); +  } + +  chdir("/"); +  umask(0); + +  f = fork(); +  switch(f) { +  case -1: // Fork error +    perror("Fork in daemon.cc"); +    return 1; + +  case 0:  // Forked child +    // Switch to given group +    if(setgid(gid) != 0) { +      fprintf(stderr, "Failed to change to group \"%s\" (gid: %d), quitting.\n", group, gid); +      perror(""); +      fprintf(stderr, "Runnning daemon as current group\n"); +    } +     +    // Switch to given user +    if(setuid(uid) != 0) { +      fprintf(stderr, "Failed to change to user \"%s\" (uid: %d), quitting.\n", user, uid); +      perror(""); +      fprintf(stderr, "Runnning daemon as current user\n"); +    } +     +    // Redirect stdin, stdout and stderr to /dev/null +    fd = open("/dev/null", O_NOCTTY | O_RDWR, 0666); + +    dup2(0, fd); +    dup2(1, fd); +    dup2(2, fd); +     +    setsid(); + +    signal (SIGTERM, SIG_IGN); +    signal (SIGINT, SIG_IGN); +    signal (SIGHUP, SIG_IGN); + +    return daemon_main(); + +  default: // Parent +    // exit(0); +    return 0; +  } +}  | 
