ardour
mountpoint.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18  $Id$
19 */
20 #ifndef COMPILER_MSVC
21 #include <cstdio>
22 #include <cstring>
23 #include <string>
24 #include <cstring>
25 #include <limits.h>
26 
27 #include "pbd/mountpoint.h"
28 
29 using std::string;
30 
31 #ifdef WAF_BUILD
32 #include "libpbd-config.h"
33 #endif
34 
35 #ifdef HAVE_GETMNTENT
36 #include <mntent.h>
37 
38 struct mntent_sorter {
39  bool operator() (const mntent *a, const mntent *b) {
40  return strcmp (a->mnt_dir, b->mnt_dir);
41  }
42 };
43 
44 string
45 mountpoint (string path)
46 {
47  FILE *mntf;
48  mntent *mnt;
49  unsigned int maxmatch = 0;
50  unsigned int matchlen;
51  const char *cpath = path.c_str();
52  char best[PATH_MAX+1];
53 
54  if ((mntf = setmntent ("/etc/mtab", "r")) == 0) {
55  return "";
56  }
57 
58  best[0] = '\0';
59 
60  while ((mnt = getmntent (mntf))) {
61  unsigned int n;
62 
63  n = 0;
64  matchlen = 0;
65 
66  /* note: strcmp's semantics are not
67  strict enough to use for this.
68  */
69 
70  while (cpath[n] && mnt->mnt_dir[n]) {
71  if (cpath[n] != mnt->mnt_dir[n]) {
72  break;
73  }
74  matchlen++;
75  n++;
76  }
77 
78  if (cpath[matchlen] == '\0') {
79 
80  endmntent (mntf);
81  return mnt->mnt_dir;
82 
83  } else {
84 
85  if (matchlen > maxmatch) {
86  snprintf (best, sizeof(best), "%s", mnt->mnt_dir);
87  maxmatch = matchlen;
88  }
89  }
90  }
91 
92  endmntent (mntf);
93 
94  return best;
95 }
96 
97 #elif defined(PLATFORM_WINDOWS)
98 #include <assert.h>
99 string
100 mountpoint (string path)
101 {
102  /* this function is currently only called from 'old_peak_path()'
103  * via find_broken_peakfile() - only relevant for loading pre
104  * libsndfile Ardour 2.0 sessions.
105  */
106  assert(0);
107  return ""; // TODO ... if needed
108 }
109 
110 #else // !HAVE_GETMNTENT
111 
112 #include <sys/param.h>
113 #include <sys/ucred.h>
114 #include <sys/mount.h>
115 
116 string
117 mountpoint (string path)
118 {
119  struct statfs *mntbufp = 0;
120  int count;
121  unsigned int maxmatch = 0;
122  unsigned int matchlen;
123  const char *cpath = path.c_str();
124  char best[PATH_MAX+1];
125 
126  /* From the manpage, under "BUGS" : "The memory allocated by getmntinfo() cannot be free(3)'d by the
127  application."
128 
129  Thus: we do NOT try to free memory allocated by getmntinfo()
130  */
131 
132  if ((count = getmntinfo(&mntbufp, MNT_NOWAIT)) == 0) {
133  return "\0";
134  }
135 
136  best[0] = '\0';
137 
138  for (int i = 0; i < count; ++i) {
139  unsigned int n = 0;
140  matchlen = 0;
141 
142  /* note: strcmp's semantics are not
143  strict enough to use for this.
144  */
145 
146  while (cpath[n] && mntbufp[i].f_mntonname[n]) {
147  if (cpath[n] != mntbufp[i].f_mntonname[n]) {
148  break;
149  }
150  matchlen++;
151  n++;
152  }
153 
154  if (cpath[matchlen] == '\0') {
155  snprintf(best, sizeof(best), "%s", mntbufp[i].f_mntonname);
156  return best;
157 
158  } else {
159 
160  if (matchlen > maxmatch) {
161  snprintf (best, sizeof(best), "%s", mntbufp[i].f_mntonname);
162  maxmatch = matchlen;
163  }
164  }
165  }
166 
167  return best;
168 }
169 #endif // HAVE_GETMNTENT
170 
171 #ifdef TEST_MOUNTPOINT
172 
173 main (int argc, char *argv[])
174 {
175  printf ("mp of %s = %s\n", argv[1], mountpoint (argv[1]).c_str());
176  exit (0);
177 }
178 
179 #endif // TEST_MOUNTPOINT
180 
181 #else // COMPILER_MSVC
182  const char* pbd_mountpoint = "pbd/msvc/mountpoint.cc takes precedence over this file";
183 #endif // COMPILER_MSVC
string mountpoint(string path)
Definition: mountpoint.cc:117
const char * pbd_mountpoint
Definition: mountpoint.cc:165
int main(int argc, char *argv[])
Definition: load_session.cc:14
#define PATH_MAX
Definition: lv2_plugin.h:34