a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync/* $Id$ */
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync/** @file
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * IPRT Testcase - Directory listing & filtering (no parameters needed).
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync */
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2011 Oracle Corporation
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync *
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * available from http://www.virtualbox.org. This file is free software;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * General Public License (GPL) as published by the Free Software
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync *
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * The contents of this file may alternatively be used under the terms
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * of the Common Development and Distribution License Version 1.0
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * CDDL are applicable instead of those of the GPL.
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync *
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * You may elect to license modified versions of this file under the
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync * terms and conditions of either the GPL or the CDDL or both.
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync */
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync#include <iprt/dir.h>
5eabf773597082761832bc0a32b3660e8771f9f1vboxsync#include <iprt/path.h>
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync#include <iprt/stream.h>
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync#include <iprt/err.h>
5eabf773597082761832bc0a32b3660e8771f9f1vboxsync#include <iprt/initterm.h>
5eabf773597082761832bc0a32b3660e8771f9f1vboxsync#include <iprt/string.h>
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsyncstatic int tstDirOpenFiltered(const char *pszFilter, unsigned *pcFilesMatch, int *pRc)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync{
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync int rcRet = 0;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync unsigned cFilesMatch = 0;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync PRTDIR pDir;
939e2ecb812c6402abcc63e7d615c5444acfd02evboxsync int rc = RTDirOpenFiltered(&pDir, pszFilter, RTDIRFILTER_WINNT, 0);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (RT_SUCCESS(rc))
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync for (;;)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTDIRENTRY DirEntry;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rc = RTDirRead(pDir, &DirEntry, NULL);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (RT_FAILURE(rc))
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync break;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync cFilesMatch++;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (rc != VERR_NO_MORE_FILES)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: Enumeration '%s' failed! rc=%Rrc\n", pszFilter, rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet = 1;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync /* close up */
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rc = RTDirClose(pDir);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (RT_FAILURE(rc))
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: Failed to close dir '%s'! rc=%Rrc\n", pszFilter, rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet = 1;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync else
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: Failed to open '%s', rc=%Rrc\n", pszFilter, rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet = 1;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync *pcFilesMatch = cFilesMatch;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync *pRc = rc;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync return rcRet;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync}
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsyncint main(int argc, char **argv)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync{
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync int rcRet = 0;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync int rcRet2;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync int rc;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync unsigned cMatch;
230bd8589bba39933ac5ec21482d6186d675e604vboxsync RTR3InitExe(argc, &argv, 0);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync const char *pszTestDir = ".";
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync char *pszFilter1 = RTPathJoinA(pszTestDir, "xyxzxq*");
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync if (!pszFilter1)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync RTPrintf("tstDir-3: cannot create non-match filter!\n");
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync return 1;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync char *pszFilter2 = RTPathJoinA(pszTestDir, "*");
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync if (!pszFilter2)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync {
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync RTPrintf("tstDir-3: cannot create match filter!\n");
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync return 1;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync }
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet2 = tstDirOpenFiltered(pszFilter1, &cMatch, &rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (rcRet2)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet = rcRet2;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (RT_FAILURE(rc))
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: filter '%s' failed! rc=%Rrc\n", pszFilter1, rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (cMatch)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: filter '%s' gave wrong result count! cMatch=%u\n", pszFilter1, cMatch);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet2 = tstDirOpenFiltered(pszFilter2, &cMatch, &rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (rcRet2)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync rcRet = rcRet2;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (RT_FAILURE(rc))
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: filter '%s' failed! rc=%Rrc\n", pszFilter2, rc);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (!cMatch)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: filter '%s' gave wrong result count! cMatch=%u\n", pszFilter2, cMatch);
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync if (!rcRet)
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync RTPrintf("tstDir-3: OK\n");
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync return rcRet;
a7f6f10ecc8705d499ececde41bebf50b7e0568bvboxsync}