How to use the Linux cat command to read the contents of a folder. This is a cool trick.

This is a neat trick that allows you to use cat to view the contents of a directory. This library is loaded before the cat command is executed and modifies its behavior to allow you to use cat to list a directory.

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#define unlikely(x)     __builtin_expect((x),0)
#define min(x,y)    (x<y?x:y)
 
ssize_t read(int fildes, void *buf, size_t nbyte)
{
	struct stat statbuf;
	ssize_t r;
 
	fstat(fildes, &statbuf);
 
	if (unlikely(S_ISDIR(statbuf.st_mode))) {
		DIR *fdir;
		struct dirent *dent;
		char *dbuf;
		ssize_t bytes;
 
		fdir = fdopendir(fildes);
		if (!fdir) {
			perror("failed to fdopendir()");
			goto out;
		}
 
		dbuf = malloc(nbyte);
		if (!dbuf) {
			perror("failed to create buffer");
			closedir(fdir);
			goto out;
		}
		memset(dbuf, 0, nbyte);
 
		bytes = 0;
		do {
			size_t sbytes;
 
			if ((dent = readdir(fdir)) != NULL) {
				if (strcmp(dent->d_name, ".") == 0
				    || strcmp(dent->d_name, "..") == 0)
					continue;
 
				sbytes = strlen(dent->d_name);
				/*fprintf(stderr,"nbyte=%zu\tbytes=%zu\tsbytes=%zu\n",
				   nbyte, bytes, sbytes); */
				if (bytes + sbytes > nbyte)
					break;
				else
					bytes += sbytes;
 
				sprintf(dbuf, "%s %s", dbuf, dent->d_name);
			}
		} while (dent != NULL);
 
		r = min(bytes, nbyte);
		strncpy(buf, dbuf, r);
 
		free(dbuf);
	} else {
		r = __read(fildes, buf, nbyte);
	}
 
out:
	return r;
}

Use this command to compile the source and generate an .so file ready for the next step.

john@adeptus-mechanicus ~/Documents $ gcc read.c -shared -fPIC -o read.so

This is the command you execute to display the output. Loading the .so file beforehand with LD_PRELOAD.

john@adeptus-mechanicus ~/Documents $ LD_PRELOAD=./read.so cat /tmp
 matecorba-john kde-kdm ksocket-kdm CRX_75DAF8CB7768 mc-john .X11-unix gpg-mycPmO .org.chromium.Chromium.Dg3HqG .ICE-unix pulse-PKdhtXMmr18n hsperfdata_john orbit-john .org.chromium.Chromium.S0goZW mintUpdate pluma.john.566659727 ssh-u0IliDldwVqq .X0-lock unity_support_test.0 pulse-qvjohn@adeptus-mechanicus

And now you have listed the contents of a folder with the cat command using a bit of trickery in the process. This could be useful I guess, but you need to load the .so library every time you want this to work. but a very nice trick to show off with for sure.

1 responses to “How to use the Linux cat command to read the contents of a folder. This is a cool trick.

Leave a Reply