diff options
author | Jeremy Allison <jra@samba.org> | 2001-03-23 03:12:58 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-03-23 03:12:58 +0000 |
commit | da79b519e0b6b4317d7fb5260d74e0e74a7e0b46 (patch) | |
tree | c4779b9df6d9312ca2ba83ddd1fb4f0c6a8f20fe /source/smbd/lanman.c | |
parent | 29414fe0d6665642d9b5f88a35e712426376c47f (diff) | |
download | samba-da79b519e0b6b4317d7fb5260d74e0e74a7e0b46.tar.gz samba-da79b519e0b6b4317d7fb5260d74e0e74a7e0b46.tar.xz samba-da79b519e0b6b4317d7fb5260d74e0e74a7e0b46.zip |
Two OS/2 printer fixes from Jim McDonough @ IBM.
First one adds a new info level into the lanman printing and an ioctl to the trans2 code.
Andrew - this uses ASCII only. It looks ok to me but please check !
Second one adds a parameter "os2 driver map" that allows OS/2 driver names to be mapped.
Jeremy.
Diffstat (limited to 'source/smbd/lanman.c')
-rw-r--r-- | source/smbd/lanman.c | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/source/smbd/lanman.c b/source/smbd/lanman.c index 45ce286634f..e9df2ed41e5 100644 --- a/source/smbd/lanman.c +++ b/source/smbd/lanman.c @@ -474,7 +474,7 @@ static void fill_printjob_info(connection_struct *conn, int snum, int uLevel, PACKI(desc,"D",queue->size); /* ulSize */ PACKS(desc,"z",queue->file); /* pszComment */ } - if (uLevel == 2 || uLevel == 3) { + if (uLevel == 2 || uLevel == 3 || uLevel == 4) { PACKI(desc,"W",queue->priority); /* uPriority */ PACKS(desc,"z",queue->user); /* pszUserName */ PACKI(desc,"W",n+1); /* uPosition */ @@ -494,6 +494,17 @@ static void fill_printjob_info(connection_struct *conn, int snum, int uLevel, PACKS(desc,"z","NULL"); /* pszDriverName */ PackDriverData(desc); /* pDriverData */ PACKS(desc,"z",""); /* pszPrinterName */ + } else if (uLevel == 4) { /* OS2 */ + PACKS(desc,"z",""); /* pszSpoolFileName */ + PACKS(desc,"z",""); /* pszPortName */ + PACKS(desc,"z",""); /* pszStatus */ + PACKI(desc,"D",0); /* ulPagesSpooled */ + PACKI(desc,"D",0); /* ulPagesSent */ + PACKI(desc,"D",0); /* ulPagesPrinted */ + PACKI(desc,"D",0); /* ulTimePrinted */ + PACKI(desc,"D",0); /* ulExtendJobStatus */ + PACKI(desc,"D",0); /* ulStartPage */ + PACKI(desc,"D",0); /* ulEndPage */ } } } @@ -859,7 +870,8 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn, struct pack_desc desc; print_queue_struct *queue=NULL; print_status_struct status; - + char* tmpdata=NULL; + memset((char *)&status,'\0',sizeof(status)); memset((char *)&desc,'\0',sizeof(desc)); @@ -907,9 +919,19 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn, count = print_queue_status(snum, &queue,&status); } - if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt); - desc.base = *rdata; - desc.buflen = mdrcnt; + if (mdrcnt > 0) { + *rdata = REALLOC(*rdata,mdrcnt); + desc.base = *rdata; + desc.buflen = mdrcnt; + } else { + /* + * Don't return data but need to get correct length + * init_package will return wrong size if buflen=0 + */ + desc.buflen = getlen(desc.format); + desc.base = tmpdata = (char *) malloc (desc.buflen); + } + if (init_package(&desc,1,count)) { desc.subcount = count; fill_printq_info(conn,snum,uLevel,&desc,count,queue,&status); @@ -948,7 +970,8 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn, DEBUG(4,("printqgetinfo: errorcode %d\n",desc.errcode)); if (queue) free(queue); - + if (tmpdata) free (tmpdata); + return(True); } @@ -2000,6 +2023,7 @@ static int check_printjob_info(struct pack_desc* desc, case 1: desc->format = "WB21BB16B10zWWzDDz"; break; case 2: desc->format = "WWzWWDDzz"; break; case 3: desc->format = "WWzWWDDzzzzzzzzzzlz"; break; + case 4: desc->format = "WWzWWDDzzzzzDDDDDDD"; break; default: return False; } if (strcmp(desc->format,id) != 0) return False; @@ -2755,6 +2779,7 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para struct pack_desc desc; print_queue_struct *queue=NULL; print_status_struct status; + char *tmpdata=NULL; uLevel = SVAL(p,2); @@ -2776,9 +2801,19 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para for (i = 0; i < count; i++) { if (queue[i].job == job) break; } - if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt); - desc.base = *rdata; - desc.buflen = mdrcnt; + + if (mdrcnt > 0) { + *rdata = REALLOC(*rdata,mdrcnt); + desc.base = *rdata; + desc.buflen = mdrcnt; + } else { + /* + * Don't return data but need to get correct length + * init_package will return wrong size if buflen=0 + */ + desc.buflen = getlen(desc.format); + desc.base = tmpdata = (char *)malloc ( desc.buflen ); + } if (init_package(&desc,1,0)) { if (i < count) { @@ -2798,6 +2833,7 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para SSVAL(*rparam,4,desc.neededlen); if (queue) free(queue); + if (tmpdata) free(tmpdata); DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode)); return(True); @@ -2932,6 +2968,7 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par int uLevel; struct pack_desc desc; int snum; + char *tmpdata=NULL; memset((char *)&desc,'\0',sizeof(desc)); @@ -2959,9 +2996,18 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par desc.neededlen = 0; } else { - if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt); - desc.base = *rdata; - desc.buflen = mdrcnt; + if (mdrcnt > 0) { + *rdata = REALLOC(*rdata,mdrcnt); + desc.base = *rdata; + desc.buflen = mdrcnt; + } else { + /* + * Don't return data but need to get correct length + * init_package will return wrong size if buflen=0 + */ + desc.buflen = getlen(desc.format); + desc.base = tmpdata = (char *)malloc ( desc.buflen ); + } if (init_package(&desc,1,0)) { fill_printdest_info(conn,snum,uLevel,&desc); } @@ -2975,6 +3021,7 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par SSVAL(*rparam,4,desc.neededlen); DEBUG(4,("WPrintDestGetInfo: errorcode %d\n",desc.errcode)); + if (tmpdata) free (tmpdata); return(True); } |