Finding Cycles in a UNIX File System

Let’s learn how to find cycles in a UNIX file system.

We'll cover the following

This lesson implements a practical UNIX command-line utility that can find cycles (loops) in UNIX file systems. The idea behind the utility is that with UNIX symbolic links, there is a possibility to create cycles in our file system. This can perplex backup software such as tar(1) or utilities such as find(1) and can create security-related issues. The presented utility, which is called FScycles.go, tries to inform us about such situations.

Coding example

The idea behind the solution is that we keep every visited directory path in a map, and if a path appears for the second time, then we have a cycle. The map is called visited and is defined as map[string]int.

Note: If we are wondering why we are using a string and not a byte slice or some other kind of slice as the key for the visited map, it is because maps cannot have slices as keys because slices are not comparable.

The output of the utility depends on the root path used for initializing the search process—that path is given as a command-line argument to the utility.

The filepath.Walk() function does not traverse symbolic links by design in order to avoid cycles. However, in our case, we want to traverse symbolic links to directories in order to discover loops. We solve that issue in a while.

The utility uses IsDir(), which is a function that helps us to identify directories—we are only interested in directories because only directories and symbolic links to directories can create cycles in file systems. Lastly, the utility uses os.Lstat() because it can handle symbolic links. Additionally, os.Lstat() returns information about the symbolic link without following it, which is not the case with os.Stat()—in this case we do not want to automatically follow symbolic links.

The important code of FScycles.go can be found in the implementation of walkFunction():

Get hands-on with 1200+ tech skills courses.