⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbumount.c

📁 samba最新软件
💻 C
字号:
/* *  smbumount.c * *  Copyright (C) 1995-1998 by Volker Lendecke * */#include "includes.h"#include <mntent.h>#include <asm/types.h>#include <asm/posix_types.h>#include <linux/smb.h>#include <linux/smb_mount.h>#include <linux/smb_fs.h>/* This is a (hopefully) temporary hack due to the fact that	sizeof( uid_t ) != sizeof( __kernel_uid_t ) under glibc.	This may change in the future and smb.h may get fixed in the	future.  In the mean time, it's ugly hack time - get over it.*/#undef SMB_IOC_GETMOUNTUID#define	SMB_IOC_GETMOUNTUID		_IOR('u', 1, __kernel_uid_t)#ifndef O_NOFOLLOW#define O_NOFOLLOW     0400000#endifstatic voidusage(void){        printf("usage: smbumount mountpoint\n");}static intumount_ok(const char *mount_point){	/* we set O_NOFOLLOW to prevent users playing games with symlinks to	   umount filesystems they don't own */        int fid = open(mount_point, O_RDONLY|O_NOFOLLOW, 0);        __kernel_uid_t mount_uid;	        if (fid == -1) {                fprintf(stderr, "Could not open %s: %s\n",                        mount_point, strerror(errno));                return -1;        }                if (ioctl(fid, SMB_IOC_GETMOUNTUID, &mount_uid) != 0) {                fprintf(stderr, "%s probably not smb-filesystem\n",                        mount_point);                return -1;        }        if ((getuid() != 0)            && (mount_uid != getuid())) {                fprintf(stderr, "You are not allowed to umount %s\n",                        mount_point);                return -1;        }        close(fid);        return 0;}/* Make a canonical pathname from PATH.  Returns a freshly malloced string.   It is up the *caller* to ensure that the PATH is sensible.  i.e.   canonicalize ("/dev/fd0/.") returns "/dev/fd0" even though ``/dev/fd0/.''   is not a legal pathname for ``/dev/fd0''  Anything we cannot parse   we return unmodified.   */static char *canonicalize (char *path){	char *canonical = malloc (PATH_MAX + 1);	if (!canonical) {		fprintf(stderr, "Error! Not enough memory!\n");		return NULL;	}	if (strlen(path) > PATH_MAX) {		fprintf(stderr, "Mount point string too long\n");		return NULL;	}	if (path == NULL)		return NULL;  	if (realpath (path, canonical))		return canonical;	strncpy (canonical, path, PATH_MAX);	canonical[PATH_MAX] = '\0';	return canonical;}int main(int argc, char *argv[]){        int fd;        char* mount_point;        struct mntent *mnt;        FILE* mtab;        FILE* new_mtab;        if (argc != 2) {                usage();                exit(1);        }        if (geteuid() != 0) {                fprintf(stderr, "smbumount must be installed suid root\n");                exit(1);        }        mount_point = canonicalize(argv[1]);	if (mount_point == NULL)	{		exit(1);	}        if (umount_ok(mount_point) != 0) {                exit(1);        }        if (umount(mount_point) != 0) {                fprintf(stderr, "Could not umount %s: %s\n",                        mount_point, strerror(errno));                exit(1);        }        if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1)        {                fprintf(stderr, "Can't get "MOUNTED"~ lock file");                return 1;        }        close(fd);	        if ((mtab = setmntent(MOUNTED, "r")) == NULL) {                fprintf(stderr, "Can't open " MOUNTED ": %s\n",                        strerror(errno));                return 1;        }#define MOUNTED_TMP MOUNTED".tmp"        if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) {                fprintf(stderr, "Can't open " MOUNTED_TMP ": %s\n",                        strerror(errno));                endmntent(mtab);                return 1;        }        while ((mnt = getmntent(mtab)) != NULL) {                if (strcmp(mnt->mnt_dir, mount_point) != 0) {                        addmntent(new_mtab, mnt);                }        }        endmntent(mtab);        if (fchmod (fileno (new_mtab), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {                fprintf(stderr, "Error changing mode of %s: %s\n",                        MOUNTED_TMP, strerror(errno));                exit(1);        }        endmntent(new_mtab);        if (rename(MOUNTED_TMP, MOUNTED) < 0) {                fprintf(stderr, "Cannot rename %s to %s: %s\n",                        MOUNTED, MOUNTED_TMP, strerror(errno));                exit(1);        }        if (unlink(MOUNTED"~") == -1)        {                fprintf(stderr, "Can't remove "MOUNTED"~");                return 1;        }	return 0;}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -