svn commit: samba r19504 - in branches/SAMBA_4_0/source: lib/util
smb_server/smb torture/raw
tridge at samba.org
tridge at samba.org
Sat Oct 28 06:06:15 GMT 2006
Author: tridge
Date: 2006-10-28 06:06:15 +0000 (Sat, 28 Oct 2006)
New Revision: 19504
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=19504
Log:
- fixed a free error in file_lines_parse
- added a function to test for large file support
- enable CAP_LARGE_FILES only if the test passes
- don't test at large offsets if the server doesn't set
CAP_LARGE_FILES
Modified:
branches/SAMBA_4_0/source/lib/util/util_file.c
branches/SAMBA_4_0/source/smb_server/smb/negprot.c
branches/SAMBA_4_0/source/torture/raw/read.c
branches/SAMBA_4_0/source/torture/raw/write.c
Changeset:
Modified: branches/SAMBA_4_0/source/lib/util/util_file.c
===================================================================
--- branches/SAMBA_4_0/source/lib/util/util_file.c 2006-10-28 05:21:11 UTC (rev 19503)
+++ branches/SAMBA_4_0/source/lib/util/util_file.c 2006-10-28 06:06:15 UTC (rev 19504)
@@ -241,6 +241,7 @@
/**
parse a buffer into lines
+'p' will be freed on error, and otherwise will be made a child of the returned array
**/
static char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx)
{
@@ -259,7 +260,7 @@
return NULL;
}
- talloc_reference(ret, p);
+ talloc_steal(ret, p);
memset(ret, 0, sizeof(ret[0])*(i+2));
if (numlines) *numlines = i;
@@ -285,17 +286,12 @@
_PUBLIC_ char **file_lines_load(const char *fname, int *numlines, TALLOC_CTX *mem_ctx)
{
char *p;
- char **lines;
size_t size;
p = file_load(fname, &size, mem_ctx);
if (!p) return NULL;
- lines = file_lines_parse(p, size, numlines, mem_ctx);
-
- talloc_free(p);
-
- return lines;
+ return file_lines_parse(p, size, numlines, mem_ctx);
}
/**
@@ -306,17 +302,12 @@
_PUBLIC_ char **fd_lines_load(int fd, int *numlines, TALLOC_CTX *mem_ctx)
{
char *p;
- char **lines;
size_t size;
p = fd_load(fd, &size, mem_ctx);
if (!p) return NULL;
- lines = file_lines_parse(p, size, numlines, mem_ctx);
-
- talloc_free(p);
-
- return lines;
+ return file_lines_parse(p, size, numlines, mem_ctx);
}
@@ -385,3 +376,24 @@
va_end(ap);
return ret;
}
+
+
+/*
+ try to determine if the filesystem supports large files
+*/
+_PUBLIC_ bool large_file_support(const char *path)
+{
+ int fd;
+ ssize_t ret;
+ char c;
+
+ fd = open(path, O_RDWR|O_CREAT, 0600);
+ unlink(path);
+ if (fd == -1) {
+ /* have to assume large files are OK */
+ return true;
+ }
+ ret = pread(fd, &c, 1, ((uint64_t)1)<<32);
+ close(fd);
+ return ret == 0;
+}
Modified: branches/SAMBA_4_0/source/smb_server/smb/negprot.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb/negprot.c 2006-10-28 05:21:11 UTC (rev 19503)
+++ branches/SAMBA_4_0/source/smb_server/smb/negprot.c 2006-10-28 06:06:15 UTC (rev 19504)
@@ -250,6 +250,7 @@
time_t t = req->request_time.tv_sec;
NTTIME nttime;
BOOL negotiate_spnego = False;
+ char *large_test_path;
unix_to_nt_time(&nttime, t);
@@ -277,9 +278,12 @@
if (lp_large_readwrite()) {
capabilities |= CAP_LARGE_READX | CAP_LARGE_WRITEX | CAP_W2K_SMBS;
}
-
- capabilities |= CAP_LARGE_FILES;
+ large_test_path = lock_path(req, "large_test.dat");
+ if (large_file_support(large_test_path)) {
+ capabilities |= CAP_LARGE_FILES;
+ }
+
if (lp_readraw() && lp_writeraw()) {
capabilities |= CAP_RAW_MODE;
}
Modified: branches/SAMBA_4_0/source/torture/raw/read.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/read.c 2006-10-28 05:21:11 UTC (rev 19503)
+++ branches/SAMBA_4_0/source/torture/raw/read.c 2006-10-28 06:06:15 UTC (rev 19504)
@@ -522,6 +522,11 @@
status = smb_raw_read(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
+ if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+ printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+ goto done;
+ }
+
printf("Trying large offset read\n");
io.readx.in.offset = ((uint64_t)0x2) << 32;
io.readx.in.mincnt = 10;
Modified: branches/SAMBA_4_0/source/torture/raw/write.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/write.c 2006-10-28 05:21:11 UTC (rev 19503)
+++ branches/SAMBA_4_0/source/torture/raw/write.c 2006-10-28 06:06:15 UTC (rev 19504)
@@ -182,6 +182,11 @@
printf("Setting file as sparse\n");
status = torture_set_sparse(cli->tree, fnum);
CHECK_STATUS(status, NT_STATUS_OK);
+
+ if (!(cli->transport->negotiate.capabilities & CAP_LARGE_FILES)) {
+ printf("skipping large file tests - CAP_LARGE_FILES not set\n");
+ goto done;
+ }
printf("Trying 2^32 offset\n");
setup_buffer(buf, seed, maxsize);
More information about the samba-cvs
mailing list