/************************************\
 *                                  *
 *   scritto da zero per CloseBSD   *
 *                                  *
 *   ultima modifica: 13/10/2026    *
 *                                  *
\************************************/

// sistema concettualmente l'eliminazione della root

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>

int directory(char*);

int directory(char *path)
{
	DIR *dirp;
	struct dirent *dp;
	struct stat st;
	char *newpath;
	int size;

	if (path[strlen(path) - 1] != '/')
		strcat(path, "/");

	if ((dirp = opendir(path)) == NULL) {
		perror(path);
		return 1;
	}

	size = strlen(path) + 30;
	newpath = malloc(size * sizeof(char));
	while ((dp = readdir(dirp)) != NULL) {
		if ((strcmp(".", dp->d_name) != 0) && (strcmp("..", dp->d_name) != 0)) {
			strcpy(newpath, path);
			if ((strlen(newpath) + strlen(dp->d_name) + 1) > size) {
				size *= 2;
				newpath = realloc(newpath, size * sizeof(char));
			}
			strcat(newpath, dp->d_name);
			lstat(newpath, &st);
     
			/*
			 *  se e' dir entra in un nuovo ciclo, 
			 *  che svuota la dir e termina con l'eliminazione della dir vuota.
			 */
			if (S_ISDIR(st.st_mode))
				directory(newpath);

			else {
				if (remove(newpath) == 0)
					printf("\trimosso: %s\n", newpath);
				else perror(newpath);
			}
		}
	} closedir(dirp);

	/*
	 *  elimina la dir una volta vuota, 
	 *  ovvero al termine del ciclo di readdir().
	 */
	if (rmdir(path) == 0)
		printf("\trimossa: %s\n", path);
	else perror(path);
	
	return 0;
}

int main(int argc, char *argv[])
{
	struct stat st;

	if (argc == 1) {
		printf("%s: nessun argomento\n", argv[0]);
		return 1;
	}

	for (int i = 1; i < argc; i++) {
		lstat(argv[i], &st);

		/*
		   se e' directory entra in ricorsione.
		*/
		if (S_ISDIR(st.st_mode)) {
			if (strcmp(argv[i], "/") == 0) {
				printf("%s: non posso rimuovere root!\n", argv[0]);
				continue;
			}
			if (strcmp(argv[i], "..") == 0) {
				printf("%s: non posso rimuovere parent\n", argv[0]);
				continue;
			}
			directory(argv[i]);
		}

		else if (remove(argv[i]) == 0)
			printf("\trimosso: %s\n", argv[i]);
		else perror(argv[i]);
	}

	return 0;
}
