* Variables definition
*/
int list_fd, conn_fd;
- int waiting = 0;
int compat = 0;
+ int reroot = 0;
+ char * rootdir;
pid_t pid;
struct sockaddr_in cli_add;
socklen_t len;
*/
int i;
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hdicw:")) != -1) {
+ while ( (i = getopt(argc, argv, "hdicw:r:")) != -1) {
switch (i) {
/*
* Handling options
case 'd':
debugging = 1;
break;
- case 'w':
- waiting = strtol(optarg, NULL, 10);
+ case 'r':
+ reroot = 1;
+ rootdir = optarg;
break;
case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
if ( (list_fd = sockbind2(argv[optind], "www", 6, SOCK_STREAM)) < 0) {
return 1;
}
+ /* chroot if requested */
+ if (reroot) {
+ if (chdir(rootdir)) {
+ perror("Cannot find directory to chroot");
+ exit(1);
+ }
+ if (chroot(rootdir)) {
+ perror("Cannot chroot");
+ exit(1);
+ }
+ }
/* release privileges and go daemon */
if (setgid(65534) !=0) { /* first give away group privileges */
perror("cannot give away group privileges");
PrintErr("listen error");
exit(1);
}
- if (waiting) sleep(waiting);
/* handle echo to client */
while (1) {
/* accept connection */