From 7fe5ba774b27b01b91f0d7cc25abf8383b9afca6 Mon Sep 17 00:00:00 2001 From: Matthew Chapman Date: Fri, 23 Apr 1999 14:47:45 +0000 Subject: Adding scheduler control pipe (\atsvc), client-side routines, and rpcclient command "at" (compatible with NT's "at" command - see rpcclient commit) - useful for remote NT administration. (This used to be commit cf30a472f702d7b50c3a85e2cf2f55b46a2bd452) --- source3/rpc_parse/parse_at.c | 275 ++++++++++++++++++++++++++++++++++++++++++ source3/rpc_parse/parse_rpc.c | 11 ++ 2 files changed, 286 insertions(+) create mode 100644 source3/rpc_parse/parse_at.c (limited to 'source3/rpc_parse') diff --git a/source3/rpc_parse/parse_at.c b/source3/rpc_parse/parse_at.c new file mode 100644 index 0000000000..2eb72c8aea --- /dev/null +++ b/source3/rpc_parse/parse_at.c @@ -0,0 +1,275 @@ +/* + * Unix SMB/Netbios implementation. + * Version 2.1. + * RPC parsing routines: scheduler service + * Copyright (C) Matthew Chapman 1999, + * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, + * Copyright (C) Andrew Tridgell 1992-1999. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "includes.h" + +extern int DEBUGLEVEL; + +/******************************************************************* + make_at_q_add_job + ********************************************************************/ +void make_at_q_add_job(AT_Q_ADD_JOB *q_a, char *server, + AT_JOB_INFO *info, char *command) +{ + DEBUG(5,("make_at_q_add_job\n")); + + make_buf_unistr2(&(q_a->uni_srv_name), &(q_a->ptr_srv_name), server); + memcpy(&(q_a->info), info, sizeof(q_a->info)); + make_unistr2(&(q_a->command), command, strlen(command)+1); +} + +/******************************************************************* +reads or writes a AT_JOB_INFO structure. +********************************************************************/ +void at_io_job_info(char *desc, AT_JOB_INFO *info, prs_struct *ps, int depth) +{ + if (info == NULL) return; + + prs_debug(ps, depth, desc, "at_io_job_info"); + depth++; + + prs_align(ps); + + prs_uint32("time", ps, depth, &(info->time)); + prs_uint32("monthdays", ps, depth, &(info->monthdays)); + prs_uint8("weekdays", ps, depth, &(info->weekdays)); + prs_uint8("flags", ps, depth, &(info->flags)); + prs_align(ps); + + prs_uint32("ptr_command", ps, depth, &(info->ptr_command)); +} + +/******************************************************************* +reads or writes a AT_Q_ADD_JOB structure. +********************************************************************/ +void at_io_q_add_job(char *desc, AT_Q_ADD_JOB *q_a, prs_struct *ps, int depth) +{ + if (q_a == NULL) return; + + prs_debug(ps, depth, desc, "at_q_add_job"); + depth++; + + prs_align(ps); + prs_uint32("ptr_srv_name", ps, depth, &(q_a->ptr_srv_name)); + smb_io_unistr2("", &(q_a->uni_srv_name), q_a->ptr_srv_name, ps, depth); + at_io_job_info("", &(q_a->info), ps, depth); + smb_io_unistr2("", &(q_a->command), q_a->info.ptr_command, ps, depth); +} + +/******************************************************************* +reads or writes a AT_R_ADD_JOB structure. +********************************************************************/ +void at_io_r_add_job(char *desc, AT_R_ADD_JOB *r_a, prs_struct *ps, int depth) +{ + if (r_a == NULL) return; + + prs_debug(ps, depth, desc, "at_r_add_job"); + depth++; + + prs_align(ps); + prs_uint32("jobid", ps, depth, &(r_a->jobid)); + prs_uint32("status", ps, depth, &(r_a->status)); +} + +/******************************************************************* + make_at_q_del_job + ********************************************************************/ +void make_at_q_del_job(AT_Q_DEL_JOB *q_a, char *server, uint32 min_jobid, + uint32 max_jobid) +{ + DEBUG(5,("make_at_q_del_job\n")); + + make_buf_unistr2(&(q_a->uni_srv_name), &(q_a->ptr_srv_name), server); + q_a->min_jobid = min_jobid; + q_a->max_jobid = max_jobid; +} + +/******************************************************************* +reads or writes a AT_Q_DEL_JOB structure. +********************************************************************/ +void at_io_q_del_job(char *desc, AT_Q_DEL_JOB *q_d, prs_struct *ps, int depth) +{ + if (q_d == NULL) return; + + prs_debug(ps, depth, desc, "at_q_del_job"); + depth++; + + prs_align(ps); + + prs_uint32("ptr_srv_name", ps, depth, &(q_d->ptr_srv_name)); + smb_io_unistr2("", &(q_d->uni_srv_name), q_d->ptr_srv_name, ps, depth); + prs_align(ps); + prs_uint32("min_jobid", ps, depth, &(q_d->min_jobid)); + prs_uint32("max_jobid", ps, depth, &(q_d->max_jobid)); +} + +/******************************************************************* +reads or writes a AT_R_DEL_JOB structure. +********************************************************************/ +void at_io_r_del_job(char *desc, AT_R_DEL_JOB *r_d, prs_struct *ps, int depth) +{ + if (r_d == NULL) return; + + prs_debug(ps, depth, desc, "at_r_del_job"); + depth++; + + prs_align(ps); + prs_uint32("status", ps, depth, &(r_d->status)); +} + +/******************************************************************* + make_at_q_enum_jobs + ********************************************************************/ +void make_at_q_enum_jobs(AT_Q_ENUM_JOBS *q_e, char *server) +{ + DEBUG(5,("make_at_q_enum_jobs\n")); + + make_buf_unistr2(&(q_e->uni_srv_name), &(q_e->ptr_srv_name), server); + q_e->unknown0 = 0; + q_e->unknown1 = 0; + q_e->max_len = 0xffff; + q_e->ptr_resume = 1; + q_e->hnd_resume = 0; +} + +/******************************************************************* +reads or writes a AT_Q_ENUM_JOBS structure. +********************************************************************/ +void at_io_q_enum_jobs(char *desc, AT_Q_ENUM_JOBS *q_e, prs_struct *ps, int depth) +{ + if (q_e == NULL) return; + + prs_debug(ps, depth, desc, "at_q_enum_jobs"); + depth++; + + prs_align(ps); + prs_uint32("ptr_srv_name", ps, depth, &(q_e->ptr_srv_name)); + smb_io_unistr2("", &(q_e->uni_srv_name), q_e->ptr_srv_name, ps, depth); + prs_align(ps); + prs_uint32("unknown0", ps, depth, &(q_e->unknown0)); + prs_uint32("unknown1", ps, depth, &(q_e->unknown1)); + prs_uint32("max_len" , ps, depth, &(q_e->max_len )); + + prs_uint32("ptr_resume", ps, depth, &(q_e->ptr_resume)); + prs_uint32("hnd_resume", ps, depth, &(q_e->hnd_resume)); +} + +/******************************************************************* +reads or writes a AT_R_ENUM_JOBS structure. +********************************************************************/ +void at_io_r_enum_jobs(char *desc, AT_R_ENUM_JOBS *r_e, prs_struct *ps, int depth) +{ + if (r_e == NULL) return; + + prs_debug(ps, depth, desc, "at_r_enum_jobs"); + depth++; + + prs_align(ps); + prs_uint32("num_entries", ps, depth, &(r_e->num_entries)); + prs_uint32("ptr_entries", ps, depth, &(r_e->ptr_entries)); + + if (r_e->ptr_entries != 0) + { + int i; + + prs_uint32("num_entries2", ps, depth, &(r_e->num_entries2)); + if (r_e->num_entries2 != r_e->num_entries) + { + /* RPC fault */ + return; + } + + SMB_ASSERT_ARRAY(r_e->info, r_e->num_entries2); + + for (i = 0; i < r_e->num_entries2; i++) + { + prs_grow(ps); + prs_uint32("jobid", ps, depth, &(r_e->info[i].jobid)); + at_io_job_info("", &(r_e->info[i].info), ps, depth); + } + + for (i = 0; i < r_e->num_entries2; i++) + { + prs_grow(ps); + smb_io_unistr2("", &(r_e->command[i]), + r_e->info[i].info.ptr_command, ps, depth); + } + } + + prs_align(ps); + prs_uint32("total_entries", ps, depth, &(r_e->total_entries)); + prs_uint32("ptr_resume" , ps, depth, &(r_e->ptr_resume )); + prs_uint32("hnd_resume" , ps, depth, &(r_e->hnd_resume )); + + prs_uint32("status", ps, depth, &(r_e->status)); +} + +/******************************************************************* + make_at_q_query_job + ********************************************************************/ +void make_at_q_query_job(AT_Q_QUERY_JOB *q_q, char *server, uint32 jobid) +{ + DEBUG(5,("make_at_q_query_job\n")); + + make_buf_unistr2(&(q_q->uni_srv_name), &(q_q->ptr_srv_name), server); + q_q->jobid = jobid; +} + +/******************************************************************* +reads or writes a AT_Q_QUERY_JOB structure. +********************************************************************/ +void at_io_q_query_job(char *desc, AT_Q_QUERY_JOB *q_q, prs_struct *ps, int depth) +{ + if (q_q == NULL) return; + + prs_debug(ps, depth, desc, "at_q_query_job"); + depth++; + + prs_align(ps); + prs_uint32("ptr_srv_name", ps, depth, &(q_q->ptr_srv_name)); + smb_io_unistr2("", &(q_q->uni_srv_name), q_q->ptr_srv_name, ps, depth); + prs_align(ps); + prs_uint32("jobid", ps, depth, &(q_q->jobid)); +} + +/******************************************************************* +reads or writes a AT_R_QUERY_JOB structure. +********************************************************************/ +void at_io_r_query_job(char *desc, AT_R_QUERY_JOB *r_q, prs_struct *ps, int depth) +{ + if (r_q == NULL) return; + + prs_debug(ps, depth, desc, "at_r_query_job"); + depth++; + + prs_align(ps); + prs_uint32("ptr_info", ps, depth, &(r_q->ptr_info)); + if (r_q->ptr_info != 0) + { + at_io_job_info("", &(r_q->info), ps, depth); + smb_io_unistr2("", &(r_q->command), r_q->info.ptr_command, ps, depth); + } + + prs_align(ps); + prs_uint32("status", ps, depth, &(r_q->status)); +} diff --git a/source3/rpc_parse/parse_rpc.c b/source3/rpc_parse/parse_rpc.c index 9716b35b78..81e7ffa116 100644 --- a/source3/rpc_parse/parse_rpc.c +++ b/source3/rpc_parse/parse_rpc.c @@ -122,6 +122,16 @@ interface/version dce/rpc pipe identification }, 0x01 \ } \ +#define SYNT_ATSVC_V1 \ +{ \ + { \ + 0x82, 0x06, 0xf7, 0x1f, \ + 0x51, 0x0a, 0xe8, 0x30, \ + 0x07, 0x6d, 0x74, 0x0b, \ + 0xe8, 0xce, 0xe9, 0x8b \ + }, 0x01 \ +} \ + #define SYNT_NONE_V0 \ { \ { \ @@ -142,6 +152,7 @@ struct pipe_id_info pipe_names [] = { PIPE_SVCCTL , SYNT_SVCCTL_V2 , PIPE_NTSVCS , TRANS_SYNT_V2 }, { PIPE_WKSSVC , SYNT_WKSSVC_V1 , PIPE_NTSVCS , TRANS_SYNT_V2 }, { PIPE_WINREG , SYNT_WINREG_V1 , PIPE_WINREG , TRANS_SYNT_V2 }, + { PIPE_ATSVC , SYNT_ATSVC_V1 , PIPE_ATSVC , TRANS_SYNT_V2 }, { NULL , SYNT_NONE_V0 , NULL , SYNT_NONE_V0 } }; -- cgit