Annotation of ansh/src/anshd.c, revision 1.1.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>