-
Notifications
You must be signed in to change notification settings - Fork 0
/
find.c
59 lines (49 loc) · 1.78 KB
/
find.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
/* simple implementation of find command in Unix systems */
void listdir(const char *pathname)
{
DIR *dp;
struct dirent *dirp;
char PATH[259] = {0};
/* By default max path in a linux sys is 256, we set ours to 259 for -1 in sieof path operation, null char used as part of copying file & null char in snprintf operation - Leads to 256 */
if((dp = opendir(pathname)) == NULL)
return;
while((dirp = readdir(dp)) != NULL)
{
/* d_type indicates file type: DT_DIR is a macro of the d_type that indicates that it is a directory - check manpage of readdir */
if(dirp->d_type == DT_DIR)
{
/* Compare the dir name with the current dir or parent dir(2 dots) */
if( (strcmp(dirp->d_name, ".") == 0) || (strcmp(dirp->d_name, "..") ==0) )
/* We continue since we are sure if it is a current or single dir, there is nothing further */
continue;
/* We print dir & have to go into directory recursively */
printf("%s%s\n", pathname, dirp->d_name);
/* We need to also print the path of the recursive dir */
snprintf(PATH, sizeof(PATH)-1, "%s%s/", pathname, dirp->d_name);
listdir(PATH);
}
else
{
printf("%s%s\n", pathname, dirp->d_name);
}
}
closedir(dp);
}
/* argc is the number os strings pointed by argv int argc & char *argv[] are meant to collect command line args*/
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
if(argc != 2)
{
printf("Please provide a directory to list out\n");
exit(1);
}
listdir(argv[1]);
exit(0);
}