From aa85de4be3f96a140a69170330293bfdfa3d24e7 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 15 May 2014 00:15:52 -0700 Subject: contrib: Cross platform fixes after recent commits - provide a getment_r () version which behaves as re-entrant with some caveats for NetBSD/OSX specific. - some apparent warning issues fixed, always use PRI* format specification avoid using %ld i.e not portable Change-Id: Ib3d1a73b426e38b436b356355b97db0104a1a4a5 BUG: 1089172 Signed-off-by: Harshavardhana Reviewed-on: http://review.gluster.org/7722 Reviewed-by: Emmanuel Dreyfus Tested-by: Gluster Build System Reviewed-by: Anand Avati --- contrib/mount/mntent.c | 71 +++++++++++++++++++++++++++++++++++++------ contrib/mount/mntent_compat.h | 6 ++-- 2 files changed, 65 insertions(+), 12 deletions(-) (limited to 'contrib') diff --git a/contrib/mount/mntent.c b/contrib/mount/mntent.c index 5ab5ac19e84..991e694f1cd 100644 --- a/contrib/mount/mntent.c +++ b/contrib/mount/mntent.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. */ -#ifdef GF_DARWIN_HOST_OS +#if defined(GF_DARWIN_HOST_OS) || defined(__NetBSD__) #include #include #include @@ -43,6 +43,12 @@ #include #include "mntent_compat.h" +#ifdef __NetBSD__ +typedef struct statvfs gf_statfs_t; +#else +typedef struct statfs gf_statfs_t; +#endif + static int pos = -1; static int mntsize = -1; static struct mntent _mntent; @@ -102,23 +108,32 @@ flags2opts (int flags) if (flags & MNT_ASYNC) res = concatopt(res, "async"); #if !defined(GF_DARWIN_HOST_OS) if (flags & MNT_NOATIME) res = concatopt(res, "noatime"); +#if !defined(__NetBSD__) if (flags & MNT_NOCLUSTERR) res = concatopt(res, "noclusterr"); if (flags & MNT_NOCLUSTERW) res = concatopt(res, "noclusterw"); if (flags & MNT_NOSYMFOLLOW) res = concatopt(res, "nosymfollow"); if (flags & MNT_SUIDDIR) res = concatopt(res, "suiddir"); -#endif +#endif /* !__NetBSD__ */ +#endif /* !GF_DARWIN_HOS_OS */ return res; } static struct mntent * -statfs_to_mntent (struct statfs *mntbuf) +statfs_to_mntent (gf_statfs_t *mntbuf) { static char opts_buf[40], *tmp; + int f_flags; _mntent.mnt_fsname = mntbuf->f_mntfromname; _mntent.mnt_dir = mntbuf->f_mntonname; _mntent.mnt_type = mntbuf->f_fstypename; - tmp = flags2opts (mntbuf->f_flags); + +#ifdef __NetBSD__ + f_flags = mntbuf->f_flag; +#else + f_flags = mntbuf->f_flags; +#endif + tmp = flags2opts (f_flags); if (tmp) { opts_buf[sizeof(opts_buf)-1] = '\0'; strncpy (opts_buf, tmp, sizeof(opts_buf)-1); @@ -134,7 +149,10 @@ statfs_to_mntent (struct statfs *mntbuf) struct mntent * getmntent (FILE *fp) { - struct statfs *mntbuf; + gf_statfs_t *mntbuf; + + if (!fp) + return NULL; if (pos == -1 || mntsize == -1) mntsize = getmntinfo (&mntbuf, MNT_NOWAIT); @@ -148,16 +166,49 @@ getmntent (FILE *fp) return (statfs_to_mntent (&mntbuf[pos])); } -/* Dummy functions */ +/* + Careful using this function ``buffer`` and ``bufsize`` are + ignored since there is no stream with strings to populate + them on OSX or NetBSD, if one wishes to populate them then + perhaps a new function should be written in this source file + which uses 'getmntinfo()' to stringify the mntent's +*/ + +struct mntent *getmntent_r (FILE *fp, struct mntent *result, + char *buffer, int bufsize) +{ + struct mntent *ment = NULL; + + if (!fp) + return NULL; + + flockfile (fp); + ment = getmntent (fp); + memcpy (result, ment, sizeof(*ment)); + funlockfile (fp); + + return result; +} + FILE * -setmntent(const char *filename, const char *type) +setmntent (const char *filename, const char *type) { - return (FILE *)0x1; + FILE *fp = NULL; +#ifdef GF_DARWIN_HOST_OS + fp = fopen (filename, "w"); +#else + fp = fopen (filename, type); +#endif + return fp; } int endmntent (FILE *fp) { - return 1; + if (fp) + fclose (fp); + + return 1; /* endmntent() always returns 1 */ } -#endif /* GF_DARWIN_HOST_OS */ + +#endif /* GF_DARWIN_HOST_OS || __NetBSD__ */ diff --git a/contrib/mount/mntent_compat.h b/contrib/mount/mntent_compat.h index 76a75754b1c..3f9cc931266 100644 --- a/contrib/mount/mntent_compat.h +++ b/contrib/mount/mntent_compat.h @@ -11,7 +11,7 @@ #ifndef _MNTENT_H #define _MNTENT_H -#ifdef GF_DARWIN_HOST_OS +#if defined(GF_DARWIN_HOST_OS) || defined(__NetBSD__) #include struct mntent { @@ -24,6 +24,8 @@ struct mntent { }; struct mntent *getmntent (FILE *fp); +struct mntent *getmntent_r (FILE *fp, struct mntent *result, + char *buffer, int bufsize); FILE *setmntent (const char *filename, const char *type); int endmntent(FILE *fp); char * hasmntopt (const struct mntent *mnt, const char *option); @@ -31,5 +33,5 @@ char * hasmntopt (const struct mntent *mnt, const char *option); /* Dummy - /etc/mtab has no meaning on OSX platform */ #define _PATH_MOUNTED "/etc/mtab" -#endif /* GF_DARWIN_HOST_OS */ +#endif /* GF_DARWIN_HOST_OS || __NetBSD__ */ #endif /* _MNTENT_H */ -- cgit