Annotation of ansh/src/anshd.c, revision 1.1
1.1 ! misho 1: /*************************************************************************
! 2: * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
! 3: * by Michael Pounov <misho@elwix.org>
! 4: *
! 5: * $Author: misho $
! 6: * $Id: global.h,v 1.2 2011/06/08 12:45:40 misho Exp $
! 7: *
! 8: *************************************************************************/
! 9: #include "global.h"
! 10: #include "anshd.h"
! 11: #include "proc.h"
! 12:
! 13:
! 14: intptr_t Kill;
! 15: int bpfLEN, Verbose, Crypted = 1;
! 16: proc_head_t pH;
! 17: int Daemon = 1;
! 18:
! 19: extern char compiled[], compiledby[], compilehost[];
! 20:
! 21: static void
! 22: Usage()
! 23: {
! 24: printf( " -= anshd =- ELWIX Layer2 remote management service\n"
! 25: "=== %s === %s@%s ===\n\n"
! 26: " Syntax: anshd [options]\n\n"
! 27: "\t-d <dev>\tBind to host interface, like 'em0' (default is first host interface)\n"
! 28: "\t-i <id>\tService ID (default is 42)\n"
! 29: "\t-U <user>\tRun service with other user\n"
! 30: "\t-C <dir>\tRun service into chroot directory\n"
! 31: "\t-u\t\tSwitch to unencrypted traffic between hosts\n"
! 32: "\t-b\t\tRun into batch mode (default is daemon mode)\n"
! 33: "\t-v\t\tVerbose (more -v, more verbosity ...)\n"
! 34: "\t-h\t\tThis help screen!\n"
! 35: "\n", compiled, compiledby, compilehost);
! 36: }
! 37:
! 38: static void
! 39: sig(int s)
! 40: {
! 41: int state;
! 42:
! 43: switch (s) {
! 44: case SIGHUP:
! 45: LOG("Got SIGHUP!\n");
! 46: break;
! 47: case SIGTERM:
! 48: LOG("Got SIGTERM!\n");
! 49: Kill++;
! 50: break;
! 51: case SIGPIPE:
! 52: LOG("Got SIGPIPE!\n");
! 53: break;
! 54: case SIGCHLD:
! 55: while (waitpid(-1, &state, WNOHANG) > 0);
! 56: break;
! 57: }
! 58: }
! 59:
! 60: int
! 61: main(int argc, char **argv)
! 62: {
! 63: struct passwd *pass;
! 64: int fd, h = 0, uid = 0, gid = 0;
! 65: long id = ANSH_ID;
! 66: char ch, szUser[STRSIZ] = "root", szChroot[STRSIZ] = "/", szDev[STRSIZ] = { 0 };
! 67: struct sigaction sact;
! 68: sched_root_task_t *root = NULL;
! 69: struct tagProc *proc;
! 70:
! 71: Get1stEth(szDev, STRSIZ);
! 72:
! 73: while ((ch = getopt(argc, argv, "hvulbd:U:C:")) != -1)
! 74: switch (ch) {
! 75: case 'U':
! 76: pass = getpwnam(optarg);
! 77: if (!pass) {
! 78: printf("Error:: User %s not found!\n", optarg);
! 79: return 1;
! 80: } else {
! 81: strlcpy(szUser, optarg, sizeof szUser);
! 82: uid = pass->pw_uid;
! 83: gid = pass->pw_gid;
! 84: }
! 85: endpwent();
! 86: break;
! 87: case 'C':
! 88: if (access(optarg, R_OK)) {
! 89: printf("Error:: in chroot %s #%d - %s\n", optarg, errno, strerror(errno));
! 90: return 1;
! 91: } else
! 92: strlcpy(szChroot, optarg, sizeof szChroot);
! 93: break;
! 94: case 'i':
! 95: id = strtol(optarg, NULL, 0);
! 96: break;
! 97: case 'd':
! 98: strlcpy(szDev, optarg, sizeof szDev);
! 99: break;
! 100: case 'u':
! 101: Crypted ^= Crypted;
! 102: break;
! 103: case 'b':
! 104: Daemon ^= Daemon;
! 105: break;
! 106: case 'v':
! 107: Verbose++;
! 108: break;
! 109: case 'h':
! 110: default:
! 111: Usage();
! 112: return 1;
! 113: }
! 114: argc -= optind;
! 115: argv += optind;
! 116:
! 117: /* catch signals */
! 118: memset(&sact, 0, sizeof sact);
! 119: sigemptyset(&sact.sa_mask);
! 120: sact.sa_handler = sig;
! 121: sigaction(SIGPIPE, &sact, NULL);
! 122: sigaction(SIGCHLD, &sact, NULL);
! 123: sigaction(SIGTERM, &sact, NULL);
! 124: sigaction(SIGHUP, &sact, NULL);
! 125:
! 126: openlog("anshd", LOG_CONS | LOG_PID, LOG_DAEMON);
! 127:
! 128: if (Daemon) {
! 129: switch (fork()) {
! 130: case -1:
! 131: ERR("Daemon mode #%d - %s\n", errno, strerror(errno));
! 132: closelog();
! 133: return 1;
! 134: case 0:
! 135: VERB(1) LOG("Welcome to dark ...\n");
! 136:
! 137: setsid();
! 138:
! 139: fd = open("/dev/null", O_WRONLY);
! 140: if (fd) {
! 141: dup2(fd, STDIN_FILENO);
! 142: dup2(fd, STDOUT_FILENO);
! 143: dup2(fd, STDERR_FILENO);
! 144: if (fd > 2)
! 145: close(fd);
! 146: }
! 147: break;
! 148: default:
! 149: VERB(1) LOG("Going to shadow land ...\n");
! 150: closelog();
! 151: return 0;
! 152: }
! 153: }
! 154:
! 155: h = PrepareL2(szDev, &bpfLEN);
! 156: if (h == -1) {
! 157: ERR("Error:: Descriptor not opened ... abort!\n");
! 158: closelog();
! 159: return 2;
! 160: }
! 161:
! 162: SLIST_INIT(&pH);
! 163: if (!(proc = InitProc(h, NULL, id, bpfLEN))) {
! 164: ERR("Error:: Not enough memory ...\n");
! 165: close(h);
! 166: closelog();
! 167: return 3;
! 168: }
! 169:
! 170: root = schedBegin();
! 171: if (!root) {
! 172: ERR("Scheduler not init #%d - %s\n", sched_GetErrno(), sched_GetError());
! 173: DestroyProc(id);
! 174: close(h);
! 175: closelog();
! 176: return 4;
! 177: }
! 178:
! 179: chdir("/");
! 180: chroot(szChroot);
! 181:
! 182: setgid(gid);
! 183: setuid(uid);
! 184:
! 185: if (schedRead(root, pktRx, (void*) id, h)) {
! 186: schedRun(root, &Kill);
! 187: } else
! 188: ERR("Failed to add reader task #%d - %s\n", sched_GetErrno(), sched_GetError());
! 189:
! 190: VERB(1) LOG("Finish process.");
! 191: schedEnd(&root);
! 192: DestroyProc(id);
! 193: close(h);
! 194: closelog();
! 195: return 0;
! 196: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>