📄 cmd_vfs.c
字号:
#ifdef HAVE_STAT_ST_BLKSIZE printf(" IO Block: %u\n", (unsigned int)st.st_blksize);#endif printf(" Device: 0x%10x", (unsigned int)st.st_dev); printf(" Inode: %10u", (unsigned int)st.st_ino); printf(" Links: %10u\n", (unsigned int)st.st_nlink); printf(" Access: %05o", (st.st_mode) & 007777); printf(" Uid: %5lu/%.16s Gid: %5lu/%.16s\n", (unsigned long)st.st_uid, user, (unsigned long)st.st_gid, group); printf(" Access: %s", ctime(&(st.st_atime))); printf(" Modify: %s", ctime(&(st.st_mtime))); printf(" Change: %s", ctime(&(st.st_ctime))); return NT_STATUS_OK;}static NTSTATUS cmd_fstat(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ int fd; const char *user; const char *group; struct passwd *pwd = NULL; struct group *grp = NULL; SMB_STRUCT_STAT st; if (argc != 2) { printf("Usage: fstat <fd>\n"); return NT_STATUS_OK; } fd = atoi(argv[1]); if (fd < 0 || fd > 1024) { printf("fstat: error=%d (file descriptor out of range)\n", EBADF); return NT_STATUS_OK; } if (vfs->files[fd] == NULL) { printf("fstat: error=%d (invalid file descriptor)\n", EBADF); return NT_STATUS_OK; } if (SMB_VFS_FSTAT(vfs->files[fd], fd, &st) == -1) { printf("fstat: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } pwd = sys_getpwuid(st.st_uid); if (pwd != NULL) user = pwd->pw_name; else user = null_string; grp = sys_getgrgid(st.st_gid); if (grp != NULL) group = grp->gr_name; else group = null_string; printf("fstat: ok\n"); if (S_ISREG(st.st_mode)) printf(" Regular File\n"); else if (S_ISDIR(st.st_mode)) printf(" Directory\n"); else if (S_ISCHR(st.st_mode)) printf(" Character Device\n"); else if (S_ISBLK(st.st_mode)) printf(" Block Device\n"); else if (S_ISFIFO(st.st_mode)) printf(" Fifo\n"); else if (S_ISLNK(st.st_mode)) printf(" Symbolic Link\n"); else if (S_ISSOCK(st.st_mode)) printf(" Socket\n"); printf(" Size: %10u", (unsigned int)st.st_size);#ifdef HAVE_STAT_ST_BLOCKS printf(" Blocks: %9u", (unsigned int)st.st_blocks);#endif#ifdef HAVE_STAT_ST_BLKSIZE printf(" IO Block: %u\n", (unsigned int)st.st_blksize);#endif printf(" Device: 0x%10x", (unsigned int)st.st_dev); printf(" Inode: %10u", (unsigned int)st.st_ino); printf(" Links: %10u\n", (unsigned int)st.st_nlink); printf(" Access: %05o", (st.st_mode) & 007777); printf(" Uid: %5lu/%.16s Gid: %5lu/%.16s\n", (unsigned long)st.st_uid, user, (unsigned long)st.st_gid, group); printf(" Access: %s", ctime(&(st.st_atime))); printf(" Modify: %s", ctime(&(st.st_mtime))); printf(" Change: %s", ctime(&(st.st_ctime))); return NT_STATUS_OK;}static NTSTATUS cmd_lstat(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ const char *user; const char *group; struct passwd *pwd = NULL; struct group *grp = NULL; SMB_STRUCT_STAT st; if (argc != 2) { printf("Usage: lstat <path>\n"); return NT_STATUS_OK; } if (SMB_VFS_LSTAT(vfs->conn, argv[1], &st) == -1) { printf("lstat: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } pwd = sys_getpwuid(st.st_uid); if (pwd != NULL) user = pwd->pw_name; else user = null_string; grp = sys_getgrgid(st.st_gid); if (grp != NULL) group = grp->gr_name; else group = null_string; printf("lstat: ok\n"); if (S_ISREG(st.st_mode)) printf(" Regular File\n"); else if (S_ISDIR(st.st_mode)) printf(" Directory\n"); else if (S_ISCHR(st.st_mode)) printf(" Character Device\n"); else if (S_ISBLK(st.st_mode)) printf(" Block Device\n"); else if (S_ISFIFO(st.st_mode)) printf(" Fifo\n"); else if (S_ISLNK(st.st_mode)) printf(" Symbolic Link\n"); else if (S_ISSOCK(st.st_mode)) printf(" Socket\n"); printf(" Size: %10u", (unsigned int)st.st_size);#ifdef HAVE_STAT_ST_BLOCKS printf(" Blocks: %9u", (unsigned int)st.st_blocks);#endif#ifdef HAVE_STAT_ST_BLKSIZE printf(" IO Block: %u\n", (unsigned int)st.st_blksize);#endif printf(" Device: 0x%10x", (unsigned int)st.st_dev); printf(" Inode: %10u", (unsigned int)st.st_ino); printf(" Links: %10u\n", (unsigned int)st.st_nlink); printf(" Access: %05o", (st.st_mode) & 007777); printf(" Uid: %5lu/%.16s Gid: %5lu/%.16s\n", (unsigned long)st.st_uid, user, (unsigned long)st.st_gid, group); printf(" Access: %s", ctime(&(st.st_atime))); printf(" Modify: %s", ctime(&(st.st_mtime))); printf(" Change: %s", ctime(&(st.st_ctime))); return NT_STATUS_OK;}static NTSTATUS cmd_chmod(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ mode_t mode; if (argc != 3) { printf("Usage: chmod <path> <mode>\n"); return NT_STATUS_OK; } mode = atoi(argv[2]); if (SMB_VFS_CHMOD(vfs->conn, argv[1], mode) == -1) { printf("chmod: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("chmod: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_fchmod(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ int fd; mode_t mode; if (argc != 3) { printf("Usage: fchmod <fd> <mode>\n"); return NT_STATUS_OK; } fd = atoi(argv[1]); mode = atoi(argv[2]); if (fd < 0 || fd > 1024) { printf("fchmod: error=%d (file descriptor out of range)\n", EBADF); return NT_STATUS_OK; } if (vfs->files[fd] == NULL) { printf("fchmod: error=%d (invalid file descriptor)\n", EBADF); return NT_STATUS_OK; } if (SMB_VFS_FCHMOD(vfs->files[fd], fd, mode) == -1) { printf("fchmod: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("fchmod: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_chown(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ uid_t uid; gid_t gid; if (argc != 4) { printf("Usage: chown <path> <uid> <gid>\n"); return NT_STATUS_OK; } uid = atoi(argv[2]); gid = atoi(argv[3]); if (SMB_VFS_CHOWN(vfs->conn, argv[1], uid, gid) == -1) { printf("chown: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("chown: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_fchown(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ uid_t uid; gid_t gid; int fd; if (argc != 4) { printf("Usage: fchown <fd> <uid> <gid>\n"); return NT_STATUS_OK; } uid = atoi(argv[2]); gid = atoi(argv[3]); fd = atoi(argv[1]); if (fd < 0 || fd > 1024) { printf("fchown: faliure=%d (file descriptor out of range)\n", EBADF); return NT_STATUS_OK; } if (vfs->files[fd] == NULL) { printf("fchown: error=%d (invalid file descriptor)\n", EBADF); return NT_STATUS_OK; } if (SMB_VFS_FCHOWN(vfs->files[fd], fd, uid, gid) == -1) { printf("fchown error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("fchown: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_getwd(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ char buf[PATH_MAX]; if (SMB_VFS_GETWD(vfs->conn, buf) == NULL) { printf("getwd: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("getwd: %s\n", buf); return NT_STATUS_OK;}static NTSTATUS cmd_utime(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ struct utimbuf times; if (argc != 4) { printf("Usage: utime <path> <access> <modify>\n"); return NT_STATUS_OK; } times.actime = atoi(argv[2]); times.modtime = atoi(argv[3]); if (SMB_VFS_UTIME(vfs->conn, argv[1], ×) != 0) { printf("utime: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("utime: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_ftruncate(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ int fd; SMB_OFF_T off; if (argc != 3) { printf("Usage: ftruncate <fd> <length>\n"); return NT_STATUS_OK; } fd = atoi(argv[1]); off = atoi(argv[2]); if (fd < 0 || fd > 1024) { printf("ftruncate: error=%d (file descriptor out of range)\n", EBADF); return NT_STATUS_OK; } if (vfs->files[fd] == NULL) { printf("ftruncate: error=%d (invalid file descriptor)\n", EBADF); return NT_STATUS_OK; } if (SMB_VFS_FTRUNCATE(vfs->files[fd], fd, off) == -1) { printf("ftruncate: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("ftruncate: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_lock(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ BOOL ret; int fd; int op; long offset; long count; int type; const char *typestr; if (argc != 6) { printf("Usage: lock <fd> <op> <offset> <count> <type>\n"); printf(" ops: G = F_GETLK\n"); printf(" S = F_SETLK\n"); printf(" W = F_SETLKW\n"); printf(" type: R = F_RDLCK\n"); printf(" W = F_WRLCK\n"); printf(" U = F_UNLCK\n"); return NT_STATUS_OK; } if (sscanf(argv[1], "%d", &fd) == 0) { printf("lock: error=-1 (error parsing fd)\n"); return NT_STATUS_UNSUCCESSFUL; } op = 0; switch (*argv[2]) { case 'G': op = F_GETLK; break; case 'S': op = F_SETLK; break; case 'W': op = F_SETLKW; break; default: printf("lock: error=-1 (invalid op flag!)\n"); return NT_STATUS_UNSUCCESSFUL; } if (sscanf(argv[3], "%ld", &offset) == 0) { printf("lock: error=-1 (error parsing fd)\n"); return NT_STATUS_UNSUCCESSFUL; } if (sscanf(argv[4], "%ld", &count) == 0) { printf("lock: error=-1 (error parsing fd)\n"); return NT_STATUS_UNSUCCESSFUL; } type = 0; typestr = argv[5]; while(*typestr) { switch (*typestr) { case 'R': type |= F_RDLCK; break; case 'W': type |= F_WRLCK; break; case 'U': type |= F_UNLCK; break; default: printf("lock: error=-1 (invalid type flag!)\n"); return NT_STATUS_UNSUCCESSFUL; } typestr++; } printf("lock: debug lock(fd=%d, op=%d, offset=%ld, count=%ld, type=%d))\n", fd, op, offset, count, type); if ((ret = SMB_VFS_LOCK(vfs->files[fd], fd, op, offset, count, type)) == False) { printf("lock: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("lock: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_symlink(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ if (argc != 3) { printf("Usage: symlink <path> <link>\n"); return NT_STATUS_OK; } if (SMB_VFS_SYMLINK(vfs->conn, argv[1], argv[2]) == -1) { printf("symlink: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("symlink: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_readlink(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ char buffer[PATH_MAX]; int size; if (argc != 2) { printf("Usage: readlink <path>\n"); return NT_STATUS_OK; } if ((size = SMB_VFS_READLINK(vfs->conn, argv[1], buffer, PATH_MAX)) == -1) { printf("readlink: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } buffer[size] = '\0'; printf("readlink: %s\n", buffer); return NT_STATUS_OK;}static NTSTATUS cmd_link(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ if (argc != 3) { printf("Usage: link <path> <link>\n"); return NT_STATUS_OK; } if (SMB_VFS_LINK(vfs->conn, argv[1], argv[2]) == -1) { printf("link: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("link: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_mknod(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ mode_t mode; unsigned int dev_val; SMB_DEV_T dev; if (argc != 4) { printf("Usage: mknod <path> <mode> <dev>\n"); printf(" mode is octal\n"); printf(" dev is hex\n"); return NT_STATUS_OK; } if (sscanf(argv[2], "%o", &mode) == 0) { printf("open: error=-1 (invalid mode!)\n"); return NT_STATUS_UNSUCCESSFUL; } if (sscanf(argv[3], "%x", &dev_val) == 0) { printf("open: error=-1 (invalid dev!)\n"); return NT_STATUS_UNSUCCESSFUL; } dev = (SMB_DEV_T)dev_val; if (SMB_VFS_MKNOD(vfs->conn, argv[1], mode, dev) == -1) { printf("mknod: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("mknod: ok\n"); return NT_STATUS_OK;}static NTSTATUS cmd_realpath(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv){ char respath[PATH_MAX]; if (argc != 2) { printf("Usage: realpath <path>\n"); return NT_STATUS_OK; } if (SMB_VFS_REALPATH(vfs->conn, argv[1], respath) == NULL) { printf("realpath: error=%d (%s)\n", errno, strerror(errno)); return NT_STATUS_UNSUCCESSFUL; } printf("realpath: ok\n"); return NT_STATUS_OK;}struct cmd_set vfs_commands[] = { { "VFS Commands" }, { "load", cmd_load_module, "Load a module", "load <module.so>" }, { "populate", cmd_populate, "Populate a data buffer", "populate <char> <size>" }, { "showdata", cmd_show_data, "Show data currently in data buffer", "show_data [<offset> <len>]"}, { "connect", cmd_connect, "VFS connect()", "connect" }, { "disconnect", cmd_disconnect, "VFS disconnect()", "disconnect" }, { "disk_free", cmd_disk_free, "VFS disk_free()", "disk_free <path>" }, { "opendir", cmd_opendir, "VFS opendir()", "opendir <fname>" }, { "readdir", cmd_readdir, "VFS readdir()", "readdir" }, { "mkdir", cmd_mkdir, "VFS mkdir()", "mkdir <path>" }, { "rmdir", cmd_pathfunc, "VFS rmdir()", "rmdir <path>" }, { "closedir", cmd_closedir, "VFS closedir()", "closedir" }, { "open", cmd_open, "VFS open()", "open <fname>" }, { "close", cmd_close, "VFS close()", "close <fd>" }, { "read", cmd_read, "VFS read()", "read <fd> <size>" }, { "write", cmd_write, "VFS write()", "write <fd> <size>" }, { "lseek", cmd_lseek, "VFS lseek()", "lseek <fd> <offset> <whence>" }, { "rename", cmd_rename, "VFS rename()", "rename <old> <new>" }, { "fsync", cmd_fsync, "VFS fsync()", "fsync <fd>" }, { "stat", cmd_stat, "VFS stat()", "stat <fname>" }, { "fstat", cmd_fstat, "VFS fstat()", "fstat <fd>" }, { "lstat", cmd_lstat, "VFS lstat()", "lstat <fname>" }, { "unlink", cmd_pathfunc, "VFS unlink()", "unlink <fname>" }, { "chmod", cmd_chmod, "VFS chmod()", "chmod <path> <mode>" }, { "fchmod", cmd_fchmod, "VFS fchmod()", "fchmod <fd> <mode>" }, { "chown", cmd_chown, "VFS chown()", "chown <path> <uid> <gid>" }, { "fchown", cmd_fchown, "VFS fchown()", "fchown <fd> <uid> <gid>" }, { "chdir", cmd_pathfunc, "VFS chdir()", "chdir <path>" }, { "getwd", cmd_getwd, "VFS getwd()", "getwd" }, { "utime", cmd_utime, "VFS utime()", "utime <path> <access> <modify>" }, { "ftruncate", cmd_ftruncate, "VFS ftruncate()", "ftruncate <fd> <length>" }, { "lock", cmd_lock, "VFS lock()", "lock <f> <op> <offset> <count> <type>" }, { "symlink", cmd_symlink, "VFS symlink()", "symlink <old> <new>" }, { "readlink", cmd_readlink, "VFS readlink()", "readlink <path>" }, { "link", cmd_link, "VFS link()", "link <oldpath> <newpath>" }, { "mknod", cmd_mknod, "VFS mknod()", "mknod <path> <mode> <dev>" }, { "realpath", cmd_realpath, "VFS realpath()", "realpath <path>" }, { NULL }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -