chown
This commit is contained in:
parent
2e5aeeb9c1
commit
112ecf8fb5
@ -23,6 +23,18 @@ int get_stat(const char *path, struct stat *stat_path) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *make_path(const char *src, const char *dst) {
|
||||||
|
size_t len = strlen(src) + strlen(dst) + 2;
|
||||||
|
char *full_path = malloc(len + 1);
|
||||||
|
if (full_path == NULL) {
|
||||||
|
fprintf(stderr, "cp: malloc() returned NULL\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(full_path, len, "%s/%s", src, dst);
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
int change(const char *file) {
|
int change(const char *file) {
|
||||||
struct stat old_file;
|
struct stat old_file;
|
||||||
if (get_stat(file, &old_file))
|
if (get_stat(file, &old_file))
|
||||||
@ -46,10 +58,39 @@ int change(const char *file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int cntree(const char *dst) {
|
int cntree(const char *dst) {
|
||||||
change(dst);
|
int ret = change(dst);
|
||||||
|
|
||||||
//Recurs
|
|
||||||
return 0;
|
struct stat stat_path;
|
||||||
|
if (get_stat(dst, &stat_path))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (!S_ISDIR(stat_path.st_mode))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
DIR *dir = opendir(dst);
|
||||||
|
if (dir == NULL) {
|
||||||
|
fprintf(stderr, "chown: %s: Can`t open directory\n", dst);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *ep;
|
||||||
|
while ((ep = readdir(dir)) != NULL) {
|
||||||
|
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char *full_path = make_path(dst, ep->d_name);
|
||||||
|
if (full_path == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (cntree(full_path))
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
|
free(full_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_owner(const char *arg) {
|
void get_owner(const char *arg) {
|
||||||
|
@ -15,6 +15,18 @@ int get_stat(const char *path, struct stat *stat_path) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *make_path(const char *src, const char *dst) {
|
||||||
|
size_t len = strlen(src) + strlen(dst) + 2;
|
||||||
|
char *full_path = malloc(len + 1);
|
||||||
|
if (full_path == NULL) {
|
||||||
|
fprintf(stderr, "rm: malloc() returned NULL\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(full_path, len, "%s/%s", src, dst);
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
int rmtree(const char *path) {
|
int rmtree(const char *path) {
|
||||||
struct stat stat_path;
|
struct stat stat_path;
|
||||||
if (get_stat(path, &stat_path))
|
if (get_stat(path, &stat_path))
|
||||||
@ -40,13 +52,10 @@ int rmtree(const char *path) {
|
|||||||
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
|
if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
size_t len = strlen(path) + strlen(ep->d_name) + 2;
|
char *full_path = make_path(path, ep->d_name);
|
||||||
char *full_path = malloc(len + 1);
|
|
||||||
if (full_path == NULL)
|
if (full_path == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snprintf(full_path, len, "%s/%s", path, ep->d_name);
|
|
||||||
|
|
||||||
rmtree(full_path);
|
rmtree(full_path);
|
||||||
free(full_path);
|
free(full_path);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user