--- linux/fs/super.c.sik Wed Oct 25 09:52:14 2000 +++ linux/fs/super.c Wed Oct 25 10:01:29 2000 @@ -280,6 +280,36 @@ return retval; } + + +/* Use octal escapes, like mount does, for embedded spaces etc. */ +static unsigned char need_escaping[] = { ' ', '\t', '\n', '\\' }; + +static int +mangle(const unsigned char *s, char *buf, int len) { + char *sp; + int n; + + sp = buf; + while(*s && sp-buf < len-3) { + for (n = 0; n < sizeof(need_escaping); n++) { + if (*s == need_escaping[n]) { + *sp++ = '\\'; + *sp++ = '0' + ((*s & 0300) >> 6); + *sp++ = '0' + ((*s & 070) >> 3); + *sp++ = '0' + (*s & 07); + goto next; + } + } + *sp++ = *s; + next: + s++; + } + return sp - buf; /* no trailing NUL */ +} + + + static struct proc_fs_info { int flag; char *str; @@ -309,35 +339,38 @@ { 0, NULL } }; + int get_filesystem_info( char *buf ) { - struct vfsmount *tmp = vfsmntlist; + struct vfsmount *tmp; struct proc_fs_info *fs_infop; struct proc_nfs_info *nfs_infop; struct nfs_server *nfss; - int len = 0; + int len, prevlen; + + len = prevlen = 0; - while ( tmp && len < PAGE_SIZE - 160) - { - len += sprintf( buf + len, "%s %s %s %s", - tmp->mnt_devname, tmp->mnt_dirname, tmp->mnt_sb->s_type->name, - tmp->mnt_flags & MS_RDONLY ? "ro" : "rw" ); +#define FREEROOM ((int)PAGE_SIZE-200-len) +#define MANGLE(s) len += mangle((s), buf+len, FREEROOM); + + for (tmp=vfsmntlist; tmp != NULL; tmp=tmp->mnt_next) { + MANGLE(tmp->mnt_devname ? tmp->mnt_devname : "none"); + buf[len++] = ' '; + MANGLE(tmp->mnt_dirname); + buf[len++] = ' '; + MANGLE(tmp->mnt_sb->s_type->name); + len += sprintf(buf+len, " %s", + tmp->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw"); for (fs_infop = fs_info; fs_infop->flag; fs_infop++) { - if (tmp->mnt_flags & fs_infop->flag) { - strcpy(buf + len, fs_infop->str); - len += strlen(fs_infop->str); - } + if (tmp->mnt_sb->s_flags & fs_infop->flag) + MANGLE(fs_infop->str); } if (!strcmp("nfs", tmp->mnt_sb->s_type->name)) { nfss = &tmp->mnt_sb->u.nfs_sb.s_server; - if (nfss->rsize != NFS_DEF_FILE_IO_BUFFER_SIZE) { - len += sprintf(buf+len, ",rsize=%d", - nfss->rsize); - } - if (nfss->wsize != NFS_DEF_FILE_IO_BUFFER_SIZE) { - len += sprintf(buf+len, ",wsize=%d", - nfss->wsize); - } + + len += sprintf(buf+len, ",rsize=%d", nfss->rsize); + + len += sprintf(buf+len, ",wsize=%d", nfss->wsize); #if 0 if (nfss->timeo != 7*HZ/10) { len += sprintf(buf+len, ",timeo=%d", @@ -365,19 +398,25 @@ nfss->acdirmax/HZ); } for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) { - if (nfss->flags & nfs_infop->flag) { - strcpy(buf + len, nfs_infop->str); - len += strlen(nfs_infop->str); + if (nfss->flags & nfs_infop->flag) { + MANGLE(nfs_infop->str); } } - len += sprintf(buf+len, ",addr=%s", - nfss->hostname); + len += sprintf(buf+len, ",addr="); + MANGLE(nfss->hostname); + } + len += sprintf(buf + len, " 0 0\n"); + if (FREEROOM <= 3) { + len = prevlen; + len += sprintf(buf+len, "# truncated\n"); + break; } - len += sprintf( buf + len, " 0 0\n" ); - tmp = tmp->mnt_next; + prevlen = len; } return len; +#undef MANGLE +#undef FREEROOM } int get_filesystem_list(char * buf)