ReadDir with WASIX
This sample project demonstrates how to read directories in WASIX.
Prerequisites
Please check that you have the latest version of wasmer runtime as this tutorial depends on version 4.1.1 or higher.
The project requires the following tools to be installed on your system:
Start a new project
Create a new directory for your project:
$ mkdir wasix-readdir
$ cd wasix-readdir
Make a new file called readdir.c:
$ touch readdir.c
Link the SysRoot
You need to link the SysRoot to your project. The SysRoot is a directory that contains the WASI libc headers and libraries. The SysRoot is located in the Wasix-libc binary or you can compile it yourself.
Writing the Application
Basic Application Setup
We want to write a simple C program that demonstrates how to use the opendir
and readdir
functions to read the contents of a directory. It takes a single command-line argument, which is the path to the directory to read.
Let's write code for the above:
#include <stdio.h>
#include <string.h>
#include <sys/random.h>
#include <unistd.h>
#include <dirent.h> // header file for functions for accessing directories
/**
* Recursive function to print the directory entries
*/
int print_dir(char *name)
{
/**
* Return here or else the program will go into infinite recursion
*/
if (strcmp(name, "..") == 0 || strcmp(name, ".") == 0 || name == NULL)
{
return 1;
}
DIR *d = opendir(name); // open the directory and return a pointer to the directory stream
for (;;)
{
struct dirent *ent = readdir(d); // read the next directory entry from the directory stream
if (ent == NULL)
{
break;
}
if (strcmp(ent->d_name, "..") == 0 || strcmp(ent->d_name, ".") == 0)
{
continue;
}
printf("dir entry name - '%s'\n", ent->d_name);
/**
* If the entry is a directory then recursively call the function
*/
print_dir(ent->d_name);
}
return 0;
}
int main(int argc, char **argv)
{
/**
* If the length of arguments is not equal to 2 then print the usage and return
*/
if (argc != 2)
{
fprintf(stderr, "usage: %s <dir>\n", argv[0]);
return 1;
}
char *name = argv[1]; // name of the directory
printf("main: just before opening dir '%s'\n", name);
fflush(stdout);
// call the recursive function
print_dir(name);
return 0;
}
The main
function takes the directory name as a command-line argument and calls the print_dir
function to print the contents of the directory.
Compiling the Application
Let's compile the application with WASIX:
$ /path/to/wasix-sdk/clang readdir.c --target="wasm32-wasi" -o readdir.wasm
It's compiling! Now, let's try to run it:
$ wasmer run readdir.wasm /
main: just before opening dir '/'
dir entry name - '.app'
dir entry name - '.private'
dir entry name - 'bin'
dir entry name - 'dev'
dir entry name - 'etc'
dir entry name - 'tmp'
Yaay, It works!
Conclusion
In this tutorial we learned:
- How to write a simple C program that uses the
opendir
andreaddir
functions to read the contents of a directory - Compiling a C program with WASIX