00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "includes.h"
00022
00023
00024
00025
00026
00027
00028 static const char *fix_char_ptr(unsigned int datap, unsigned int converter,
00029 char *rdata, int rdrcnt)
00030 {
00031 if (datap == 0) {
00032 return "";
00033 } else {
00034 unsigned int offset = datap - converter;
00035
00036 if (offset >= rdrcnt) {
00037 DEBUG(1,("bad char ptr: datap=%u, converter=%u rdrcnt=%d>",
00038 datap, converter, rdrcnt));
00039 return "<ERROR>";
00040 } else {
00041 return &rdata[offset];
00042 }
00043 }
00044 }
00045
00046
00047
00048
00049
00050 int cli_print_queue(struct cli_state *cli,
00051 void (*fn)(struct print_job_info *))
00052 {
00053 char *rparam = NULL;
00054 char *rdata = NULL;
00055 char *p;
00056 unsigned int rdrcnt, rprcnt;
00057 pstring param;
00058 int result_code=0;
00059 int i = -1;
00060
00061 memset(param,'\0',sizeof(param));
00062
00063 p = param;
00064 SSVAL(p,0,76);
00065 p += 2;
00066 pstrcpy_base(p,"zWrLeh", param);
00067 p = skip_string(param,sizeof(param),p);
00068 pstrcpy_base(p,"WWzWWDDzz", param);
00069 p = skip_string(param,sizeof(param),p);
00070 pstrcpy_base(p,cli->share, param);
00071 p = skip_string(param,sizeof(param),p);
00072 SSVAL(p,0,2);
00073 SSVAL(p,2,1000);
00074 p += 4;
00075 pstrcpy_base(p,"", param);
00076 p = skip_string(param,sizeof(param),p);
00077
00078 DEBUG(4,("doing cli_print_queue for %s\n", cli->share));
00079
00080 if (cli_api(cli,
00081 param, PTR_DIFF(p,param), 1024,
00082 NULL, 0, CLI_BUFFER_SIZE,
00083 &rparam, &rprcnt,
00084 &rdata, &rdrcnt)) {
00085 int converter;
00086 result_code = SVAL(rparam,0);
00087 converter = SVAL(rparam,2);
00088
00089 if (result_code == 0) {
00090 struct print_job_info job;
00091
00092 p = rdata;
00093
00094 for (i = 0; i < SVAL(rparam,4); ++i) {
00095 job.id = SVAL(p,0);
00096 job.priority = SVAL(p,2);
00097 fstrcpy(job.user,
00098 fix_char_ptr(SVAL(p,4), converter,
00099 rdata, rdrcnt));
00100 job.t = cli_make_unix_date3(cli, p + 12);
00101 job.size = IVAL(p,16);
00102 fstrcpy(job.name,fix_char_ptr(SVAL(p,24),
00103 converter,
00104 rdata, rdrcnt));
00105 fn(&job);
00106 p += 28;
00107 }
00108 }
00109 }
00110
00111
00112 SAFE_FREE(rparam);
00113 SAFE_FREE(rdata);
00114
00115 return i;
00116 }
00117
00118
00119
00120
00121 int cli_printjob_del(struct cli_state *cli, int job)
00122 {
00123 char *rparam = NULL;
00124 char *rdata = NULL;
00125 char *p;
00126 unsigned int rdrcnt,rprcnt;
00127 int ret = -1;
00128 pstring param;
00129
00130 memset(param,'\0',sizeof(param));
00131
00132 p = param;
00133 SSVAL(p,0,81);
00134 p += 2;
00135 pstrcpy_base(p,"W", param);
00136 p = skip_string(param,sizeof(param),p);
00137 pstrcpy_base(p,"", param);
00138 p = skip_string(param,sizeof(param),p);
00139 SSVAL(p,0,job);
00140 p += 2;
00141
00142 if (cli_api(cli,
00143 param, PTR_DIFF(p,param), 1024,
00144 NULL, 0, CLI_BUFFER_SIZE,
00145 &rparam, &rprcnt,
00146 &rdata, &rdrcnt)) {
00147 ret = SVAL(rparam,0);
00148 }
00149
00150 SAFE_FREE(rparam);
00151 SAFE_FREE(rdata);
00152
00153 return ret;
00154 }
00155
00156
00157
00158
00159
00160
00161 int cli_spl_open(struct cli_state *cli, const char *fname, int flags, int share_mode)
00162 {
00163 char *p;
00164 unsigned openfn=0;
00165 unsigned accessmode=0;
00166
00167 if (flags & O_CREAT)
00168 openfn |= (1<<4);
00169 if (!(flags & O_EXCL)) {
00170 if (flags & O_TRUNC)
00171 openfn |= (1<<1);
00172 else
00173 openfn |= (1<<0);
00174 }
00175
00176 accessmode = (share_mode<<4);
00177
00178 if ((flags & O_ACCMODE) == O_RDWR) {
00179 accessmode |= 2;
00180 } else if ((flags & O_ACCMODE) == O_WRONLY) {
00181 accessmode |= 1;
00182 }
00183
00184 #if defined(O_SYNC)
00185 if ((flags & O_SYNC) == O_SYNC) {
00186 accessmode |= (1<<14);
00187 }
00188 #endif
00189
00190 if (share_mode == DENY_FCB) {
00191 accessmode = 0xFF;
00192 }
00193
00194 memset(cli->outbuf,'\0',smb_size);
00195 memset(cli->inbuf,'\0',smb_size);
00196
00197 set_message(cli->outbuf,15,0,True);
00198
00199 SCVAL(cli->outbuf,smb_com,SMBsplopen);
00200 SSVAL(cli->outbuf,smb_tid,cli->cnum);
00201 cli_setup_packet(cli);
00202
00203 SSVAL(cli->outbuf,smb_vwv0,0xFF);
00204 SSVAL(cli->outbuf,smb_vwv2,0);
00205 SSVAL(cli->outbuf,smb_vwv3,accessmode);
00206 SSVAL(cli->outbuf,smb_vwv4,aSYSTEM | aHIDDEN);
00207 SSVAL(cli->outbuf,smb_vwv5,0);
00208 SSVAL(cli->outbuf,smb_vwv8,openfn);
00209
00210 if (cli->use_oplocks) {
00211
00212
00213 SCVAL(cli->outbuf,smb_flg, CVAL(cli->outbuf,smb_flg)|
00214 FLAG_REQUEST_OPLOCK|FLAG_REQUEST_BATCH_OPLOCK);
00215 SSVAL(cli->outbuf,smb_vwv2,SVAL(cli->outbuf,smb_vwv2) | 6);
00216 }
00217
00218 p = smb_buf(cli->outbuf);
00219 p += clistr_push(cli, p, fname, -1, STR_TERMINATE);
00220
00221 cli_setup_bcc(cli, p);
00222
00223 cli_send_smb(cli);
00224 if (!cli_receive_smb(cli)) {
00225 return -1;
00226 }
00227
00228 if (cli_is_error(cli)) {
00229 return -1;
00230 }
00231
00232 return SVAL(cli->inbuf,smb_vwv2);
00233 }
00234
00235
00236
00237
00238
00239 BOOL cli_spl_close(struct cli_state *cli, int fnum)
00240 {
00241 memset(cli->outbuf,'\0',smb_size);
00242 memset(cli->inbuf,'\0',smb_size);
00243
00244 set_message(cli->outbuf,3,0,True);
00245
00246 SCVAL(cli->outbuf,smb_com,SMBsplclose);
00247 SSVAL(cli->outbuf,smb_tid,cli->cnum);
00248 cli_setup_packet(cli);
00249
00250 SSVAL(cli->outbuf,smb_vwv0,fnum);
00251 SIVALS(cli->outbuf,smb_vwv1,-1);
00252
00253 cli_send_smb(cli);
00254 if (!cli_receive_smb(cli)) {
00255 return False;
00256 }
00257
00258 return !cli_is_error(cli);
00259 }
00260
00261