#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
typedef struct _vfs_stack
{
struct _vfs_stack *nxt;
void *ptr;
} vfs_stack;
typedef struct _vfs_file
{
char *virt_file_name;
char *virt_file_real_path;
char *virt_file_gname;
char *virt_file_uname;
char *virt_file_perms;
} vfs_file;
typedef struct _vfs_dir
{
struct _vfs_dir *dirs, *parent;
//vfs_file *dir_files;
int n_virt_dirs;
//int n_virt_files;
char *virt_dir_name;
//char *virt_dir_gname;
//char *virt_dir_uname;
//char *virt_dir_perms;
} vfs_dir;
void *vfs_stack_pop(vfs_stack **head)
{
if (!head)
return NULL;
vfs_stack *temp = *head;
void *ptr = (*head)->ptr;
*head = (*head)->nxt;
return ptr;
}
void vfs_stack_push(vfs_stack **head, void *ptr)
{
if (!head || !ptr)
return;
vfs_stack
*push
= calloc(1, sizeof(vfs_stack
)); if (!push)
return;
push->ptr = ptr;
push->nxt = *head;
*head = push;
}
vfs_dir *vfs_mkdir(vfs_dir **parent, char *ftp_dir_name)
{
if (!parent)
{
vfs_dir
*vfs_ret
= calloc(1, sizeof(vfs_dir
)); if (vfs_ret)
{
vfs_ret->n_virt_dirs = 0;
vfs_ret->parent = NULL;
vfs_ret->dirs = NULL;
if (ftp_dir_name)
vfs_ret->virt_dir_name = strdup(ftp_dir_name);
else
vfs_ret->virt_dir_name = NULL;
}
return vfs_ret;
}
if (!(*parent)->n_virt_dirs)
(*parent
)->dirs
= calloc(1, sizeof(vfs_dir
)); else
{
vfs_dir
*dir_temp
= realloc((*parent
)->dirs
, (((*parent
)->n_virt_dirs
+ 1) * sizeof(vfs_dir
))); if (dir_temp)
(*parent)->dirs = dir_temp;
else
{
return NULL;
}
}
(*parent)->dirs[(*parent)->n_virt_dirs].virt_dir_name = strdup(ftp_dir_name);
(*parent)->dirs[(*parent)->n_virt_dirs].parent = *parent;
(*parent)->dirs[(*parent)->n_virt_dirs].n_virt_dirs = 0;
(*parent)->dirs[(*parent)->n_virt_dirs].dirs = 0;
return &(*parent)->dirs[(*parent)->n_virt_dirs++];
}
void vfs_rmdir(vfs_dir *pfs_dir)
{
if (!pfs_dir)
return;
vfs_stack *head = NULL;
// Initialise stack of directories to free with lowest level directory.
vfs_stack_push(&head, pfs_dir);
vfs_dir *pop = 0;
while (head)
{
// pop our directory off the stack.
pop = (vfs_dir *)vfs_stack_pop(&head);
if (pop)
{
if (pop->n_virt_dirs) // are there more directories within this one?
{
for (int i = 0; i < pop->n_virt_dirs; i++)
{
vfs_dir *pfs_temp = &pop->dirs[i];
vfs_stack_push(&head, pfs_temp); // push them to the stack so we can wipe its owner.
}
pop->n_virt_dirs = 0;
}
printf("Freeing %s\n", pop
->virt_dir_name
); // cleanup this folder level as we've saved its children.
}
}
}
int main(int argc, char **argv)
{
vfs_dir *pfs_root = vfs_mkdir(NULL, "/");
if (!pfs_root)
{
}
printf("Virtual filesystem root created: pfs_root\n\n");
vfs_mkdir(&pfs_root, "Folder 1");
vfs_mkdir(&pfs_root, "Folder 2");
vfs_mkdir(&pfs_root, "Folder 3");
printf("%s has %d folders\n", pfs_root
->virt_dir_name
, pfs_root
->n_virt_dirs
); printf("Dir 1: %s%s\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[0].
virt_dir_name); printf("Dir 2: %s%s\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[1].
virt_dir_name); printf("Dir 3: %s%s\n\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[2].
virt_dir_name);
vfs_dir *new_level_dir = &pfs_root->dirs[0];
vfs_mkdir(&new_level_dir, "Folder 1-1");
printf("%s has %d folders\n", pfs_root
->dirs
[0].
virt_dir_name, new_level_dir
->n_virt_dirs
); printf("Dir 4: %s%s/%s\n\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[0].
virt_dir_name, new_level_dir
->dirs
[0].
virt_dir_name);
vfs_dir *deeper_dir = &new_level_dir->dirs[0];
vfs_mkdir(&deeper_dir, "Folder 1-1-1");
vfs_mkdir(&deeper_dir, "Folder 1-1-2");
printf("%s has %d folders\n", new_level_dir
->dirs
[0].
virt_dir_name, deeper_dir
->n_virt_dirs
); printf("Dir 5: %s%s/%s/%s\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[0].
virt_dir_name, new_level_dir
->dirs
[0].
virt_dir_name, deeper_dir
->dirs
[0].
virt_dir_name); printf("Dir 6: %s%s/%s/%s\n\n", pfs_root
->virt_dir_name
, pfs_root
->dirs
[0].
virt_dir_name, new_level_dir
->dirs
[0].
virt_dir_name, deeper_dir
->dirs
[1].
virt_dir_name);
vfs_rmdir(pfs_root);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+Cgp0eXBlZGVmIHN0cnVjdCBfdmZzX3N0YWNrCnsKCXN0cnVjdCBfdmZzX3N0YWNrICAgICpueHQ7Cgl2b2lkICAgICAgICAgICAgICAgICpwdHI7Cn0gdmZzX3N0YWNrOwoKdHlwZWRlZiBzdHJ1Y3QgX3Zmc19maWxlCnsKCWNoYXIgKnZpcnRfZmlsZV9uYW1lOwoJY2hhciAqdmlydF9maWxlX3JlYWxfcGF0aDsKCWNoYXIgKnZpcnRfZmlsZV9nbmFtZTsKCWNoYXIgKnZpcnRfZmlsZV91bmFtZTsKCWNoYXIgKnZpcnRfZmlsZV9wZXJtczsKfSB2ZnNfZmlsZTsKCnR5cGVkZWYgc3RydWN0IF92ZnNfZGlyCnsKCXN0cnVjdCBfdmZzX2RpciAgICAgICAgKmRpcnMsICpwYXJlbnQ7CgkvL3Zmc19maWxlICAgICpkaXJfZmlsZXM7CgoJaW50ICAgICAgICBuX3ZpcnRfZGlyczsKCS8vaW50ICAgICAgICBuX3ZpcnRfZmlsZXM7CgoJY2hhciAgICAqdmlydF9kaXJfbmFtZTsKCS8vY2hhciAgICAqdmlydF9kaXJfZ25hbWU7CgkvL2NoYXIgICAgICp2aXJ0X2Rpcl91bmFtZTsKCS8vY2hhciAgICAqdmlydF9kaXJfcGVybXM7Cn0gdmZzX2RpcjsKCgp2b2lkICp2ZnNfc3RhY2tfcG9wKHZmc19zdGFjayAqKmhlYWQpCnsKCWlmICghaGVhZCkKCQlyZXR1cm4gTlVMTDsKCgl2ZnNfc3RhY2sgICAgKnRlbXAgPSAqaGVhZDsKCXZvaWQgICAgICAgICAqcHRyID0gKCpoZWFkKS0+cHRyOwoJKmhlYWQgPSAoKmhlYWQpLT5ueHQ7CgoJZnJlZSh0ZW1wKTsKCglyZXR1cm4gcHRyOwp9Cgp2b2lkIHZmc19zdGFja19wdXNoKHZmc19zdGFjayAqKmhlYWQsIHZvaWQgKnB0cikKewoJaWYgKCFoZWFkIHx8ICFwdHIpCgkJcmV0dXJuOwoKCXZmc19zdGFjayAqcHVzaCA9IGNhbGxvYygxLCBzaXplb2YodmZzX3N0YWNrKSk7CglpZiAoIXB1c2gpCgkJcmV0dXJuOwoKCXB1c2gtPnB0ciA9IHB0cjsKCXB1c2gtPm54dCA9ICpoZWFkOwoJKmhlYWQgPSBwdXNoOwp9Cgp2ZnNfZGlyICp2ZnNfbWtkaXIodmZzX2RpciAqKnBhcmVudCwgY2hhciAqZnRwX2Rpcl9uYW1lKQp7CglpZiAoIXBhcmVudCkKCXsKCQl2ZnNfZGlyICp2ZnNfcmV0ID0gY2FsbG9jKDEsIHNpemVvZih2ZnNfZGlyKSk7CgkJaWYgKHZmc19yZXQpCgkJewoJCQl2ZnNfcmV0LT5uX3ZpcnRfZGlycyA9IDA7CgkJCXZmc19yZXQtPnBhcmVudCA9IE5VTEw7CgkJCXZmc19yZXQtPmRpcnMgPSBOVUxMOwoKCQkJaWYgKGZ0cF9kaXJfbmFtZSkKCQkJCXZmc19yZXQtPnZpcnRfZGlyX25hbWUgPSBzdHJkdXAoZnRwX2Rpcl9uYW1lKTsKCQkJZWxzZQoJCQkJdmZzX3JldC0+dmlydF9kaXJfbmFtZSA9IE5VTEw7CgkJfQoKCQlyZXR1cm4gdmZzX3JldDsKCX0KCglpZiAoISgqcGFyZW50KS0+bl92aXJ0X2RpcnMpCgkJKCpwYXJlbnQpLT5kaXJzID0gY2FsbG9jKDEsIHNpemVvZih2ZnNfZGlyKSk7CgllbHNlCgl7CgkJdmZzX2RpciAqZGlyX3RlbXAgPSByZWFsbG9jKCgqcGFyZW50KS0+ZGlycywgKCgoKnBhcmVudCktPm5fdmlydF9kaXJzICsgMSkgKiBzaXplb2YodmZzX2RpcikpKTsKCQlpZiAoZGlyX3RlbXApCgkJCSgqcGFyZW50KS0+ZGlycyA9IGRpcl90ZW1wOwoJCWVsc2UKCQl7CgkJCWZyZWUoKCpwYXJlbnQpLT5kaXJzKTsKCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoKCSgqcGFyZW50KS0+ZGlyc1soKnBhcmVudCktPm5fdmlydF9kaXJzXS52aXJ0X2Rpcl9uYW1lID0gc3RyZHVwKGZ0cF9kaXJfbmFtZSk7CgkoKnBhcmVudCktPmRpcnNbKCpwYXJlbnQpLT5uX3ZpcnRfZGlyc10ucGFyZW50ID0gKnBhcmVudDsKCSgqcGFyZW50KS0+ZGlyc1soKnBhcmVudCktPm5fdmlydF9kaXJzXS5uX3ZpcnRfZGlycyA9IDA7CgkoKnBhcmVudCktPmRpcnNbKCpwYXJlbnQpLT5uX3ZpcnRfZGlyc10uZGlycyA9IDA7CgoJcmV0dXJuICYoKnBhcmVudCktPmRpcnNbKCpwYXJlbnQpLT5uX3ZpcnRfZGlycysrXTsKfQoKdm9pZCB2ZnNfcm1kaXIodmZzX2RpciAqcGZzX2RpcikKewoJaWYgKCFwZnNfZGlyKQoJCXJldHVybjsKCgl2ZnNfc3RhY2sgKmhlYWQgPSBOVUxMOwoKCS8vIEluaXRpYWxpc2Ugc3RhY2sgb2YgZGlyZWN0b3JpZXMgdG8gZnJlZSB3aXRoIGxvd2VzdCBsZXZlbCBkaXJlY3RvcnkuCgl2ZnNfc3RhY2tfcHVzaCgmaGVhZCwgcGZzX2Rpcik7CgoJdmZzX2RpciAqcG9wID0gMDsKCXdoaWxlIChoZWFkKQoJewoJCS8vIHBvcCBvdXIgZGlyZWN0b3J5IG9mZiB0aGUgc3RhY2suCgkJcG9wID0gKHZmc19kaXIgKil2ZnNfc3RhY2tfcG9wKCZoZWFkKTsKCgkJaWYgKHBvcCkKCQl7CgkJCWlmIChwb3AtPm5fdmlydF9kaXJzKSAvLyBhcmUgdGhlcmUgbW9yZSBkaXJlY3RvcmllcyB3aXRoaW4gdGhpcyBvbmU/CgkJCXsKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9wLT5uX3ZpcnRfZGlyczsgaSsrKQoJCQkJewoJCQkJCXZmc19kaXIgKnBmc190ZW1wID0gJnBvcC0+ZGlyc1tpXTsKCQkJCQl2ZnNfc3RhY2tfcHVzaCgmaGVhZCwgcGZzX3RlbXApOyAvLyBwdXNoIHRoZW0gdG8gdGhlIHN0YWNrIHNvIHdlIGNhbiB3aXBlIGl0cyBvd25lci4KCgkJCQl9CgkJCQlwb3AtPm5fdmlydF9kaXJzID0gMDsKCQkJfQoKCQkJcHJpbnRmKCJGcmVlaW5nICVzXG4iLCBwb3AtPnZpcnRfZGlyX25hbWUpOwoJCQkvLyBjbGVhbnVwIHRoaXMgZm9sZGVyIGxldmVsIGFzIHdlJ3ZlIHNhdmVkIGl0cyBjaGlsZHJlbi4KCQl9Cgl9CglmcmVlKHBmc19kaXIpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXZmc19kaXIgKnBmc19yb290ID0gdmZzX21rZGlyKE5VTEwsICIvIik7CglpZiAoIXBmc19yb290KQoJewoJCXBlcnJvcigidmZzX21rZGlyIHJvb3QiKTsKCQlleGl0KC0xKTsKCX0KCglwcmludGYoIlZpcnR1YWwgZmlsZXN5c3RlbSByb290IGNyZWF0ZWQ6IHBmc19yb290XG5cbiIpOwoKCXZmc19ta2RpcigmcGZzX3Jvb3QsICJGb2xkZXIgMSIpOwoJdmZzX21rZGlyKCZwZnNfcm9vdCwgIkZvbGRlciAyIik7Cgl2ZnNfbWtkaXIoJnBmc19yb290LCAiRm9sZGVyIDMiKTsKCgoJcHJpbnRmKCIlcyBoYXMgJWQgZm9sZGVyc1xuIiwgcGZzX3Jvb3QtPnZpcnRfZGlyX25hbWUsIHBmc19yb290LT5uX3ZpcnRfZGlycyk7CglwcmludGYoIkRpciAxOiAlcyVzXG4iLCBwZnNfcm9vdC0+dmlydF9kaXJfbmFtZSwgcGZzX3Jvb3QtPmRpcnNbMF0udmlydF9kaXJfbmFtZSk7CglwcmludGYoIkRpciAyOiAlcyVzXG4iLCBwZnNfcm9vdC0+dmlydF9kaXJfbmFtZSwgcGZzX3Jvb3QtPmRpcnNbMV0udmlydF9kaXJfbmFtZSk7CglwcmludGYoIkRpciAzOiAlcyVzXG5cbiIsIHBmc19yb290LT52aXJ0X2Rpcl9uYW1lLCBwZnNfcm9vdC0+ZGlyc1syXS52aXJ0X2Rpcl9uYW1lKTsKCgl2ZnNfZGlyICpuZXdfbGV2ZWxfZGlyID0gJnBmc19yb290LT5kaXJzWzBdOwoJdmZzX21rZGlyKCZuZXdfbGV2ZWxfZGlyLCAiRm9sZGVyIDEtMSIpOwoKCXByaW50ZigiJXMgaGFzICVkIGZvbGRlcnNcbiIsIHBmc19yb290LT5kaXJzWzBdLnZpcnRfZGlyX25hbWUsIG5ld19sZXZlbF9kaXItPm5fdmlydF9kaXJzKTsKCXByaW50ZigiRGlyIDQ6ICVzJXMvJXNcblxuIiwgcGZzX3Jvb3QtPnZpcnRfZGlyX25hbWUsIHBmc19yb290LT5kaXJzWzBdLnZpcnRfZGlyX25hbWUsIG5ld19sZXZlbF9kaXItPmRpcnNbMF0udmlydF9kaXJfbmFtZSk7CgoJdmZzX2RpciAqZGVlcGVyX2RpciA9ICZuZXdfbGV2ZWxfZGlyLT5kaXJzWzBdOwoJdmZzX21rZGlyKCZkZWVwZXJfZGlyLCAiRm9sZGVyIDEtMS0xIik7Cgl2ZnNfbWtkaXIoJmRlZXBlcl9kaXIsICJGb2xkZXIgMS0xLTIiKTsKCgoJcHJpbnRmKCIlcyBoYXMgJWQgZm9sZGVyc1xuIiwgbmV3X2xldmVsX2Rpci0+ZGlyc1swXS52aXJ0X2Rpcl9uYW1lLCBkZWVwZXJfZGlyLT5uX3ZpcnRfZGlycyk7CglwcmludGYoIkRpciA1OiAlcyVzLyVzLyVzXG4iLCBwZnNfcm9vdC0+dmlydF9kaXJfbmFtZSwgcGZzX3Jvb3QtPmRpcnNbMF0udmlydF9kaXJfbmFtZSwgbmV3X2xldmVsX2Rpci0+ZGlyc1swXS52aXJ0X2Rpcl9uYW1lLCBkZWVwZXJfZGlyLT5kaXJzWzBdLnZpcnRfZGlyX25hbWUpOwoJcHJpbnRmKCJEaXIgNjogJXMlcy8lcy8lc1xuXG4iLCBwZnNfcm9vdC0+dmlydF9kaXJfbmFtZSwgcGZzX3Jvb3QtPmRpcnNbMF0udmlydF9kaXJfbmFtZSwgbmV3X2xldmVsX2Rpci0+ZGlyc1swXS52aXJ0X2Rpcl9uYW1lLCBkZWVwZXJfZGlyLT5kaXJzWzFdLnZpcnRfZGlyX25hbWUpOwoKCXZmc19ybWRpcihwZnNfcm9vdCk7CgoJcmV0dXJuIDA7Cn0=