#include "includes.h"
+#include "system/filesys.h"
+#include "smbd/smbd.h"
+#include "smbd/globals.h"
+#include "smbprofile.h"
extern userdom_struct current_user_info;
char *msg;
};
-static struct msg_state *smbd_msg_state;
-
/****************************************************************************
Deliver the message.
****************************************************************************/
static void msg_deliver(struct msg_state *state)
{
TALLOC_CTX *frame = talloc_stackframe();
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
char *name = NULL;
int i;
int fd;
ssize_t sz;
fstring alpha_buf;
char *s;
+ mode_t mask;
- if (! (*lp_msg_command())) {
+ if (! (*lp_message_command(frame, lp_sub))) {
DEBUG(1,("no messaging command specified\n"));
goto done;
}
if (!name) {
goto done;
}
- fd = smb_mkstemp(name);
+ mask = umask(S_IRWXO | S_IRWXG);
+ fd = mkstemp(name);
+ umask(mask);
if (fd == -1) {
DEBUG(1, ("can't open message file %s: %s\n", name,
if (!convert_string_talloc(talloc_tos(), CH_DOS, CH_UNIX, state->msg,
talloc_get_size(state->msg), (void *)&msg,
- &len, true)) {
+ &len)) {
DEBUG(3, ("Conversion failed, delivering message in DOS "
"codepage format\n"));
msg = state->msg;
close(fd);
/* run the command */
- s = talloc_strdup(talloc_tos(), lp_msg_command());
+ s = lp_message_command(frame, lp_sub);
if (s == NULL) {
goto done;
}
if (s == NULL) {
goto done;
}
- smbrun(s,NULL);
+ smbrun(s, NULL, NULL);
done:
TALLOC_FREE(frame);
void reply_sends(struct smb_request *req)
{
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
struct msg_state *state;
int len;
- const char *msg;
- const char *p;
+ const uint8_t *msg;
+ const uint8_t *p;
START_PROFILE(SMBsends);
- if (!(*lp_msg_command())) {
- reply_doserror(req, ERRSRV, ERRmsgoff);
+ if (!(*lp_message_command(talloc_tos(), lp_sub))) {
+ reply_nterror(req, NT_STATUS_REQUEST_NOT_ACCEPTED);
END_PROFILE(SMBsends);
return;
}
state = talloc(talloc_tos(), struct msg_state);
- p = (const char *)req->buf + 1;
+ p = req->buf + 1;
p += srvstr_pull_req_talloc(
state, req, &state->from, p, STR_ASCII|STR_TERMINATE) + 1;
p += srvstr_pull_req_talloc(
msg = p;
len = SVAL(msg,0);
- len = MIN(len, smb_bufrem(req->inbuf, msg+2));
+ len = MIN(len, smbreq_bufrem(req, msg+2));
state->msg = talloc_array(state, char, len);
void reply_sendstrt(struct smb_request *req)
{
- const char *p;
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
+ struct smbXsrv_connection *xconn = req->xconn;
+ const uint8_t *p;
START_PROFILE(SMBsendstrt);
- if (!(*lp_msg_command())) {
- reply_doserror(req, ERRSRV, ERRmsgoff);
+ if (!(*lp_message_command(talloc_tos(), lp_sub))) {
+ reply_nterror(req, NT_STATUS_REQUEST_NOT_ACCEPTED);
END_PROFILE(SMBsendstrt);
return;
}
- TALLOC_FREE(smbd_msg_state);
+ TALLOC_FREE(xconn->smb1.msg_state);
- smbd_msg_state = TALLOC_ZERO_P(NULL, struct msg_state);
+ xconn->smb1.msg_state = talloc_zero(xconn, struct msg_state);
- if (smbd_msg_state == NULL) {
+ if (xconn->smb1.msg_state == NULL) {
reply_nterror(req, NT_STATUS_NO_MEMORY);
END_PROFILE(SMBsendstrt);
return;
}
- p = (const char *)req->buf+1;
+ p = req->buf+1;
p += srvstr_pull_req_talloc(
- smbd_msg_state, req, &smbd_msg_state->from, p,
+ xconn->smb1.msg_state, req,
+ &xconn->smb1.msg_state->from, p,
STR_ASCII|STR_TERMINATE) + 1;
p += srvstr_pull_req_talloc(
- smbd_msg_state, req, &smbd_msg_state->to, p,
+ xconn->smb1.msg_state, req,
+ &xconn->smb1.msg_state->to, p,
STR_ASCII|STR_TERMINATE) + 1;
- DEBUG( 3, ( "SMBsendstrt (from %s to %s)\n", smbd_msg_state->from,
- smbd_msg_state->to ) );
+ DEBUG(3, ("SMBsendstrt (from %s to %s)\n",
+ xconn->smb1.msg_state->from,
+ xconn->smb1.msg_state->to));
reply_outbuf(req, 0, 0);
void reply_sendtxt(struct smb_request *req)
{
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
+ struct smbXsrv_connection *xconn = req->xconn;
int len;
const char *msg;
char *tmp;
START_PROFILE(SMBsendtxt);
- if (! (*lp_msg_command())) {
- reply_doserror(req, ERRSRV, ERRmsgoff);
+ if (! (*lp_message_command(talloc_tos(), lp_sub))) {
+ reply_nterror(req, NT_STATUS_REQUEST_NOT_ACCEPTED);
END_PROFILE(SMBsendtxt);
return;
}
- if (smbd_msg_state == NULL) {
+ if ((xconn->smb1.msg_state == NULL) || (req->buflen < 3)) {
reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
END_PROFILE(SMBsendtxt);
return;
msg = (const char *)req->buf + 1;
- old_len = talloc_get_size(smbd_msg_state->msg);
+ old_len = talloc_get_size(xconn->smb1.msg_state->msg);
- len = MIN(SVAL(msg, 0), smb_bufrem(req->inbuf, msg+2));
+ len = MIN(SVAL(msg, 0), smbreq_bufrem(req, msg+2));
- tmp = TALLOC_REALLOC_ARRAY(smbd_msg_state, smbd_msg_state->msg,
- char, old_len + len);
+ tmp = talloc_realloc(xconn->smb1.msg_state,
+ xconn->smb1.msg_state->msg,
+ char, old_len + len);
if (tmp == NULL) {
reply_nterror(req, NT_STATUS_NO_MEMORY);
return;
}
- smbd_msg_state->msg = tmp;
+ xconn->smb1.msg_state->msg = tmp;
- memcpy(&smbd_msg_state->msg[old_len], msg+2, len);
+ memcpy(&xconn->smb1.msg_state->msg[old_len], msg+2, len);
DEBUG( 3, ( "SMBsendtxt\n" ) );
void reply_sendend(struct smb_request *req)
{
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
+ struct smbXsrv_connection *xconn = req->xconn;
START_PROFILE(SMBsendend);
- if (! (*lp_msg_command())) {
- reply_doserror(req, ERRSRV, ERRmsgoff);
+ if (! (*lp_message_command(talloc_tos(), lp_sub))) {
+ reply_nterror(req, NT_STATUS_REQUEST_NOT_ACCEPTED);
+ END_PROFILE(SMBsendend);
+ return;
+ }
+
+ if (xconn->smb1.msg_state == NULL) {
+ reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
END_PROFILE(SMBsendend);
return;
}
DEBUG(3,("SMBsendend\n"));
- msg_deliver(smbd_msg_state);
+ msg_deliver(xconn->smb1.msg_state);
- TALLOC_FREE(smbd_msg_state);
+ TALLOC_FREE(xconn->smb1.msg_state);
reply_outbuf(req, 0, 0);