[LTP] [PATCH 1/2] syscalls/readdir01: Convert to new API
zhanglianjie
zhanglianjie@uniontech.com
Fri Oct 8 14:37:58 CEST 2021
Hi,
I will resubmit after revision, thank you for your review.
On 2021-10-07 19:35, Cyril Hrubis wrote:
> Hi!
>> +static void setup(void)
>> +{
>> + sprintf(prefix, "%s_%d.", "readdirfile", getpid());
>
> Since the test runs in it's own temporary directory there is no need to
> prefix everything with the pid.
>
>> +}
>>
>> -/***********************************************************************
>> - * Main
>> - ***********************************************************************/
>> -int main(int ac, char **av)
>> +static void verify_readdir(void)
>> {
>> - int lc;
>> - int cnt;
>> - int nfiles, fd;
>> + int i;
>> + int fd;
>> + int cnt = 0;
>> char fname[255];
>> DIR *test_dir;
>> struct dirent *dptr;
>>
>> - tst_parse_opts(ac, av, options, &help);
>> -
>> - if (Nflag) {
>> - if (sscanf(Nfilearg, "%i", &Nfiles) != 1) {
>> - tst_brkm(TBROK, NULL, "--N option arg is not a number");
>> - }
>> + for (i = 0; i < nfiles; i++) {
>> + sprintf(fname, "%s_%d", prefix, i);
>> + fd = SAFE_OPEN(fname, O_RDWR | O_CREAT, 0700);
>> + SAFE_WRITE(1, fd, "hello\n", 6);
>> + SAFE_CLOSE(fd);
>> }
>
> This loop could be moved to the test setup, there is no need to
> re-create the files on each iteration.
>
>>
>> - /***************************************************************
>> - * perform global setup for test
>> - ***************************************************************/
>> - /* Next you should run a setup routine to make sure your environment is
>> - * sane.
>> - */
>> - setup();
>> -
>> - /***************************************************************
>> - * check looping state
>> - ***************************************************************/
>> - /* TEST_LOOPING() is a macro that will make sure the test continues
>> - * looping according to the standard command line args.
>> - */
>> - for (lc = 0; TEST_LOOPING(lc); lc++) {
>> -
>> - tst_count = 0;
>> -
>> - if (Nfiles)
>> - nfiles = Nfiles;
>> - else
>> - /* min of 10 links and max of a 100 links */
>> - nfiles = (lc % 90) + 10;
>> -
>> - /* create a bunch of files to look at */
>> - for (cnt = 0; cnt < nfiles; cnt++) {
>> -
>> - sprintf(fname, "%s%d", Basename, cnt);
>> - if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1) {
>> - tst_brkm(TBROK, cleanup,
>> - "open(%s, O_RDWR|O_CREAT,0700) Failed, errno=%d : %s",
>> - fname, errno, strerror(errno));
>> - } else if (write(fd, "hello\n", 6) < 0) {
>> - tst_brkm(TBROK, cleanup,
>> - "write(%s, \"hello\\n\", 6) Failed, errno=%d : %s",
>> - fname, errno, strerror(errno));
>> - } else if (close(fd) < 0) {
>> - tst_resm(TWARN,
>> - "close(%s) Failed, errno=%d : %s",
>> - fname, errno, strerror(errno));
>> - }
>> - }
>> -
>> - if ((test_dir = opendir(".")) == NULL) {
>> - tst_resm(TFAIL, "opendir(\".\") Failed, errno=%d : %s",
>> - errno, strerror(errno));
>> - } else {
>> - /* count the entries we find to see if any are missing */
>> - cnt = 0;
>> - errno = 0;
>> - while ((dptr = readdir(test_dir)) != 0) {
>> - if (strcmp(dptr->d_name, ".")
>> - && strcmp(dptr->d_name, ".."))
>> - cnt++;
>> - }
>> -
>> - if (errno != 0) {
>> - tst_resm(TFAIL,
>> - "readir(test_dir) Failed on try %d, errno=%d : %s",
>> - cnt + 1, errno, strerror(errno));
>> - }
>> - if (cnt == nfiles) {
>> - tst_resm(TPASS,
>> - "found all %d that were created",
>> - nfiles);
>> - } else if (cnt > nfiles) {
>> - tst_resm(TFAIL,
>> - "found more files than were created");
>> - tst_resm(TINFO, "created: %d, found: %d",
>> - nfiles, cnt);
>> - } else {
>> - tst_resm(TFAIL,
>> - "found less files than were created");
>> - tst_resm(TINFO, "created: %d, found: %d",
>> - nfiles, cnt);
>> - }
>> - }
>> -
>> - /* Here we clean up after the test case so we can do another iteration.
>> - */
>> - for (cnt = 0; cnt < nfiles; cnt++) {
>> -
>> - sprintf(fname, "%s%d", Basename, cnt);
>> -
>> - if (unlink(fname) == -1) {
>> - tst_resm(TWARN,
>> - "unlink(%s) Failed, errno=%d : %s",
>> - Fname, errno, strerror(errno));
>> - }
>> - }
>> -
>> + test_dir = SAFE_OPENDIR(".");
>> + while ((dptr = SAFE_READDIR(test_dir)) != 0) {
>> + if (strcmp(dptr->d_name, ".")
>> + && strcmp(dptr->d_name, ".."))
>> + cnt++;
>> }
>
> I would have probably written this as:
>
> while ((ent = SAFE_READDIR(test_dir))) {
> if (!strcmp(ent->d_name, "." || !strcmp(ent->d_name, ".")
> continue;
>
> cnt++;
> }
>
> Also I guess that we can check that the filename is filled correctly as
> well, it has to start with prefix at least.
>
>> - /***************************************************************
>> - * cleanup and exit
>> - ***************************************************************/
>> - cleanup();
>> -
>> - tst_exit();
>> -}
>> -
>> -/***************************************************************
>> - * help
>> - ***************************************************************/
>> -/* The custom help() function is really simple. Just write your help message to
>> - * standard out. Your help function will be called after the standard options
>> - * have been printed
>> - */
>> -void help(void)
>> -{
>> - printf(" -N #files : create #files files every iteration\n");
>> -}
>> -
>> -/***************************************************************
>> - * setup() - performs all ONE TIME setup for this test.
>> - ***************************************************************/
>> -void setup(void)
>> -{
>> - /* You will want to enable some signal handling so you can capture
>> - * unexpected signals like SIGSEGV.
>> - */
>> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
>> -
>> - /* One cavet that hasn't been fixed yet. TEST_PAUSE contains the code to
>> - * fork the test with the -c option. You want to make sure you do this
>> - * before you create your temporary directory.
>> - */
>> - TEST_PAUSE;
>> -
>> - /* If you are doing any file work, you should use a temporary directory. We
>> - * provide tst_tmpdir() which will create a uniquely named temporary
>> - * directory and cd into it. You can now create files in the current
>> - * directory without worrying.
>> - */
>> - tst_tmpdir();
>> -
>> - sprintf(Basename, "%s_%d.", BASENAME, getpid());
>> + if (cnt == nfiles) {
>> + tst_res(TPASS,
>> + "found all %d that were created",
>> + nfiles);
>> + } else {
>> + tst_res(TFAIL,
>> + "found %s files than were created, created: %d, found: %d",
>> + cnt > nfiles ? "more" : "less", nfiles, cnt);
>> + }
>
> Why the newline after TPASS, TFAIL, ? We indent the format string as if
> it continued after the TFAIL/TPASS anyways.
>
--
Regards,
Zhang Lianjie
More information about the ltp
mailing list