Huw Davies : ntdll: Add a replacement getmntent for Android.
Alexandre Julliard
julliard at winehq.org
Mon Apr 7 13:20:07 CDT 2014
Module: wine
Branch: master
Commit: 2139df003f8c33fc5306345efbbcea7f54bfa907
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2139df003f8c33fc5306345efbbcea7f54bfa907
Author: Huw Davies <huw at codeweavers.com>
Date: Mon Apr 7 13:22:10 2014 +0100
ntdll: Add a replacement getmntent for Android.
Bionic has a stub function named getmntent which outputs an unimplemented message.
---
dlls/ntdll/directory.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index 78b3ea7..641f642 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -365,6 +365,107 @@ static char *get_default_lpt_device( int num )
return ret;
}
+#ifdef __ANDROID__
+
+static char *unescape_field( char *str )
+{
+ char *in, *out;
+
+ for (in = out = str; *in; in++, out++)
+ {
+ *out = *in;
+ if (in[0] == '\\')
+ {
+ if (in[1] == '\\')
+ {
+ out[0] = '\\';
+ in++;
+ }
+ else if (in[1] == '0' && in[2] == '4' && in[3] == '0')
+ {
+ out[0] = ' ';
+ in += 3;
+ }
+ else if (in[1] == '0' && in[2] == '1' && in[3] == '1')
+ {
+ out[0] = '\t';
+ in += 3;
+ }
+ else if (in[1] == '0' && in[2] == '1' && in[3] == '2')
+ {
+ out[0] = '\n';
+ in += 3;
+ }
+ else if (in[1] == '1' && in[2] == '3' && in[3] == '4')
+ {
+ out[0] = '\\';
+ in += 3;
+ }
+ }
+ }
+ *out = '\0';
+
+ return str;
+}
+
+static inline char *get_field( char **str )
+{
+ char *ret;
+
+ ret = strsep( str, " \t" );
+ if (*str) *str += strspn( *str, " \t" );
+
+ return ret;
+}
+/************************************************************************
+ * getmntent_replacement
+ *
+ * getmntent replacement for Android.
+ *
+ * NB returned static buffer is not thread safe; protect with dir_section.
+ */
+static struct mntent *getmntent_replacement( FILE *f )
+{
+ static struct mntent entry;
+ static char buf[4096];
+ char *p, *start;
+
+ do
+ {
+ if (!fgets( buf, sizeof(buf), f )) return NULL;
+ p = strchr( buf, '\n' );
+ if (p) *p = '\0';
+ else /* Partially unread line, move file ptr to end */
+ {
+ char tmp[1024];
+ while (fgets( tmp, sizeof(tmp), f ))
+ if (strchr( tmp, '\n' )) break;
+ }
+ start = buf + strspn( buf, " \t" );
+ } while (start[0] == '\0' || start[0] == '#');
+
+ p = get_field( &start );
+ entry.mnt_fsname = p ? unescape_field( p ) : (char *)"";
+
+ p = get_field( &start );
+ entry.mnt_dir = p ? unescape_field( p ) : (char *)"";
+
+ p = get_field( &start );
+ entry.mnt_type = p ? unescape_field( p ) : (char *)"";
+
+ p = get_field( &start );
+ entry.mnt_opts = p ? unescape_field( p ) : (char *)"";
+
+ p = get_field( &start );
+ entry.mnt_freq = p ? atoi(p) : 0;
+
+ p = get_field( &start );
+ entry.mnt_passno = p ? atoi(p) : 0;
+
+ return &entry;
+}
+#define getmntent getmntent_replacement
+#endif
/***********************************************************************
* DIR_get_drives_info
More information about the wine-cvs
mailing list