mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
improvements and bugfix
open calls now understands flags and mode bug on read (This used to be commit 751d057713a3fa8a5a141eaed4e8401e7802cfc9)
This commit is contained in:
parent
789e6e6b4e
commit
d433fc4dd3
@ -57,7 +57,7 @@ static NTSTATUS cmd_populate(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int arg
|
||||
size = atoi(argv[2]);
|
||||
vfs->data = (char *)talloc(mem_ctx, size);
|
||||
if (vfs->data == NULL) {
|
||||
printf("read: error=-1 (not enough memory)");
|
||||
printf("populate: error=-1 (not enough memory)");
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
memset(vfs->data, c, size);
|
||||
@ -198,14 +198,73 @@ static NTSTATUS cmd_closedir(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int arg
|
||||
static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, char **argv)
|
||||
{
|
||||
int flags, mode, fd;
|
||||
char *flagstr;
|
||||
|
||||
flags = O_RDWR | O_CREAT;
|
||||
mode = 00400;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("Usage: open <filename>\n");
|
||||
if (argc < 3 || argc > 5) {
|
||||
printf("Usage: open <filename> <flags> <mode>\n");
|
||||
printf(" flags: O = O_RDONLY\n");
|
||||
printf(" R = O_RDWR\n");
|
||||
printf(" W = O_WRONLY\n");
|
||||
printf(" C = O_CREAT\n");
|
||||
printf(" E = O_EXCL\n");
|
||||
printf(" T = O_TRUNC\n");
|
||||
printf(" A = O_APPEND\n");
|
||||
printf(" N = O_NONBLOCK/O_NDELAY\n");
|
||||
printf(" S = O_SYNC\n");
|
||||
printf(" F = O_NOFOLLOW\n");
|
||||
printf(" mode: see open.2\n");
|
||||
printf(" mode is ignored if C flag not present\n");
|
||||
printf(" mode defaults to 00400\n");
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
flags = 0;
|
||||
flagstr = argv[2];
|
||||
while (*flagstr) {
|
||||
switch (*flagstr) {
|
||||
case 'O':
|
||||
flags |= O_RDONLY;
|
||||
break;
|
||||
case 'R':
|
||||
flags |= O_RDWR;
|
||||
break;
|
||||
case 'W':
|
||||
flags |= O_WRONLY;
|
||||
break;
|
||||
case 'C':
|
||||
flags |= O_CREAT;
|
||||
break;
|
||||
case 'E':
|
||||
flags |= O_EXCL;
|
||||
break;
|
||||
case 'T':
|
||||
flags |= O_TRUNC;
|
||||
break;
|
||||
case 'A':
|
||||
flags |= O_APPEND;
|
||||
break;
|
||||
case 'N':
|
||||
flags |= O_NONBLOCK;
|
||||
break;
|
||||
case 'S':
|
||||
flags |= O_SYNC;
|
||||
break;
|
||||
case 'F':
|
||||
flags |= O_NOFOLLOW;
|
||||
break;
|
||||
default:
|
||||
printf("open: error=-1 (invalid flag!)\n");
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
flagstr++;
|
||||
}
|
||||
if ((flags & O_CREAT) && argc == 4) {
|
||||
if (sscanf(argv[3], "%o", &mode) == 0) {
|
||||
printf("open: error=-1 (invalid mode!)\n");
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
}
|
||||
|
||||
fd = vfs->conn->vfs_ops.open(vfs->conn, argv[1], flags, mode);
|
||||
if (fd == -1) {
|
||||
@ -300,15 +359,10 @@ static NTSTATUS cmd_read(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
|
||||
}
|
||||
vfs->data_size = size;
|
||||
|
||||
rsize = 0;
|
||||
while (rsize < size) {
|
||||
int isize;
|
||||
isize = vfs->conn->vfs_ops.read(vfs->files[fd], fd, vfs->data, size);
|
||||
if (isize == -1) {
|
||||
printf("read: error=%d (%s)\n", errno, strerror(errno));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
rsize += isize;
|
||||
rsize = vfs->conn->vfs_ops.read(vfs->files[fd], fd, vfs->data, size);
|
||||
if (rsize == -1) {
|
||||
printf("read: error=%d (%s)\n", errno, strerror(errno));
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
printf("read: ok\n");
|
||||
@ -461,7 +515,7 @@ static NTSTATUS cmd_stat(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
|
||||
printf(" Device: 0x%.10x", st.st_dev);
|
||||
printf(" Inode: %10d", st.st_ino);
|
||||
printf(" Links: %10d\n", st.st_nlink);
|
||||
printf(" Access: %05d ", (st.st_mode) & 0x7fff);
|
||||
printf(" Access: %05o", (st.st_mode) & 007777);
|
||||
printf(" Uid: %5d/%.16s Gid: %5d/%.16s\n", st.st_uid, user, st.st_gid, group);
|
||||
printf(" Access: %s", ctime(&(st.st_atime)));
|
||||
printf(" Modify: %s", ctime(&(st.st_mtime)));
|
||||
@ -523,7 +577,7 @@ static NTSTATUS cmd_fstat(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
|
||||
printf(" Device: 0x%10x", st.st_dev);
|
||||
printf(" Inode: %10d", st.st_ino);
|
||||
printf(" Links: %10d\n", st.st_nlink);
|
||||
printf(" Access: %05d ", (st.st_mode) & 0x7fff);
|
||||
printf(" Access: %05o", (st.st_mode) & 007777);
|
||||
printf(" Uid: %5d/%.16s Gid: %5d/%.16s\n", st.st_uid, user, st.st_gid, group);
|
||||
printf(" Access: %s", ctime(&(st.st_atime)));
|
||||
printf(" Modify: %s", ctime(&(st.st_mtime)));
|
||||
@ -573,7 +627,7 @@ static NTSTATUS cmd_lstat(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
|
||||
printf(" Device: 0x%10x", st.st_dev);
|
||||
printf(" Inode: %10d", st.st_ino);
|
||||
printf(" Links: %10d\n", st.st_nlink);
|
||||
printf(" Access: %05d ", (st.st_mode) & 0x7fff);
|
||||
printf(" Access: %05o", (st.st_mode) & 007777);
|
||||
printf(" Uid: %5d/%.16s Gid: %5d/%.16s\n", st.st_uid, user, st.st_gid, group);
|
||||
printf(" Access: %s", ctime(&(st.st_atime)));
|
||||
printf(" Modify: %s", ctime(&(st.st_mtime)));
|
||||
|
Loading…
x
Reference in New Issue
Block a user