[LTP] [PATCH 1/6] Rewrite utime01.c using new LTP API
Cyril Hrubis
chrubis@suse.cz
Tue Jun 21 12:17:52 CEST 2022
Hi!
> +/*\
> + * [Description]
Please add newline after the [Description]
> + * Verify that the system call utime() successfully changes the last
> + * access and modification times of a file to the current time if the
> + * times argument is NULL and the user ID of the process is "root".
^
Just single space here please.
> */
>
> -#include <stdio.h>
> -#include <unistd.h>
> -#include <sys/types.h>
> -#include <errno.h>
> -#include <fcntl.h>
> #include <utime.h>
> -#include <string.h>
> -#include <sys/stat.h>
> -#include <signal.h>
> -#include <time.h>
> -
> -#include "test.h"
> -#include "safe_macros.h"
> -
> -#define TEMP_FILE "tmp_file"
> -#define FILE_MODE S_IRUSR | S_IRGRP | S_IROTH
>
> -char *TCID = "utime01";
> -int TST_TOTAL = 1;
> -time_t curr_time; /* current time in seconds */
> +#include "tst_test.h"
> +#include "tst_clocks.h"
>
> -void setup(); /* Main setup function of test */
> -void cleanup(); /* cleanup function for the test */
> +#define MNT_POINT "mntpoint"
> +#define TEMP_FILE MNT_POINT"/tmp_file"
> +#define FILE_MODE 0444
>
> -int main(int ac, char **av)
> +static void setup(void)
> {
> - struct stat stat_buf; /* struct buffer to hold file info. */
> - int lc;
> - long type;
> - time_t modf_time, access_time;
> - time_t pres_time; /* file modification/access/present time */
> -
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - setup();
> -
> - switch ((type = tst_fs_type(cleanup, "."))) {
> - case TST_NFS_MAGIC:
> - if (tst_kvercmp(2, 6, 18) < 0)
> - tst_brkm(TCONF, cleanup, "Cannot do utime on a file"
> - " on %s filesystem before 2.6.18",
> - tst_fs_type_name(type));
> - break;
> - case TST_V9FS_MAGIC:
> - tst_brkm(TCONF, cleanup,
> - "Cannot do utime on a file on %s filesystem",
> - tst_fs_type_name(type));
> - break;
> - }
> -
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> - tst_count = 0;
> -
> - /*
> - * Invoke utime(2) to set TEMP_FILE access and
> - * modification times to the current time.
> - */
> - TEST(utime(TEMP_FILE, NULL));
> -
> - if (TEST_RETURN == -1) {
> - tst_resm(TFAIL|TTERRNO, "utime(%s) failed", TEMP_FILE);
> - } else {
> - /*
> - * Sleep for a second so that mod time and
> - * access times will be different from the
> - * current time
> - */
> - sleep(2);
> -
> - /*
> - * Get the current time now, after calling
> - * utime(2)
> - */
> - pres_time = time(NULL);
> -
> - /*
> - * Get the modification and access times of
> - * temporary file using stat(2).
> - */
> - SAFE_STAT(cleanup, TEMP_FILE, &stat_buf);
> - modf_time = stat_buf.st_mtime;
> - access_time = stat_buf.st_atime;
> -
> - /* Now do the actual verification */
> - if (modf_time <= curr_time ||
> - modf_time >= pres_time ||
> - access_time <= curr_time ||
> - access_time >= pres_time) {
> - tst_resm(TFAIL, "%s access and "
> - "modification times not set",
> - TEMP_FILE);
> - } else {
> - tst_resm(TPASS, "Functionality of "
> - "utime(%s, NULL) successful",
> - TEMP_FILE);
> - }
> - }
> - tst_count++;
> - }
> -
> - cleanup();
> - tst_exit();
> + SAFE_TOUCH(TEMP_FILE, FILE_MODE, NULL);
> }
>
> -/*
> - * void
> - * setup() - performs all ONE TIME setup for this test.
> - * Create a temporary directory and change directory to it.
> - * Create a test file under temporary directory and close it
> - */
> -void setup(void)
> +static void run(void)
> {
> - int fildes; /* file handle for temp file */
> -
> - tst_require_root();
> -
> - tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> - TEST_PAUSE;
> -
> - tst_tmpdir();
> -
> - /* Creat a temporary file under above directory */
> - fildes = SAFE_CREAT(cleanup, TEMP_FILE, FILE_MODE);
> -
> - /* Close the temporary file created */
> - SAFE_CLOSE(cleanup, fildes);
> -
> - /* Get the current time */
> - curr_time = time(NULL);
> + struct stat stat_buf;
> + time_t pre_time, post_time;
The utime03.c makes sure that the actime and modtime are different from
a current time by explicitly setting it before we call utime() with NULL
argument. Can we do the same here please?
> + pre_time = tst_get_fs_timestamp();
> + TST_EXP_PASS(utime(TEMP_FILE, NULL), "utime(%s, NULL)", TEMP_FILE);
> + if (!TST_PASS) {
> + tst_res(TFAIL | TTERRNO, "utime(%s) failed", TEMP_FILE);
> + return;
> + }
> + post_time = tst_get_fs_timestamp();
> + SAFE_STAT(TEMP_FILE, &stat_buf);
>
> - /*
> - * Sleep for a second so that mod time and access times will be
> - * different from the current time
> - */
> - sleep(2); /* sleep(1) on IA64 sometimes sleeps < 1 sec!! */
> + if (stat_buf.st_mtime < pre_time || stat_buf.st_mtime > post_time)
> + tst_res(TFAIL, "utime() did not set expected mtime");
>
> + if (stat_buf.st_atime < pre_time || stat_buf.st_atime > post_time)
> + tst_res(TFAIL, "utime() did not set expected atime");
Jan just send a similar patch that prints the pre_time and post_time as
well to aid debuggin, can you pleas add that too?
See: http://patchwork.ozlabs.org/project/ltp/patch/e942179576028d20ad2c381d442fefec1af6a556.1655797247.git.jstancek@redhat.com/
> }
>
> -/*
> - * void
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - * completion or premature exit.
> - * Remove the test directory and testfile created in the setup.
> - */
> -void cleanup(void)
> -{
> -
> - tst_rmdir();
> -
> -}
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> + .needs_root = 1,
> + .needs_tmpdir = 1,
> + .mntpoint = MNT_POINT,
> + .mount_device = 1,
> + .all_filesystems = 1,
> + .skip_filesystems = (const char *const[]) {
> + "vfat",
> + "exfat",
> + NULL
> + }
> +};
Otherwise the changes looks good.
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list