From f1652cd9f53c7972be6086be3979492c02820018 Mon Sep 17 00:00:00 2001 From: TheK0tYaRa Date: Sun, 15 Jun 2025 12:20:40 +0300 Subject: [PATCH] single layer --- bin/main | Bin 16096 -> 16232 bytes src/main.c | 100 ++++++++++++++++++++--------------------------------- src/tmp1.c | 57 ++++++++++++++++++++++++++++++ src/tmp2.c | 39 +++++++++++++++++++++ 4 files changed, 133 insertions(+), 63 deletions(-) create mode 100644 src/tmp1.c create mode 100644 src/tmp2.c diff --git a/bin/main b/bin/main index efe8b24be6e57c4342db368f812d68708dd0282c..962ad28491dbd38065d4e8d50c3dea9f5288cce7 100755 GIT binary patch delta 3078 zcmZWr4{Te-8NYk>OZ-g!*iIZLYpGwET(VBsPGUEI-8giH7nF(?m8li#5-Wciv(&X} zdkYe&V?4834~w=3tZ3E9q)k+v2CQCIsx2c~t0vn-*G@yLHju(3rk91P?gS(J8E@a+ zdoP6UEZ=wc{eItf_uYMW_m-!WV<#Hz$c|VEYXT`JzxJ|K6ttcwocx>D>a5Uu&I;nd zUSS4n-5Ju4eZpBz>%C60_znB?R;{-#$zE=7>yW5v@02~78ugIt+^hB1Msdq8o`3qn zth4T;)wkaI=cYeDwL+dV?ZeFkn_Xn6!%WQPdQxsNlYM+W-a)n4#jw}B8Yc3M_;IGU zvO2-)@3Q*uWH0Z+_p$cFG*TrJh z2zUiuS33CuEH;mb-mho48U0A_|B~S*bXM=DzY-JJuqA>kT`gsOGjD_dhhotLn$h)% zu%*Ln}d8$&|%Kp0rev8H-ds zv;nb|-nFb&oU)axRnOx-gvP6Yz9N#Fwk>NkzVk ziq5r^QE!*D&K1#PeD&<1kX;Uh^ zm#UWJ&@0eUosCc{!>X!Y;eSHr?cZ#=4a+VSB8ntWDJ}DbD@y)zRh0_-PU3SkWODC^ zrNUHMDx@i)to-%A6pSoWw(9rVT#<4a`PO3*8sexgqWMil9ZcTLTRhC7+Irp zU)=`ik|d{rwYxkZ!@xyn1m^G>QqEC-GME%1YarL8T;_84AVjMz&!Z5DlzqPpDKjF; zW=}H<4rqnB{kQ0}X7^Ab=UFe;fzozKE^gEnEC#w5W;<_m<&NJXNL-l14`2?3`~W!0 z%?;ez1PcXTilLvu-YL%jwo(Hbyo%)60dm#h%G}GAARnd!=jN!;_;JdAi1HWUlF%WP z=2y-`cQGFTB3%t>m^Gzt=ApLuEF~B7W$JFYNLdnw<;Zu?mdr%$g|N-UtP1%+hUw=R zoLj7uib0MJ{M2VK{WX-@EXf<~~C#N4XsyMg&EWj+iFjif5MPr=GTt&03H03jlgx?jvU zQuk2g{3NtIsEkkuO+)@}0qTJbR5^cwS`?VYYCz{_G=nf0h+yFTlEDl$SXdSeBLq>h zVddxPu#g*C%nPt?p^vOA1+6esW7bzcfmt7fG+t3*Nn}U|h*JQ<7un~McdtpEOKCyM zUZ#0@@RD*7tj0*AbK65Z*$M%Ptqp6Y6cq+LgfV^IGI65(LWLO-F#wJEb z;8u>NjP}F(q{t)af&PIA`bPgF$deR26C;8rX+_E5XgnT^AL?Q~gg2SG={rQPym<&U z0dl6Ss{5(Dt*WOHYCvUZybg-#f2-;Zkl_zi^)vFKcrOl<1#uHzChv$}%^+Y&fTF${ z+tb{x>I!aGRV5s_&7gV`{(iuZe+kbqTm;=2_|xGo(3irnH~pLgLSI#djro`dsOJM% zXOQb0F3Nm>rZl*9Z&j1=1Q=I794%HdWaU0LXK5f-@3-)267#yTnH0RexP$!O>$WTO zQiq}o)J#4GY>9OG-1toCfUgqU|3mk0LrIXB{}Az;&EzlsdR$Ac`(5Okzp=joI2bw6 zvi=AeCT`ZSp&`-GXtEUqMlPi2kB@;$?2$ge>hI9Ux!(!Fh^P^bhYgM6QL6mZ{_I-F?n4kHk)Bp7(cp?yw;9~|hv zf7f8Ex78aY^MTD=GEUwOwAtAA*E-nNMrwk4$&ujx+QZRrj}8ux$0kMw=~o%K67-Zl z5B?aJX4*vzxx3Kev!CX*uncJ?xYK7pLr*&tLvAB|ojzen*DjGKI@^V2{U|h(i=FN3 z=fgNB9Rzn};M`}sd=BFi+K?8W{I1JuHL?!Q+$UWR;6c*Y?XwSwY~b}n&_lA_z2Ik| z+gH8*(YzHnknnXSTaO>(Y0?++2}WLxlP5y$g0YK}%?^^?*)Ck&q4gSIDct`9X-0=L delta 2678 zcmZ8jeQZ=!7C(1BI`it(c3Rr$Sfo=0!4GCy+o4|!GZl-khzPD|j6pgnEv@2M=`+*WH^(2yA=*ruh0vp(YfrGgGF>pfO zH5xAkw>?kXEGv}s^b`Q0cA2*E-LK{WVTMh8p71;1@238a@Y~@HQ}4g2M**5+4Dc3L zS@?0tBsX6a44d}u*q`m)*yCEs6nxX=^IJ>eh^eT=(OSTZU%2+;>uyg$Lrhv- z#BRWUxP8on6Yjr^-&I!b8Y!9?@m8$!IslB)13`exUBSZ27e#=Yi?oFR)SUAk&KhTv zrK;w9nLujhNK!GT3MN zMgC2SQM!bv-eDNVapyri<9)<`h3cwiTXj|2q1PPA9@qPSHw-oFT!qo%vedx$?ex5x zRn4(ziOAJDt7a$lA2?)UiZd-Ew7~}G_o`a%T3gm_c~8Vdg)LQU_&1Kd2|G&!fgp>1Wl zpx-(D38^PC#|TKP2em_pYO}~tm>c8ZTxN!+>&S7G%1%=LlU&jSEBsHa$S$I?nPVwo zpA_!F6D4Xc{JMuG{_$5@{wyTttJ<}`6!(29ef_qJgL6+$_0GI2Qwf#}KgyvM{Nc1o z>6ws|952xwWIoLMTtA(nWE4AgO{_M-HGNo2WAuBddIdb$VGcc!86~H9a!o{OvGPSQ z1CY)9iyTWK29Ru_@|tRz8mH?b&_d-Dv1*!)r%<&C&QhwjN3J+BaRc!8_t_Q0xVY|W zKumpqO8Ilp)tHxM%o{w0Y9&%$_3n_~m&j{YL4Tafxk#V%Jbk5}Uhr~ii|H?^CYop% zy_+ys`%`;hR&6}luc!mZc;jw7sxKiwzE*nM>O;IDS~zqkf9Dam%=z;#R9pgr{ve;r z+y?}66HNa=gzV7uw+U8rL>)X9*mx9R++8-SV6~DS2{=;E^mZm-OJ{O(XCm3RtPX-f z2+_$GPX@Z;JzG0B!>YD5t;(XUo0Ua<`EYOBL#7C$XhT#L!l$us8Elp5Gw6{@uifW(;E;Kp6~OGK^s|oF_iU0hbNqEdDjHm{sHZ zfeLm8zX;sAYKGt{d7XYT~$>zKEFJji@>@8E$BjAU*ls< z;!3(-&~AP)wS7&10F*;}%tA`ekJ}=$_g-h$$X;x_5r#@7&Z4_T&VxiNmKH++%$V1N zC@6tW^Ek4{ie-c-B#9sLIR959@!76l#rML?x2G5Uusucs4SFYHc<`Th`>1N`>wGN4 zWq*`v?6sAHbvcN;!%`S6eOH=(^>sc)rz-&{Bb_cWjFwk6HY<dlpVpg8rYKC@QTD^{I* qv1LV+_2R&aXz9Lci5Rv^&Np2io?CIJQf+?Vm7)@@XRX*0UHk__4m!U8 diff --git a/src/main.c b/src/main.c index 40e7a01..b381f0d 100644 --- a/src/main.c +++ b/src/main.c @@ -21,46 +21,18 @@ void check_args(int argc, char *argv[]) { } scanned_path=realpath(_scanned_path, NULL); } -// ulong file_size(char *path) { -// struct stat file_stat; +// Helper to create child paths safely +char* make_child_path(const char* parent, const char* child) { + size_t parent_len = strlen(parent); + size_t child_len = strlen(child); + size_t total = parent_len + child_len + 2; // +2 for '/' and null term -// if (stat(path, &file_stat) == -1) { -// perror("stat failed"); -// return -1; // Return error -// } + char* path = malloc(total); + if (!path) return NULL; -// if (!S_ISREG(file_stat->st_mode)) { -// fputs("Not a regular file\n", stderr); -// return -1; // Not a regular file -// } - -// return file_stat->st_size; // Return size in bytes -// } -// bool is_dir(char *path) { -// struct stat file_stat; - -// if (stat(path, &file_stat) == -1) { -// perror("stat failed"); -// return false; // Return error -// } - -// return S_ISDIR(file_stat->st_mode); -// } -// ulong cluster_size(char *path) { -// struct stat file_stat; - -// if (stat(path, &file_stat) == -1) { -// perror("stat failed"); -// return -1; // Return error -// } - -// if (!S_ISREG(file_stat->st_mode)) { -// fputs("Not a regular file\n", stderr); -// return -1; // Not a regular file -// } - -// return file_stat->st_blocks * 512; -// } + snprintf(path, total, "%s/%s", parent, child); + return path; +} void ls(struct path_node *node, char *path) { // path if(node->path==NULL) node->path=path; @@ -100,36 +72,38 @@ void ls(struct path_node *node, char *path) { if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) continue; - // Print filename (no path, no metadata) - // - char *child_path=node->path; - strcat(child_path, "/"); - strcat(child_path, d->d_name); - - struct stat *file_stat=malloc(sizeof(struct stat)); - // bool is_dir; - if (stat(child_path, file_stat) == -1) { - perror("stat failed"); + // Create child path safely + char* child_path = make_child_path(node->path, d->d_name); + if (!child_path) { + perror("malloc failed"); + continue; } + struct stat file_stat; + if (lstat(child_path, &file_stat) == -1) { // Use lstat to avoid following symlinks + perror("stat failed"); + free(child_path); + continue; + } + + // Determine file type + const char* type = "OTHER"; + long path_size=0; - switch (file_stat->st_mode & S_IFMT) { - case S_IFREG: - path_size=file_stat->st_size; - printf("FILE\t%ld\t%s\n", path_size, child_path); - break; - case S_IFDIR: - path_size=file_stat->st_blocks*512; - printf("DIR\t%ld\t%s/\n", path_size, child_path); - break; - default: - printf("UNKNOWN\t%ld\t%s\n", path_size, child_path); - break; + + if (S_ISREG(file_stat.st_mode)) { + type = "FILE"; + path_size = file_stat.st_size; + } + else if (S_ISDIR(file_stat.st_mode)) { + type = "DIR"; + path_size = file_stat.st_blocks * 512; } + // Add more types (LNK, FIFO, etc) later? + + // store to struct + printf("%s\t%ld\t%s\n", type, path_size, d->d_name); free(child_path); - // free(file_stat); - // free(d); - printf("next...\n"); } } diff --git a/src/tmp1.c b/src/tmp1.c new file mode 100644 index 0000000..747bd38 --- /dev/null +++ b/src/tmp1.c @@ -0,0 +1,57 @@ +/* +// Helper to create child paths safely +char* make_child_path(const char* parent, const char* child) { + size_t parent_len = strlen(parent); + size_t child_len = strlen(child); + size_t total = parent_len + child_len + 2; // +2 for '/' and null term + + char* path = malloc(total); + if (!path) return NULL; + + snprintf(path, total, "%s/%s", parent, child); + return path; +} + +// Inside your directory processing loop: +d = (struct linux_dirent64*)(buf + bpos); +bpos += d->d_reclen; + +// Skip . and .. +if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) + continue; + +// Create child path safely +char* child_path = make_child_path(node->path, d->d_name); +if (!child_path) { + perror("malloc failed"); + continue; +} + +// Use stack variable for stat (no allocation) +struct stat file_stat; +if (lstat(child_path, &file_stat) == -1) { // Use lstat to avoid following symlinks + perror("stat failed"); + free(child_path); + continue; +} + +// Determine file type +const char* type = "OTHER"; +long path_size = 0; + +if (S_ISREG(file_stat.st_mode)) { + type = "FILE"; + path_size = file_stat.st_size; +} +else if (S_ISDIR(file_stat.st_mode)) { + type = "DIR"; + // For directory metadata size only (not contents!) + path_size = file_stat.st_blocks * 512; +} +// Add more types (LNK, FIFO, etc) as needed + +printf("%s\t%ld\t%s\n", type, path_size, d->d_name); + +// Cleanup +free(child_path); +*/ \ No newline at end of file diff --git a/src/tmp2.c b/src/tmp2.c new file mode 100644 index 0000000..68b3d11 --- /dev/null +++ b/src/tmp2.c @@ -0,0 +1,39 @@ +/* +d = (struct linux_dirent64 *)(buf + bpos); +bpos += d->d_reclen; + +// Skip . and .. entries +if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) + continue; + +// Print filename (no path, no metadata) +// +char *child_path=node->path; +strcat(child_path, "/"); +strcat(child_path, d->d_name); + +struct stat *file_stat=malloc(sizeof(struct stat)); +// bool is_dir; +if (stat(child_path, file_stat) == -1) { + perror("stat failed"); +} + +long path_size = 0; +switch (file_stat->st_mode & S_IFMT) { + case S_IFREG: + path_size=file_stat->st_size; + printf("FILE\t%ld\t%s\n", path_size, child_path); + break; + case S_IFDIR: + path_size=file_stat->st_blocks*512; + printf("DIR\t%ld\t%s/\n", path_size, child_path); + break; + default: + printf("UNKNOWN\t%ld\t%s\n", path_size, child_path); + break; +} +free(child_path); +// free(file_stat); +// free(d); +printf("next...\n"); +*/ \ No newline at end of file