/* Note: This is testing characters in the Latin2 set, but the * encoding is still UTF-8 as it must be for libguestfs. */ static void test_latin2 (guestfs_h *g, const struct filesystem *fs) { /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ const char O_dacute[] = { 0xc5, 0x90, 0 }; const char slash_O_dacute[] = { '/', 0xc5, 0x90, 0 }; /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */ const char o_dacute[] = { 0xc5, 0x91, 0 }; const char slash_o_dacute[] = { '/', 0xc5, 0x91, 0 }; char **files; size_t count; if (guestfs_touch (g, slash_O_dacute) == -1) exit (EXIT_FAILURE); if (guestfs_touch (g, slash_o_dacute) == -1) exit (EXIT_FAILURE); /* Read list of files, check for case sensitivity. */ files = guestfs_ls (g, "/"); if (files == NULL) exit (EXIT_FAILURE); ignore_lost_and_found (files); count = guestfs___count_strings (files); if (fs->fs_case_insensitive) { /* case insensitive */ if (count != 1) error (EXIT_FAILURE, 0, "error: %s: %s is supposed to be case-insensitive, but %zu files " "(instead of 1) were returned", __func__, fs->fs_name, count); if (memcmp (files[0], o_dacute, 3) != 0 && memcmp (files[0], O_dacute, 3) != 0) error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected filename '%s'", __func__, fs->fs_name, files[0]); } else { /* case sensitive */ if (count != 2) error (EXIT_FAILURE, 0, "error: %s: %s is supposed to be case-sensitive, but %zu files " "(instead of 2) were returned", __func__, fs->fs_name, count); if (memcmp (files[0], O_dacute, 3) != 0 || memcmp (files[1], o_dacute, 3) != 0) error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected filenames '%s' and '%s'", __func__, fs->fs_name, files[0], files[1]); if (guestfs_rm (g, slash_O_dacute) == -1) exit (EXIT_FAILURE); } if (guestfs_rm (g, slash_o_dacute) == -1) exit (EXIT_FAILURE); }
static void test_ascii (guestfs_h *g, const struct filesystem *fs) { char **files; size_t count; /* Create various ASCII-named files. */ if (guestfs_touch (g, "/ABC") == -1) exit (EXIT_FAILURE); if (guestfs_touch (g, "/def") == -1) exit (EXIT_FAILURE); if (guestfs_touch (g, "/abc") == -1) exit (EXIT_FAILURE); /* Read list of files, check for case sensitivity. */ files = guestfs_ls (g, "/"); if (files == NULL) exit (EXIT_FAILURE); ignore_lost_and_found (files); count = guestfs___count_strings (files); if (fs->fs_case_insensitive) { /* case insensitive */ if (count != 2) error (EXIT_FAILURE, 0, "error: %s: %s is supposed to be case-insensitive, but %zu files " "(instead of 2) were returned", __func__, fs->fs_name, count); if (STRCASENEQ (files[0], "abc") || STRCASENEQ (files[1], "def")) error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected filenames '%s' and '%s'", __func__, fs->fs_name, files[0], files[1]); } else { /* case sensitive */ if (count != 3) error (EXIT_FAILURE, 0, "error: %s: %s is supposed to be case-sensitive, but %zu files " "(instead of 3) were returned", __func__, fs->fs_name, count); if (STRNEQ (files[0], "ABC") == -1 || STRNEQ (files[1], "abc") == -1 || STRNEQ (files[2], "def") == -1) error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected filenames '%s', '%s', '%s'", __func__, fs->fs_name, files[0], files[1], files[2]); if (guestfs_rm (g, "/abc") == -1) exit (EXIT_FAILURE); } if (guestfs_rm (g, "/ABC") == -1) exit (EXIT_FAILURE); if (guestfs_rm (g, "/def") == -1) exit (EXIT_FAILURE); }
static int do_log (void) { CLEANUP_FREE_STRING_LIST char **roots = NULL; char *root; CLEANUP_FREE char *type = NULL; CLEANUP_FREE_STRING_LIST char **journal_files = NULL; /* Get root mountpoint. fish/inspect.c guarantees the assertions * below. */ roots = guestfs_inspect_get_roots (g); assert (roots); assert (roots[0] != NULL); assert (roots[1] == NULL); root = roots[0]; type = guestfs_inspect_get_type (g, root); if (!type) return -1; /* Windows needs special handling. */ if (STREQ (type, "windows")) { if (guestfs_inspect_get_major_version (g, root) >= 6) return do_log_windows_evtx (); fprintf (stderr, _("%s: Windows Event Log for pre-Vista guests is not supported.\n"), guestfs_int_program_name); return -1; } /* systemd journal? */ guestfs_push_error_handler (g, NULL, NULL); journal_files = guestfs_ls (g, JOURNAL_DIR); guestfs_pop_error_handler (g); if (STREQ (type, "linux") && journal_files != NULL && journal_files[0] != NULL) return do_log_journal (); /* Regular /var/log text files with different names. */ if (STRNEQ (type, "windows")) { const char *logfiles[] = { "/var/log/syslog", "/var/log/messages", NULL }; size_t i; for (i = 0; logfiles[i] != NULL; ++i) { if (guestfs_is_file_opts (g, logfiles[i], GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) == 1) return do_log_text_file (logfiles[i]); } } /* Otherwise, there are no log files. Hmm, is this right? XXX */ return 0; }
static void test_chinese (guestfs_h *g, const struct filesystem *fs) { /* Various Simplified Chinese characters from: * https://secure.wikimedia.org/wikipedia/en/wiki/Chinese_characters#Comparisons_of_traditional_Chinese.2C_simplified_Chinese.2C_and_Japanese */ char filenames[][5] = { { '/', 0xe7, 0x94, 0xb5, 0 }, { '/', 0xe4, 0xb9, 0xb0, 0 }, { '/', 0xe5, 0xbc, 0x80, 0 }, { '/', 0xe4, 0xb8, 0x9c, 0 }, { '/', 0xe8, 0xbd, 0xa6, 0 }, { '/', 0xe7, 0xba, 0xa2, 0 }, }; const size_t nr_filenames = sizeof filenames / sizeof filenames[0]; size_t i, j; char **files; size_t count; for (i = 0; i < nr_filenames; ++i) { if (guestfs_touch (g, filenames[i]) == -1) exit (EXIT_FAILURE); } /* Check the filenames. */ files = guestfs_ls (g, "/"); if (files == NULL) exit (EXIT_FAILURE); ignore_lost_and_found (files); count = guestfs___count_strings (files); if (count != nr_filenames) error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected number of files " "(%zu, expecting %zu)", __func__, fs->fs_name, count, nr_filenames); for (j = 0; j < count; ++j) { for (i = 0; i < nr_filenames; ++i) if (memcmp (files[j], &filenames[i][1], 4) == 0) goto next; error (EXIT_FAILURE, 0, "error: %s: %s returned unexpected filename '%s'", __func__, fs->fs_name, files[j]); next:; } for (i = 0; i < nr_filenames; ++i) if (guestfs_rm (g, filenames[i]) == -1) exit (EXIT_FAILURE); }
static int do_ls (const char *dir) { size_t i; CLEANUP_FREE_STRING_LIST char **lines = guestfs_ls (g, dir); if (lines == NULL) return -1; for (i = 0; lines[i] != NULL; ++i) printf ("%s\n", lines[i]); return 0; }