diff options
-rw-r--r-- | libc/bionic/stubs.c | 130 | ||||
-rw-r--r-- | libc/include/mntent.h | 3 | ||||
-rw-r--r-- | libc/kernel/common/linux/csdio.h | 5 |
3 files changed, 134 insertions, 4 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 diff --git a/libc/kernel/common/linux/csdio.h b/libc/kernel/common/linux/csdio.h index 0e59579..53cf707 100644 --- a/libc/kernel/common/linux/csdio.h +++ b/libc/kernel/common/linux/csdio.h @@ -27,8 +27,10 @@ #define CSDIO_IOC_CMD53 _IO(CSDIO_IOC_MAGIC, 8) #define CSDIO_IOC_ENABLE_ISR _IO(CSDIO_IOC_MAGIC, 9) #define CSDIO_IOC_DISABLE_ISR _IO(CSDIO_IOC_MAGIC, 10) +#define CSDIO_IOC_SET_VDD _IO(CSDIO_IOC_MAGIC, 11) +#define CSDIO_IOC_GET_VDD _IO(CSDIO_IOC_MAGIC, 12) -#define CSDIO_IOC_MAXNR 10 +#define CSDIO_IOC_MAXNR 12 struct csdio_cmd53_ctrl_t { uint32_t m_block_mode; @@ -44,4 +46,3 @@ struct csdio_cmd52_ctrl_t { } __attribute__ ((packed)); #endif - |