+ int fd_value = atoi(fd_number->d_name);
+
+ if(fd_value < 3)
+ continue;
+
+ const size_t source_size = 25;
+ char source[25];
+ if (snprintf(source, source_size, "/proc/self/fd/%s", fd_number->d_name) > source_size)
+ xbt_die("Unexpected buffer is too small for fd %s", fd_number->d_name);
+
+ const size_t link_size = 200;
+ char link[200];
+ int res = readlink(source, link, link_size);
+ if (res<0) {
+ xbt_die("Could not read link for %s", source);
+ }
+ if (res==200) {
+ xbt_die("Buffer to small for link of %s", source);
+ }
+ link[res] = '\0';
+
+ if(smpi_is_privatisation_file(link))
+ continue;
+
+ // This is (probably) the DIR* we are reading:
+ // TODO, read all the file entries at once and close the DIR.*
+ if(strcmp(fd_dir_path, link) == 0)
+ continue;
+
+ // We don't handle them.
+ // It does not mean we should silently ignore them however.
+ if (strncmp(link, "pipe:", 5) == 0 || strncmp(link, "socket:", 7) == 0)
+ continue;
+
+ // This is probably a shared memory used by lttng-ust:
+ if(strncmp("/dev/shm/ust-shm-tmp-", link, 21)==0)
+ continue;
+
+ // Add an entry for this FD in the snapshot:
+ fd_infos_t fd = xbt_new0(s_fd_infos_t, 1);
+ fd->filename = strdup(link);
+ fd->number = fd_value;
+ fd->flags = fcntl(fd_value, F_GETFL) | fcntl(fd_value, F_GETFD) ;
+ fd->current_position = lseek(fd_value, 0, SEEK_CUR);
+ snapshot->current_fd = xbt_realloc(snapshot->current_fd, (total_fd + 1) * sizeof(fd_infos_t));
+ snapshot->current_fd[total_fd] = fd;
+ total_fd++;
+ }
+
+ snapshot->total_fd = total_fd;
+ closedir (fd_dir);
+}
+
+static s_mc_address_space_class_t mc_snapshot_class = {
+ .read = (void*) &MC_snapshot_read
+};
+
+mc_snapshot_t MC_take_snapshot(int num_state)
+{
+ mc_process_t mc_process = &mc_model_checker->process;