Exemplo n.º 1
0
/*
 * Ideally the mounted aufs should be unmounted even if its mntpnt has very long
 * pathname. In other words, if umount.aufs cannot handle a long pathname, then
 * mount.aufs should reject in the beginning.
 * getmntent(3) in glibc reads 4096 bytes for a single mnt entry. I agree it is
 * large enough. And mount(8) rejects too long pathname. It is OK too. As long
 * as 4095 (4096 - 1) bytes pathname succeeds mounting, then it should be
 * unmounted flawlessly.
 * Testing on Debian v7 (wheezy) succeeded mounting 4095 bytes pathname, but
 * failed unmounting. I don't like this unbalancing. So replace getmntent() by
 * getmntent_r() with larger buffer. Obviously this is less important since such
 * long pathname is very rare.
 */
int au_proc_getmntent(char *mntpnt, struct mntent *rent)
{
	int found;
	struct mntent *p, e;
	FILE *fp;
	char a[4096 + 1024], path[PATH_MAX], *decoded;

	decoded = au_decode_mntpnt(mntpnt, path, sizeof(path));
	if (!decoded)
		AuFin("au_decode_mntpnt");

	fp = setmntent(ProcMounts, "r");
	if (!fp)
		AuFin(ProcMounts);

	/* find the last one */
	memset(rent, 0, sizeof(*rent));
	found = 0;
	while ((p = getmntent_r(fp, &e, a, sizeof(a))))
		if (!strcmp(p->mnt_dir, decoded)) {
			Dpri("%s, %s, %s, %s, %d, %d\n",
			     p->mnt_fsname, p->mnt_dir, p->mnt_type,
			     p->mnt_opts, p->mnt_freq, p->mnt_passno);
			copy_ent(rent, p);
			found = 1;
		}
	endmntent(fp);

	if (!found) {
		errno = EINVAL;
		AuFin("%s, %s", mntpnt, decoded);
	}

	return 0;
}
Exemplo n.º 2
0
int au_proc_getmntent(char *mntpnt, struct mntent *rent)
{
	int found;
	struct mntent *p;
	FILE *fp;

	fp = setmntent(ProcMounts, "r");
	if (!fp)
		AuFin(ProcMounts);

	/* find the last one */
	memset(rent, 0, sizeof(*rent));
	found = 0;
	while ((p = getmntent(fp)))
		if (!strcmp(p->mnt_dir, mntpnt)) {
			Dpri("%s, %s, %s, %s, %d, %d\n",
			     p->mnt_fsname, p->mnt_dir, p->mnt_type,
			     p->mnt_opts, p->mnt_freq, p->mnt_passno);
			copy_ent(rent, p);
			found = 1;
		}
	endmntent(fp);

	if (!found) {
		errno = EINVAL;
		AuFin("%s", mntpnt);
	}

	return 0;
}