aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManas Abichandani <manasa@codeaurora.org>2010-08-27 12:40:52 -0700
committerManas Abichandani <manasa@codeaurora.org>2010-09-02 18:49:59 -0700
commit89f27232427441f267dbaeb2ccc3695b9d5eecdc (patch)
tree806d47a104b9543f38891b76af59a0229e3546bf
parenta91626e8deda068d59dc0aa5bb3b5545815b34a3 (diff)
downloadandroid_bionic-89f27232427441f267dbaeb2ccc3695b9d5eecdc.tar.gz
android_bionic-89f27232427441f267dbaeb2ccc3695b9d5eecdc.tar.bz2
android_bionic-89f27232427441f267dbaeb2ccc3695b9d5eecdc.zip
Bionic: Implementing mount table entry functions
Change-Id: I84c13ee86e939e53b07ea149c9dffe726ff4da01
-rw-r--r--libc/bionic/stubs.c130
-rw-r--r--libc/include/mntent.h3
2 files changed, 131 insertions, 2 deletions
diff --git a/libc/bionic/stubs.c b/libc/bionic/stubs.c
index d4956747d..4e711e809 100644
--- a/libc/bionic/stubs.c
+++ b/libc/bionic/stubs.c
@@ -37,6 +37,8 @@
#include <errno.h>
#include <ctype.h>
+#define MNTENT_LENGTH_MAX 400 //Buffer size for one record in mount entry file
+
/** Thread-specific state for the stubs functions
**/
@@ -51,6 +53,9 @@ typedef struct {
char group_name_buffer[32];
} stubs_state_t;
+static struct mntent *mnt = NULL;
+char mntent_buf[MNTENT_LENGTH_MAX]; //Buffer to hold a record in mount entry file
+
static void
stubs_state_free( void* _s )
{
@@ -351,8 +356,129 @@ void endpwent(void)
struct mntent* getmntent(FILE* f)
{
- fprintf(stderr, "FIX ME! implement getmntent() %s:%d\n", __FILE__, __LINE__);
- return NULL;
+ int index = 0, i = 0, flag = 1;
+ char ch;
+ char *temp;
+ //Keeping count so that we don't over run the buffer size
+ int count = MNTENT_LENGTH_MAX;
+
+ if(mnt == NULL)
+ if(!(mnt = (struct mntent *)malloc(sizeof(struct mntent))))
+ return NULL;
+
+ mnt->mnt_fsname = mntent_buf;
+
+ if(f->_read(f->_cookie, &ch, 1) != 1)
+ return NULL;
+
+ // There are exactly 6 columns per record and so
+ // we are checking value of index against 6 here.
+ while(ch && (index < 6) && count) {
+ switch(index) {
+ case 0:
+ //Storing mounted device.
+ if(ch != ' ') {
+ mnt->mnt_fsname[i++] = ch;
+ }
+ else {
+ mnt->mnt_fsname[i++] = '\0';
+ mnt->mnt_dir = &(mnt->mnt_fsname[i]);
+ i = 0;
+ index++;
+ }
+ count--;
+ break;
+ case 1:
+ //Storing mount point.
+ if(ch != ' ') {
+ mnt->mnt_dir[i++] = ch;
+ }
+ else {
+ mnt->mnt_dir[i++] = '\0';
+ mnt->mnt_type = &(mnt->mnt_dir[i]);
+ i = 0;
+ index++;
+ }
+ count--;
+ break;
+ case 2:
+ //Storing file system type.
+ if(ch != ' ') {
+ mnt->mnt_type[i++] = ch;
+ }
+ else {
+ mnt->mnt_type[i++] = '\0';
+ mnt->mnt_opts = &(mnt->mnt_type[i]);
+ i = 0;
+ index++;
+ }
+ count--;
+ break;
+ case 3:
+ //Storing mount options.
+ if(ch != ' ') {
+ mnt->mnt_opts[i++] = ch;
+ }
+ else {
+ mnt->mnt_opts[i++] = '\0';
+ temp = &(mnt->mnt_opts[i]);
+ i = 0;
+ index++;
+ }
+ count--;
+ break;
+ case 4:
+ //Dummy value to match the format of /etc/mtab
+ if(ch != ' ') {
+ temp[i++] = ch;
+ }
+ else {
+ temp[i++] = '\0';
+ mnt->mnt_freq = atoi(temp);
+ temp = &(temp[i]);
+ i = 0;
+ index++;
+ }
+ count--;
+ break;
+ case 5:
+ //Dummy value to match the format of /etc/mtab
+ if(ch != '\n') {
+ temp[i++] = ch;
+ }
+ else {
+ temp[i++] = '\0';
+ mnt->mnt_passno = atoi(temp);
+ temp = &(temp[i]);
+ i = 0;
+ index++;
+ flag = 0;
+ }
+ count--;
+ break;
+ }
+ if (flag)
+ f->_read(f->_cookie, &ch, 1);
+ }
+ if(!count && flag)
+ return NULL;
+
+ return mnt;
+}
+
+FILE* setmntent(const char *filename, const char *type)
+{
+ return fopen(filename, type);
+}
+
+int endmntent(FILE* f)
+{
+ if(mnt) {
+ free(mnt);
+ mnt = NULL;
+ }
+ f->_close(f);
+ return 1;
}
char* ttyname(int fd)
diff --git a/libc/include/mntent.h b/libc/include/mntent.h
index b83da1f2f..d7fcf0a77 100644
--- a/libc/include/mntent.h
+++ b/libc/include/mntent.h
@@ -45,9 +45,12 @@ struct mntent
__BEGIN_DECLS
+FILE *setmntent(const char *, const char *);
struct mntent* getmntent(FILE*);
+int endmntent(FILE*);
+
__END_DECLS
#endif