2 Copyright (C) 2002 Paul Davis
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.
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.
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.
27 #include "pbd/mountpoint.h"
32 #include "libpbd-config.h"
38 struct mntent_sorter
{
39 bool operator() (const mntent
*a
, const mntent
*b
) {
40 return strcmp (a
->mnt_dir
, b
->mnt_dir
);
45 mountpoint (string path
)
49 unsigned int maxmatch
= 0;
50 unsigned int matchlen
;
51 const char *cpath
= path
.c_str();
52 char best
[PATH_MAX
+1];
54 if ((mntf
= setmntent ("/etc/mtab", "r")) == 0) {
60 while ((mnt
= getmntent (mntf
))) {
66 /* note: strcmp's semantics are not
67 strict enough to use for this.
70 while (cpath
[n
] && mnt
->mnt_dir
[n
]) {
71 if (cpath
[n
] != mnt
->mnt_dir
[n
]) {
78 if (cpath
[matchlen
] == '\0') {
85 if (matchlen
> maxmatch
) {
86 snprintf (best
, sizeof(best
), "%s", mnt
->mnt_dir
);
97 #else // !HAVE_GETMNTENT
99 #include <sys/param.h>
100 #include <sys/ucred.h>
101 #include <sys/mount.h>
104 mountpoint (string path
)
106 struct statfs
*mntbufp
= 0;
108 unsigned int maxmatch
= 0;
109 unsigned int matchlen
;
110 const char *cpath
= path
.c_str();
111 char best
[PATH_MAX
+1];
113 if ((count
= getmntinfo(&mntbufp
, MNT_NOWAIT
)) == 0) {
120 for (int i
= 0; i
< count
; ++i
) {
124 /* note: strcmp's semantics are not
125 strict enough to use for this.
128 while (cpath
[n
] && mntbufp
[i
].f_mntonname
[n
]) {
129 if (cpath
[n
] != mntbufp
[i
].f_mntonname
[n
]) {
136 if (cpath
[matchlen
] == '\0') {
137 snprintf(best
, sizeof(best
), "%s", mntbufp
[i
].f_mntonname
);
143 if (matchlen
> maxmatch
) {
144 snprintf (best
, sizeof(best
), "%s", mntbufp
[i
].f_mntonname
);
154 #endif // HAVE_GETMNTENT
156 #ifdef TEST_MOUNTPOINT
158 main (int argc
, char *argv
[])
160 printf ("mp of %s = %s\n", argv
[1], mountpoint (argv
[1]).c_str());
164 #endif // TEST_MOUNTPOINT