per queste variabili viene allocato nello stack quando viene eseguita la
funzione e liberato quando si esce dalla medesima.
-Esiste però un terzo tipo di allocazione, l'\textsl{allocazione dinamica della
- memoria}, che non è prevista direttamente all'interno del linguaggio C, ma
-che è necessaria quando il quantitativo di memoria che serve è determinabile
-solo durante il corso dell'esecuzione del programma.
+Esiste però un terzo tipo di allocazione, l'\textsl{allocazione dinamica}
+della memoria, che non è prevista direttamente all'interno del linguaggio C,
+ma che è necessaria quando il quantitativo di memoria che serve è
+determinabile solo durante il corso dell'esecuzione del programma.
Il C non consente di usare variabili allocate dinamicamente, non è possibile
cioè definire in fase di programmazione una variabile le cui dimensioni
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 'w':
waiting = strtol(optarg, NULL, 10);
break;
+ case 'r':
+ printf("chroot\n");
+ reroot = 1;
+ rootdir = optarg;
+ break;
case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
usage();
if ( (list_fd = sockbind2(argv[optind], "www", 6, SOCK_STREAM)) < 0) {
return 1;
}
+ /* chroot if requested */
+ if (reroot) {
+ printf("chroot to %s\n", rootdir);
+ 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");