В контейнере на основе изображений arm32 readdir возвращает EOVERFLOW, когда каталог пуст. - PullRequest
2 голосов
/ 29 мая 2020

После вызова функции readdir в программе C в контейнере на основе arm32, выполняющемся на хосте Ubuntu 19.10 на базе x64, вызов возвращает EOVERFLOW для пустых каталогов (например, / mnt, / media) вместо возврата 0.

Наблюдали ли другие за этой проблемой? Это проблема конфигурации? Если да, то как это можно исправить?

Версии:

  • Гость: debian: buster- backports@sha256: 8f27850df2144df1598b5c76b213616ecaab08e804a6d84ddace1455d8cbd9f010
  • Версия Qemu: 1: 4.0 + dfsg-0ubuntu9.6

Шаги воспроизведения:

  • Создайте образ с именем crystal-for-buster-armhf: v1 на основе Debian Buster для arm32 с помощью Dockerfile и сборки. sh сценарий доступен здесь .
  • Запустить контейнер на основе этого изображения.
  • Скомпилируйте и соберите приведенную ниже программу.
  • Выполните полученный исполняемый файл с именем каталога в качестве аргумента командной строки.
#define _POSIX_SOURCE
#include <dirent.h>
#include <errno.h>
#include <sys/types.h>
#undef _POSIX_SOURCE
#include <stdio.h>

main(int argc, char* argv[]) {
  DIR *dir;
  struct dirent *entry;

  if ((dir = opendir(argv[1])) == NULL)
    perror("opendir() error");
  else {
    puts("contents:");
    while (1) {
      errno = 0;
      entry = readdir(dir);
      if (entry == NULL) {
        printf("Errno: %d   EOVERFLOW: %d\n", errno, EOVERFLOW);
        break;
      }
      printf("  %s\n", entry->d_name);
    }
    closedir(dir);
  }
}

1 Ответ

0 голосов
/ 29 мая 2020

Если вы используете glib c (большинство систем на основе Linux), вам необходимо компилировать с -D_FILE_OFFSET_BITS=64. По умолчанию по-прежнему 32-битный off_t, а вместе с ним 32-битный ino_t, и в такой конфигурации readdir, stat, et c. завершится ошибкой с кодом EOVERFLOW, если номер inode не умещается в 32 бита. Многие современные файловые системы всегда имеют номера inode, которые не умещаются в 32 бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...