Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 723a1d77 authored by Al Viro's avatar Al Viro
Browse files

um: resurrect the right variant of mconsole_proc()



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 483ce1d4
Loading
Loading
Loading
Loading
+21 −78
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@
#include <linux/un.h>
#include <linux/workqueue.h>
#include <linux/mutex.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/file.h>
#include <asm/uaccess.h>
#include <asm/switch_to.h>

@@ -118,18 +121,14 @@ void mconsole_log(struct mc_request *req)
	mconsole_reply(req, "", 0, 0);
}

/* This is a more convoluted version of mconsole_proc, which has some stability
 * problems; however, we need it fixed, because it is expected that UML users
 * mount HPPFS instead of procfs on /proc. And we want mconsole_proc to still
 * show the real procfs content, not the ones from hppfs.*/
#if 0
void mconsole_proc(struct mc_request *req)
{
	struct vfsmount *mnt = current->nsproxy->pid_ns->proc_mnt;
	char *buf;
	int len;
	struct file *file;
	int n;
	char *ptr = req->request.data, *buf;
	mm_segment_t old_fs = get_fs();
	int first_chunk = 1;
	char *ptr = req->request.data;

	ptr += strlen("proc");
	ptr = skip_spaces(ptr);
@@ -137,6 +136,7 @@ void mconsole_proc(struct mc_request *req)
	file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY);
	if (IS_ERR(file)) {
		mconsole_reply(req, "Failed to open file", 1, 0);
		printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file));
		goto out;
	}

@@ -146,62 +146,13 @@ void mconsole_proc(struct mc_request *req)
		goto out_fput;
	}

	if (file->f_op->read) {
	do {
		loff_t pos;
		mm_segment_t old_fs = get_fs();
		set_fs(KERNEL_DS);
			n = vfs_read(file, buf, PAGE_SIZE - 1, &pos);
			file_pos_write(file, pos);
		len = vfs_read(file, buf, PAGE_SIZE - 1, &pos);
		set_fs(old_fs);
			if (n >= 0) {
				buf[n] = '\0';
				mconsole_reply(req, buf, 0, (n > 0));
			}
			else {
				mconsole_reply(req, "Read of file failed",
					       1, 0);
				goto out_free;
			}
		} while (n > 0);
	}
	else mconsole_reply(req, "", 0, 0);

 out_free:
	kfree(buf);
 out_fput:
	fput(file);
 out: ;
}
#endif

void mconsole_proc(struct mc_request *req)
{
	char path[64];
	char *buf;
	int len;
	int fd;
	int first_chunk = 1;
	char *ptr = req->request.data;

	ptr += strlen("proc");
	ptr = skip_spaces(ptr);
	snprintf(path, sizeof(path), "/proc/%s", ptr);

	fd = sys_open(path, 0, 0);
	if (fd < 0) {
		mconsole_reply(req, "Failed to open file", 1, 0);
		printk(KERN_ERR "open %s: %d\n",path,fd);
		goto out;
	}

	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
	if (buf == NULL) {
		mconsole_reply(req, "Failed to allocate buffer", 1, 0);
		goto out_close;
	}

	for (;;) {
		len = sys_read(fd, buf, PAGE_SIZE-1);
		file->f_pos = pos;
		if (len < 0) {
			mconsole_reply(req, "Read of file failed", 1, 0);
			goto out_free;
@@ -211,22 +162,14 @@ void mconsole_proc(struct mc_request *req)
			mconsole_reply(req, "\n", 0, 1);
			first_chunk = 0;
		}
		if (len == PAGE_SIZE-1) {
			buf[len] = '\0';
			mconsole_reply(req, buf, 0, 1);
		} else {
		buf[len] = '\0';
			mconsole_reply(req, buf, 0, 0);
			break;
		}
	}

		mconsole_reply(req, buf, 0, (len > 0));
	} while (len > 0);
 out_free:
	kfree(buf);
 out_close:
	sys_close(fd);
 out:
	/* nothing */;
 out_fput:
	fput(file);
 out: ;
}

#define UML_MCONSOLE_HELPTEXT \