fixed a bug in the printjob encoding/decoding. We weren't doing it for
authorAndrew Tridgell <tridge@samba.org>
Sun, 31 Aug 1997 02:18:59 +0000 (02:18 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 31 Aug 1997 02:18:59 +0000 (02:18 +0000)
the print_ functions in reply.c, with the effect that you couldn't
cancel print jobs from smbclient or from older dos clients.

we now use a couple of utility functions printjob_encode() and
printjob_decode() rather than sticking the bitops inline in each
place.

also fixed a bunch of places that used foo%0xFF rather than foo&0xFF

Note that this isn't really me doing the commit, it can't be as I'm
working on my thesis ...
(This used to be commit 3556763be3acbf01c967ee9717943dd44163fb9f)

source3/printing/printing.c
source3/smbd/ipc.c
source3/smbd/reply.c

index c4dd9803ebe742f1e36079d17dd8919be1aa02f0..c83d2169891df7716b70ced31fafff852c5932a5 100644 (file)
@@ -929,8 +929,8 @@ int get_printqueue(int snum,int cnum,print_queue_struct **queue,
   
   if (!printername || !*printername)
     {
-      DEBUG(6,("replacing printer name with service (snum=(%s,%d))\n",
-           lp_servicename(snum),snum));
+      DEBUG(6,("xx replacing printer name with service (snum=(%s,%d))\n",
+              lp_servicename(snum),snum));
       printername = lp_servicename(snum);
     }
     
@@ -1080,3 +1080,23 @@ void status_printjob(int cnum,int snum,int jobid,int status)
 }
 
 
+
+/****************************************************************************
+we encode print job numbers over the wire so that when we get them back we can
+tell not only what print job they are but also what service it belongs to,
+this is to overcome the problem that windows clients tend to send the wrong
+service number when doing print queue manipulation!
+****************************************************************************/
+int printjob_encode(int snum, int job)
+{
+       return ((snum&0xFF)<<8) | (job & 0xFF);
+}
+
+/****************************************************************************
+and now decode them again ...
+****************************************************************************/
+void printjob_decode(int jobid, int *snum, int *job)
+{
+       (*snum) = (jobid >> 8) & 0xFF;
+       (*job) = jobid & 0xFF;
+}
index e21021c0ac55d938ffcece8deadac1670df03dae..55e293d7ffd20c3eb5c43ea1fe3470fc729d6b23 100644 (file)
@@ -480,7 +480,7 @@ static void fill_printjob_info(int cnum, int snum, int uLevel,
   /* the client expects localtime */
   t -= TimeDiff(t);
 
-  PACKI(desc,"W",((snum%0xFF)<<8) | (queue->job%0xFF)); /* uJobId */
+  PACKI(desc,"W",printjob_encode(snum, queue->job)); /* uJobId */
   if (uLevel == 1) {
     PACKS(desc,"B21",queue->user); /* szUserName */
     PACKS(desc,"B","");                /* pad */
@@ -1405,11 +1405,10 @@ static BOOL api_RDosPrintJobDel(int cnum,uint16 vuid, char *param,char *data,
   char *str1 = param+2;
   char *str2 = skip_string(str1,1);
   char *p = skip_string(str2,1);
-  int jobid = (SVAL(p,0)&0xFF); /* the snum and jobid are encoded
-                                  by the print queue api */
-  int snum = (SVAL(p,0)>>8);  
+  int jobid, snum;
   int i, count;
 
+  printjob_decode(SVAL(p,0), &snum, &jobid);
 
   /* check it's a supported varient */
   if (!(strcsequal(str1,"W") && strcsequal(str2,"")))
@@ -1429,7 +1428,7 @@ static BOOL api_RDosPrintJobDel(int cnum,uint16 vuid, char *param,char *data,
       count = get_printqueue(snum,cnum,&queue,NULL);
   
       for (i=0;i<count;i++)
-       if ((queue[i].job%0xFF) == jobid)
+       if ((queue[i].job&0xFF) == jobid)
          {
            switch (function) {
            case 81:            /* delete */ 
@@ -1538,13 +1537,13 @@ static BOOL api_PrintJobInfo(int cnum,uint16 vuid,char *param,char *data,
   char *str1 = param+2;
   char *str2 = skip_string(str1,1);
   char *p = skip_string(str2,1);
-  int jobid = (SVAL(p,0)&0xFF); /* the snum and jobid are encoded
-                                  by the print queue api */
-  int snum = (SVAL(p,0)>>8);
+  int jobid, snum;
   int uLevel = SVAL(p,2);
   int function = SVAL(p,4);    /* what is this ?? */
   int i;
   char *s = data;
+
+  printjob_decode(SVAL(p,0), &snum, &jobid);
    
   *rparam_len = 4;
   *rparam = REALLOC(*rparam,*rparam_len);
@@ -1565,7 +1564,7 @@ static BOOL api_PrintJobInfo(int cnum,uint16 vuid,char *param,char *data,
        lpq_reset(snum);
        count = get_printqueue(snum,cnum,&queue,NULL);
        for (i=0;i<count;i++)   /* find job */
-         if ((queue[i].job%0xFF) == jobid) break;
+         if ((queue[i].job&0xFF) == jobid) break;
            
        if (i==count) {
          desc.errcode=NERR_JobNotFound;
@@ -2317,7 +2316,6 @@ static BOOL api_WPrintJobGetInfo(int cnum,uint16 vuid, char *param,char *data,
   char *str1 = param+2;
   char *str2 = skip_string(str1,1);
   char *p = skip_string(str2,1);
-  int uJobId = SVAL(p,0);
   int uLevel,cbBuf;
   int count;
   int i;
@@ -2333,20 +2331,19 @@ static BOOL api_WPrintJobGetInfo(int cnum,uint16 vuid, char *param,char *data,
   bzero(&desc,sizeof(desc));
   bzero(&status,sizeof(status));
 
-  DEBUG(3,("WPrintJobGetInfo uLevel=%d uJobId=0x%X\n",uLevel,uJobId));
+  DEBUG(3,("WPrintJobGetInfo uLevel=%d uJobId=0x%X\n",uLevel,SVAL(p,0)));
 
   /* check it's a supported varient */
   if (strcmp(str1,"WWrLh") != 0) return False;
   if (!check_printjob_info(&desc,uLevel,str2)) return False;
 
-  snum = (unsigned int)uJobId >> 8; /*## valid serice number??*/
-  job = uJobId & 0xFF;
+  printjob_decode(SVAL(p,0), &snum, &job);
 
   if (snum < 0 || !VALID_SNUM(snum)) return(False);
 
   count = get_printqueue(snum,cnum,&queue,&status);
   for (i = 0; i < count; i++) {
-    if ((queue[i].job % 0xFF) == job) break;
+    if ((queue[i].job & 0xFF) == job) break;
   }
   if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
   desc.base = *rdata;
index cadd63e045728766a9630f80583f3204d6be18a2..4616ea14ed0aaede6d25120d7b089ae749d6f8cf 100644 (file)
@@ -2463,7 +2463,7 @@ int reply_printqueue(char *inbuf,char *outbuf)
       {
        put_dos_date2(p,0,queue[i].time);
        CVAL(p,4) = (queue[i].status==LPQ_PRINTING?2:3);
-       SSVAL(p,5,queue[i].job);
+       SSVAL(p,5,printjob_encode(SNUM(cnum), queue[i].job));
        SIVAL(p,7,queue[i].size);
        CVAL(p,11) = 0;
        StrnCpy(p+12,queue[i].user,16);