SOFF_T() macro for setting an SMB_OFF_T variable
also limited mmap based reads to MAX_MMAP_SIZE. We really can't mmap
2^50 bytes due to virtual address space problems.
#define SMB_OFF_T_BITS (sizeof(SMB_OFF_T)*8)
#define SMB_OFF_T_BITS (sizeof(SMB_OFF_T)*8)
+
+#ifdef LARGE_SMB_OFF_T
+#define SOFF_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32))
+#else
+#define SOFF_T(p, ofs, v) SIVAL(p,ofs,v)
+#endif
+
+
/*
* Set the define that tells us if we can do 64 bit
* NT SMB calls.
/*
* Set the define that tells us if we can do 64 bit
* NT SMB calls.
/* the size of the uid cache used to reduce valid user checks */
#define UID_CACHE_SIZE 4
/* the size of the uid cache used to reduce valid user checks */
#define UID_CACHE_SIZE 4
+/* if mmap is enabled, then this is the maximum size of file to use
+ the mmap code on. We don't want to mmap huge files as virtual
+ address spaces are limited */
+#define MAX_MMAP_SIZE (100*0x100000)
+
/* the following control timings of various actions. Don't change
them unless you know what you are doing. These are all in seconds */
#define DEFAULT_SMBD_TIMEOUT (60*60*24*7)
/* the following control timings of various actions. Don't change
them unless you know what you are doing. These are all in seconds */
#define DEFAULT_SMBD_TIMEOUT (60*60*24*7)
#if WITH_MMAP
if (fsp->mmap_ptr) {
#if WITH_MMAP
if (fsp->mmap_ptr) {
- SMB_OFF_T num = (fsp->mmap_size > pos) ? (fsp->mmap_size - pos) : -1;
- num = MIN(n,num);
-#ifdef LARGE_SMB_OFF_T
- if ((num > 0) && (num < (1LL<<(sizeof(size_t)*8)))) {
-#else /* LARGE_SMB_OFF_T */
- if (num > 0) {
-#endif /* LARGE_SMB_OFF_T */
- memcpy(data,fsp->mmap_ptr+pos,num);
- data += num;
- pos += num;
- n -= num;
- ret += num;
- }
+ SMB_OFF_T num = (fsp->mmap_size > pos) ? (fsp->mmap_size - pos) : -1;
+ num = MIN(n,num);
+ if (num > 0) {
+ memcpy(data,fsp->mmap_ptr+pos,num);
+ data += num;
+ pos += num;
+ n -= num;
+ ret += num;
+ }
/* dual names + lock_and_read + nt SMBs + remote API calls */
int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ|
(lp_nt_smb_support() ? CAP_NT_SMBS | CAP_RPC_REMOTE_APIS : 0) |
/* dual names + lock_and_read + nt SMBs + remote API calls */
int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ|
(lp_nt_smb_support() ? CAP_NT_SMBS | CAP_RPC_REMOTE_APIS : 0) |
-#ifdef LARGE_SMB_OFF_T
- (sizeof(SMB_OFF_T) == 8 ? CAP_LARGE_FILES : 0);
-#else
- 0;
-#endif
+ (SMB_OFF_T_BITS == 64 ? CAP_LARGE_FILES : 0);
+
/*
other valid capabilities which we may support at some time...
/*
other valid capabilities which we may support at some time...
put_long_date(p,sbuf.st_mtime); /* change time */
p += 8;
SIVAL(p,0,fmode); /* File Attributes. */
put_long_date(p,sbuf.st_mtime); /* change time */
p += 8;
SIVAL(p,0,fmode); /* File Attributes. */
- p += 4;
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,0, file_len);
- SIVAL(p,4, file_len >> 32);
-#else /* LARGE_SMB_OFF_T */
- SIVAL(p,0,file_len);
-#endif /* LARGE_SMB_OFF_T */
+ p += 4;
+ SOFF_T(p, 0, file_len);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,0, file_len);
- SIVAL(p,4, file_len >> 32);
-#else /* LARGE_SMB_OFF_T */
- SIVAL(p,0,file_len);
-#endif /* LARGE_SMB_OFF_T */
p += 12;
SCVAL(p,0,fsp->is_directory ? 1 : 0);
p += 12;
SCVAL(p,0,fsp->is_directory ? 1 : 0);
p += 8;
SIVAL(p,0,fmode); /* File Attributes. */
p += 4;
p += 8;
SIVAL(p,0,fmode); /* File Attributes. */
p += 4;
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,0, file_len);
- SIVAL(p,4, (file_len >> 32));
-#else /* LARGE_SMB_OFF_T */
- SIVAL(p,0,file_len);
-#endif /* LARGE_SMB_OFF_T */
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,0, file_len);
- SIVAL(p,4, (file_len >> 32));
-#else /* LARGE_SMB_OFF_T */
- SIVAL(p,0,file_len);
-#endif /* LARGE_SMB_OFF_T */
}
/* Send the required number of replies */
}
/* Send the required number of replies */
/* mmap it if read-only */
if (!fsp->can_write) {
fsp->mmap_size = file_size(fname);
/* mmap it if read-only */
if (!fsp->can_write) {
fsp->mmap_size = file_size(fname);
- fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size,
- PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0);
-
- if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr) {
- DEBUG(3,("Failed to mmap() %s - %s\n",
- fname,strerror(errno)));
- fsp->mmap_ptr = NULL;
+ if (fsp->mmap_size < MAX_MMAP_SIZE) {
+ fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size,
+ PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0);
+
+ if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr) {
+ DEBUG(3,("Failed to mmap() %s - %s\n",
+ fname,strerror(errno)));
+ fsp->mmap_ptr = NULL;
+ }
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size);
- SIVAL(p,8,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,4,size >> 32);
- SIVAL(p,12,size >> 32);
-#endif /* LARGE_SMB_OFF_T */
+ SOFF_T(p,0,size);
+ SOFF_T(p,8,size);
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size);
- SIVAL(p,8,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,4,size >> 32);
- SIVAL(p,12,size >> 32);
-#endif /* LARGE_SMB_OFF_T */
+ SOFF_T(p,0,size);
+ SOFF_T(p,8,size);
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,adate); p += 8;
put_long_date(p,mdate); p += 8;
put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size);
- SIVAL(p,8,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(p,4,size >> 32);
- SIVAL(p,12,size >> 32);
-#endif /* LARGE_SMB_OFF_T */
+ SOFF_T(p,0,size);
+ SOFF_T(p,8,size);
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
p += 16;
SIVAL(p,0,nt_extmode); p += 4;
SIVAL(p,0,strlen(fname)); p += 4;
case SMB_QUERY_FILE_STANDARD_INFO:
data_size = 22;
case SMB_QUERY_FILE_STANDARD_INFO:
data_size = 22;
- SIVAL(pdata,0,size);
- SIVAL(pdata,8,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(pdata,4,size>>32);
- SIVAL(pdata,12,size>>32);
-#endif /* LARGE_SMB_OFF_T */
+ SOFF_T(pdata,0,size);
+ SOFF_T(pdata,8,size);
SIVAL(pdata,16,sbuf.st_nlink);
CVAL(pdata,20) = 0;
CVAL(pdata,21) = (mode&aDIR)?1:0;
SIVAL(pdata,16,sbuf.st_nlink);
CVAL(pdata,20) = 0;
CVAL(pdata,21) = (mode&aDIR)?1:0;
case SMB_QUERY_FILE_ALLOCATION_INFO:
case SMB_QUERY_FILE_END_OF_FILEINFO:
data_size = 8;
case SMB_QUERY_FILE_ALLOCATION_INFO:
case SMB_QUERY_FILE_END_OF_FILEINFO:
data_size = 8;
- SIVAL(pdata,0,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(pdata,4,size >> 32);
-#endif /* LARGE_SMB_OFF_T */
break;
case SMB_QUERY_FILE_ALL_INFO:
break;
case SMB_QUERY_FILE_ALL_INFO:
put_long_date(pdata+24,sbuf.st_mtime); /* change time */
SIVAL(pdata,32,mode);
pdata += 40;
put_long_date(pdata+24,sbuf.st_mtime); /* change time */
SIVAL(pdata,32,mode);
pdata += 40;
- SIVAL(pdata,0,size);
- SIVAL(pdata,8,size);
-#ifdef LARGE_SMB_OFF_T
- SIVAL(pdata,4,size >> 32);
- SIVAL(pdata,12,size >> 32);
-#endif /* LARGE_SMB_OFF_T */
+ SOFF_T(pdata,0,size);
+ SOFF_T(pdata,8,size);
SIVAL(pdata,16,sbuf.st_nlink);
CVAL(pdata,20) = 0;
CVAL(pdata,21) = (mode&aDIR)?1:0;
SIVAL(pdata,16,sbuf.st_nlink);
CVAL(pdata,20) = 0;
CVAL(pdata,21) = (mode&aDIR)?1:0;