diff options
author | Linux Build Service Account <lnxbuild@qualcomm.com> | 2010-09-15 17:20:34 -0700 |
---|---|---|
committer | QuIC Gerrit Code Review <code-review@quicinc.com> | 2010-09-15 17:20:34 -0700 |
commit | 868d8eeeee6ca325b4b8e0b4ac763acc0c1f501f (patch) | |
tree | 73683445469cfc559eddc586d93d7ccc65e33db6 | |
parent | ec9dbc893f663662fcf5deb35fd95a85a0d8e5ab (diff) | |
parent | 89f27232427441f267dbaeb2ccc3695b9d5eecdc (diff) | |
download | bionic-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.c | 130 | ||||
-rw-r--r-- | libc/include/mntent.h | 3 |
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 |