This file is indexed.

/usr/include/crystalspace-2.0/cstool/vfsdirchange.h is in libcrystalspace-dev 2.0+dfsg-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
    Copyright (C) 2005 by Jorrit Tyberghein
	      (C) 2005 by Frank Richter

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/**\file
 * Class to revert VFS directory changes upon leaving a scope.
 */

#include "iutil/vfs.h"
#include "csutil/csstring.h"

/**
 * Helper class to change the current VFS directory and restore the previous
 * directory when an instance goes out of scope.
 */
class csVfsDirectoryChanger
{
  csRef<iVFS> vfs;
  /**
   * The number of directory changes/directory stack entries that need to be
   * popped
   */
  uint popCount;
public:
  /// Create instance
  csVfsDirectoryChanger (iVFS* vfs) : vfs(vfs), popCount(0) { }
  /// Destroy instance. Restores the old directory if ChangeTo() was called.
  ~csVfsDirectoryChanger()
  {
    while (popCount--) vfs->PopDir();
  }
  /**
   * Change to the directory \a filename is in.
   * \remarks Only the part of the path up to the last '/' is treated as the
   * directory to change to. E.g. both "<tt>/foo/bar/baz</tt>" and 
   * "<tt>/foo/bar/</tt>" will cause a directory change to "<tt>/foo/bar</tt>".
   */
  bool ChangeTo (const char* filename)
  {
    if (!vfs) return false;

    csString dir(filename);
    dir.Truncate(dir.FindLast('/'));
    vfs->PushDir ();
    popCount++;

    return vfs->ChDir (dir);
  }

  /**
   * As above, except that the full path is treated as the directory to
   * change to.
   */
  bool ChangeToFull (const char* filename)
  {
    if (!vfs) return false;

    // We must make a copy of the filename because it can be a direct
    // pointer to vfs->GetCwd() and vfs->PushDir() corrupts that pointer.
    csString copy (filename);

    vfs->PushDir ();
    popCount++;

    return vfs->ChDir (copy);
  }

  /**
   * Just pushes the current directory, but doesn't change it in anyway - 
   * useful when you want to call ChDir() or ChDirAuto() manually for some
   * reason, but still want to have the current directory restored 
   * automatically.
   */
  void PushDir ()
  {
    vfs->PushDir ();
    popCount++;
  }
};