summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@qualcomm.com>2010-09-15 17:20:34 -0700
committerQuIC Gerrit Code Review <code-review@quicinc.com>2010-09-15 17:20:34 -0700
commit868d8eeeee6ca325b4b8e0b4ac763acc0c1f501f (patch)
tree73683445469cfc559eddc586d93d7ccc65e33db6
parentec9dbc893f663662fcf5deb35fd95a85a0d8e5ab (diff)
parent89f27232427441f267dbaeb2ccc3695b9d5eecdc (diff)
downloadbionic-868d8eeeee6ca325b4b8e0b4ac763acc0c1f501f.zip
bionic-868d8eeeee6ca325b4b8e0b4ac763acc0c1f501f.tar.gz
bionic-868d8eeeee6ca325b4b8e0b4ac763acc0c1f501f.tar.bz2
Merge "Bionic: Implementing mount table entry functions" into froyo
-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 d495674..4e711e8 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 b83da1f..d7fcf0a 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