summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/reply.c4
-rw-r--r--source3/smbd/server.c23
2 files changed, 17 insertions, 10 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 46425861d4..116542ba34 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1023,7 +1023,9 @@ int reply_search(char *inbuf,char *outbuf)
if ((dirtype&0x1F) == aVOLID)
{
memcpy(p,status,21);
- make_dir_struct(p,"???????????",volume_label(SNUM(cnum)),0,aVOLID,0);
+ mode = aVOLID;
+ if(!CAN_WRITE(cnum)) mode |= aRONLY;
+ make_dir_struct(p,"???????????",volume_label(SNUM(cnum)),0,mode,0);
dptr_fill(p+12,dptr_num);
if (dptr_zero(p+12) && (status_len==0))
numentries = 1;
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 095bc00e08..25d24eab53 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -4356,6 +4356,7 @@ force write permissions on print services.
#define TIME_INIT (1<<2)
#define CAN_IPC (1<<3)
#define AS_GUEST (1<<5)
+#define DONT_CHECK_ONLINE (1<<6)
/*
@@ -4377,15 +4378,15 @@ struct smb_message_struct
/* CORE PROTOCOL */
- {SMBnegprot,"SMBnegprot",reply_negprot,0},
- {SMBtcon,"SMBtcon",reply_tcon,0},
- {SMBtdis,"SMBtdis",reply_tdis,0},
- {SMBexit,"SMBexit",reply_exit,0},
- {SMBioctl,"SMBioctl",reply_ioctl,0},
- {SMBecho,"SMBecho",reply_echo,0},
- {SMBsesssetupX,"SMBsesssetupX",reply_sesssetup_and_X,0},
- {SMBtconX,"SMBtconX",reply_tcon_and_X,0},
- {SMBulogoffX, "SMBulogoffX", reply_ulogoffX, 0}, /* ulogoff doesn't give a valid TID */
+ {SMBnegprot,"SMBnegprot",reply_negprot,DONT_CHECK_ONLINE},
+ {SMBtcon,"SMBtcon",reply_tcon,DONT_CHECK_ONLINE},
+ {SMBtdis,"SMBtdis",reply_tdis,DONT_CHECK_ONLINE},
+ {SMBexit,"SMBexit",reply_exit,DONT_CHECK_ONLINE},
+ {SMBioctl,"SMBioctl",reply_ioctl,DONT_CHECK_ONLINE},
+ {SMBecho,"SMBecho",reply_echo,DONT_CHECK_ONLINE},
+ {SMBsesssetupX,"SMBsesssetupX",reply_sesssetup_and_X,DONT_CHECK_ONLINE},
+ {SMBtconX,"SMBtconX",reply_tcon_and_X,DONT_CHECK_ONLINE},
+ {SMBulogoffX, "SMBulogoffX", reply_ulogoffX, DONT_CHECK_ONLINE}, /* ulogoff doesn't give a valid TID */
{SMBgetatr,"SMBgetatr",reply_getatr,AS_USER},
{SMBsetatr,"SMBsetatr",reply_setatr,AS_USER | NEED_WRITE},
{SMBchkpth,"SMBchkpth",reply_chkpth,AS_USER},
@@ -4575,6 +4576,10 @@ static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize
if ((flags & AS_GUEST) && (!become_guest() || !check_access(-1)))
return(ERROR(ERRSRV,ERRaccess));
+ /* is this service online? */
+ if (! (flags & DONT_CHECK_ONLINE) && ! lp_online(SNUM(cnum)))
+ return(ERROR(ERRHRD,ERRnotready));
+
last_inbuf = inbuf;
outsize = smb_messages[match].fn(inbuf,outbuf,size,bufsize);