Skip to content

Instantly share code, notes, and snippets.

@huseyin
Last active October 26, 2015 06:27
Show Gist options
  • Save huseyin/425efeca2a25cb40a33e to your computer and use it in GitHub Desktop.
Save huseyin/425efeca2a25cb40a33e to your computer and use it in GitHub Desktop.
Bir C denemesi
/*
* Copyright (C) 2015 - Hüseyin Tekinaslan <[email protected]>
*
* You should have received a copy of the GNU General Public License
* along with this scripts.
* Ondokuz Mayis University, Samsun 02092015, TURKEY.
*/
#ifndef H_KSTAT_
#define H_KSTAT_
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#define K_OK 1
#define K_FAIL -1
static void childs(char*, char***);
static int K_DIREXIST(char*);
struct kstat {
char** kd_childs;
char* kd_dname;
int kd_fsize;
int kd_exist;
};
struct kstat* kd_stat(char* dir)
{
struct kstat* list_dir = malloc(sizeof(struct kstat));
struct stat st;
char** buffers;
/* Dizin fiziksel olarak bir adres belirtiyorsa, yani gerçekte
* var ise içeri gir.
*/
if (K_DIREXIST(dir) == K_OK) {
list_dir->kd_dname = dir;
list_dir->kd_exist = 1;
/* Alt dizin ve dosyaları al buffer isimli double pointer
* değişkende tut.
*/
childs(dir, &buffers);
list_dir->kd_childs = buffers;
if (stat(dir, &st) == 0)
list_dir->kd_fsize = st.st_size;
} else {
/* Dizin fiziksel olarak yok ise değerleri boş değerler ile değştir.
* Default'a düşür.
*/
list_dir->kd_dname = NULL;
list_dir->kd_childs = NULL;
list_dir->kd_exist = 0;
list_dir->kd_fsize = 0;
}
return list_dir;
}
/* Dosya fiziksel olarak erişilebilir ise K_OK değerini döndür. Değil ise
* K_FAULT değerini döndür.
*/
static int K_DIREXIST(char* dir)
{
if (access(dir, F_OK ) != -1 )
return K_OK;
else
return K_FAIL;
}
static void childs(char* path, char*** l_dir)
{
unsigned short int l_size;
DIR* dir_p = opendir(path);
struct dirent* rd_dir = readdir(dir_p);
/* Bir alt dizindeki dosya ve klasörlerin sayısını hesapla. Bir aşağıda ** pointer
* tipli değişkene ekleyebilmek için sayıların bilinmesi önemli.
*/
for (l_size=0; rd_dir; l_size++)
rd_dir = readdir(dir_p);
// bellekte toplam uzunluktaki değerler kadar yer aç.
*l_dir = malloc(l_size * sizeof(char*));
rewinddir(dir_p);
rd_dir = readdir(dir_p);
// Alt dizindeki dosya ve klasörleri ** pointerlı değişkenin içerisine ekle.
for (l_size=0; rd_dir; l_size++) {
(*l_dir)[l_size] = strdup(rd_dir->d_name);
rd_dir = readdir(dir_p);
}
closedir(dir_p); // Kapat.
}
#endif // H_KSTAT_
/*
* example
*/
#include <stdio.h>
#include <stdlib.h>
#include "kstat.h"
int main(void)
{
struct kstat* ptr = kd_stat("/");
char** ch = ptr->kd_childs;
size_t i;
printf("Directory: %s\n", ptr->kd_dname);
printf("Exist: %d\n", ptr->kd_exist);
printf("Size: %d\n", ptr->kd_fsize);
printf("Childs: \n");
for (i=0; i < 25; i++)
printf("\t%d) %s\n", i+1, ch[i]);
free(ch);
return EXIT_SUCCESS;
}
@huseyin
Copy link
Author

huseyin commented Oct 26, 2015

Beklenen çıktı:

Directory: /
Exist: 1
Size:  4096
Childs: 
    1) tmp-4P5ZPI7w18
    2) srv
    3) root
    4) .pulse
    5) var
    6) lost+found
    7) usr
    8) run
    9) sys
    10) dev
    11) home
    12) lib
    13) bin
    14) ..
    15) lib64
    16) vmlinuz
    17) etc
    18) selinux
    19) proc
    20) tmp
    21) initrd.img
    22) mnt
    23) sbin
    24) .
    25) media

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment