source: branches/smbpdr-1.0/smb.c

Last change on this file was 772, checked in by Alex Taylor, 12 years ago

Fix to SplPdQuery allowing the required buffer size to be queried.

File size: 30.9 KB
Line 
1#define LINT_ARGS /* argument checking enabled */
2
3#define INCL_DOS
4#define INCL_GPI
5#undef INCL_GPI
6#define INCL_DEV
7#define INCL_DOSMEMMGR /* Include standard OS/2 support */
8#define INCL_DOSMODULEMGR /* For DosLoadModule */
9#define INCL_DOSPROCESS
10#define INCL_GPILCIDS
11#define INCL_WINCOMMON /* Include Window Management support */
12#define INCL_WINDOWMGR
13#define INCL_WINSWITCHLIST
14#define INCL_WINPROGRAMLIST
15#define INCL_WINMENUS
16#define INCL_WINWINDOWMGR
17#define INCL_WINMESSAGEMGR
18#define INCL_WINDIALOGS
19#define INCL_WINSTATICS
20#define INCL_WINLISTBOXES
21#define INCL_WINMENUS
22#define INCL_WINSYS
23#define INCL_WINFRAMEMGR
24#define INCL_INCLWINACCELERATORS
25#define INCL_WINPOINTERS
26#define INCL_WINERRORS
27#define INCL_WINSHELLDATA
28
29#define INCL_WINTYPES
30#define INCL_WINACCELERATORS
31#define INCL_WINBUTTONS
32#define INCL_WINENTRYFIELDS
33#define INCL_WINRECTANGLES
34#define INCL_WINTIMER
35#define INCL_WINSCROLLBARS
36#define INCL_WINHEAP
37#define INCL_SHLERRORS
38#define INCL_WININPUT
39#define INCL_WINHELP
40#define INCL_WINSTDSPIN
41
42#define INCL_SPL
43#define INCL_SPLP
44#define INCL_SPLERRORS
45#define INCL_SHLERRORS
46#define INCL_DOSERRORS
47#define INCL_WINHOOKS
48
49int acrtused=1; /* Define variable to say this is a DLL */
50
51#include <os2.h>
52
53#include <stdlib.h>
54#include <string.h>
55#include <ctype.h>
56#include <stdarg.h>
57#include <stdio.h>
58#include <stdlib.h>
59#include <process.h>
60#include "SMB.h"
61
62#define BIDI_SET_PORTDRV 0x00000019
63#define BIDI_Q_PORTDRV 0x00008019
64
65
66/* Password encryption/decryption routines from ndpsmb.c */
67
68static unsigned char fromhex (char c)
69{
70 if ('0' <= c && c <= '9')
71 {
72 return c - '0';
73 }
74
75 if ('A' <= c && c <= 'F')
76 {
77 return c - 'A' + 0xA;
78 }
79
80 if ('a' <= c && c <= 'f')
81 {
82 return c - 'a' + 0xA;
83 }
84
85 return 0;
86}
87
88static char tohex (unsigned char b)
89{
90 b &= 0xF;
91
92 if (b <= 9)
93 {
94 return b + '0';
95 }
96
97 return 'A' + (b - 0xA);
98}
99
100static void decryptPassword (const char *pszCrypt, char *pszPlain)
101{
102 /* A simple "decryption", character from the hex value. */
103 const char *s = pszCrypt;
104 char *d = pszPlain;
105
106 while (*s)
107 {
108 *d++ = (char)((fromhex (*s++) << 4) + fromhex (*s++));
109 }
110
111 *d++ = 0;
112}
113
114static void encryptPassword (const char *pszPlain, char *pszCrypt)
115{
116 /* A simple "encryption" encode each character as hex value. */
117 const char *s = pszPlain;
118 char *d = pszCrypt;
119
120 while (*s)
121 {
122 *d++ = tohex ((*s) >> 4);
123 *d++ = tohex (*s);
124 s++;
125 }
126
127 *d++ = 0;
128}
129
130//
131// If port driver is not defined in INI file yet
132// assume it exists in the boot drive's \OS2\DLL directory
133//
134
135CHAR szDefaultPortDrvPath[] = { PATH_SMB_PDR };
136
137
138//
139// Below definition of PORTNAMES structure should be defined in
140// common header file pmspl.h.
141//
142
143typedef struct _PORTNAMES
144{
145 PSZ pszPortName; /* -> name of port(ie "LPT1) */
146 PSZ pszPortDesc; /* -> description of port(ie "Parallel Port 1") */
147} PORTNAMES, *PPORTNAMES;
148
149/* Alex Taylor's new version of lprtok() that can handle missing fields */
150char * lprtok (char *string,char *control)
151{
152 char *c;
153 static char *next;
154
155 if ( control == NULL ) return string;
156 if ( string == NULL ) string = next;
157 if ( string == NULL ) return NULL;
158
159 if (( c = strpbrk( string, control )) == NULL ) {
160 next = NULL;
161 }
162 else {
163 next = c+1;
164 *c = '\0';
165 }
166
167 return ( string );
168}
169MRESULT EXPENTRY CommDlg( HWND hDlg, USHORT msg, MPARAM mp1, MPARAM mp2 )
170{
171 PLPRDATA pLprData;
172 ULONG ulTimeOut = 0 ;
173 CHAR szDesc[ STR_LEN_PORTDESC ];
174 CHAR szShareName[ STR_LEN_PORTDESC ];
175 CHAR szTitle[ STR_LEN_TITLE + 1];
176 CHAR szTemp[ STR_LEN_PORTDESC ];
177 CHAR pwBuffer[256];
178 USHORT i;
179 ULONG rc = 0;
180 PUCHAR token;
181
182 switch (msg)
183 {
184 case WM_INITDLG:
185 WinSendDlgItemMsg(hDlg,ID_BINARY,BM_SETCHECK,MPFROM2SHORT(1,0),NULL);
186 pLprData = (PLPRDATA)mp2;
187 WinSetWindowULong (hDlg, QWL_USER, (ULONG)pLprData);
188 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
189 pLprData->pszAppName,
190 KEY_DESCRIPTION,
191 NULL,
192 (PSZ)szDesc,
193 STR_LEN_PORTDESC))
194 {
195 WinSetWindowText (WinWindowFromID (hDlg, (USHORT)IDD_SMB),szDesc);
196 rc = WinLoadString(pLprData->hAB,
197 pLprData->hModule,
198 PDR_ID_PROPERTIES,
199 STR_LEN_PORTDESC, szTemp);
200 if (rc) {
201 strcpy ( szTitle, pLprData->pszPortName );
202 strcat ( szTitle, " - " );
203 strcat ( szTitle, szTemp );
204 WinSetWindowText (hDlg, szTitle);
205 }
206 }
207 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
208 pLprData->pszAppName,
209 KEY_INITIALIZATION,
210 NULL,
211 szTemp,
212 sizeof(szTemp)))
213 {
214 i = 0;
215 token = lprtok(szTemp,"#");
216 while (token != NULL)
217 {
218 switch(i)
219 {
220 case 0:
221 WinSetDlgItemText(hDlg,ID_IP,token);
222 case 1:
223 if (token[ strlen(token) - 1 ] == ';')
224 token[ strlen(token)-1 ] = '\0';
225 WinSetDlgItemText(hDlg,ID_SMBQUEUE,token);
226 break;
227 case 2:
228 if (token[ strlen(token) - 1 ] == ';')
229 token[ strlen(token)-1 ] = '\0';
230 WinSetDlgItemText(hDlg,ID_WORKGROUP,token);
231 break;
232 case 3:
233 if (token[ strlen(token) - 1 ] == ';')
234 token[ strlen(token)-1 ] = '\0';
235 WinSetDlgItemText(hDlg,ID_USER,token);
236 break;
237 case 4:
238 if (token[ strlen(token) - 1 ] == ';')
239 token[ strlen(token)-1 ] = '\0';
240 WinSetDlgItemText(hDlg,ID_COPIES,token);
241 break;
242
243 case 5:
244 if (token[ strlen(token) - 1 ] == ';')
245 token[ strlen(token)-1 ] = '\0';
246 strcpy(pwBuffer,token);
247 decryptPassword(pwBuffer,token);
248 WinSetDlgItemText(hDlg,ID_PASSWORD,token);
249 break;
250 }
251 i++;
252 token = lprtok(NULL,"#");
253 }
254 }
255 break;
256
257 case WM_COMMAND:
258 pLprData = (PLPRDATA)WinQueryWindowULong (hDlg, QWL_USER);
259 switch (SHORT1FROMMP(mp1))
260 {
261 case DID_OK:
262 sprintf(szDesc,"\\");
263 /* Servername | IP */
264 WinQueryDlgItemText (hDlg, ID_IP, sizeof(szTemp), szTemp );
265 sprintf(pLprData->szSaveLprSetting,"%s",szTemp);
266 strncpy(szShareName, szTemp, STR_LEN_PORTDESC - 1);
267 /* Printername | Queue */
268 WinQueryDlgItemText (hDlg, ID_SMBQUEUE, sizeof(szTemp), szTemp );
269 strcat(pLprData->szSaveLprSetting,"#");
270 strcat(pLprData->szSaveLprSetting,szTemp);
271 if (strlen(szTemp) > 0) {
272 strncat(szShareName, "\\", STR_LEN_PORTDESC - 1);
273 strncat(szShareName, szTemp, STR_LEN_PORTDESC - 1);
274 }
275 /* Workgroup */
276 WinQueryDlgItemText (hDlg, ID_WORKGROUP, sizeof(szTemp), szTemp );
277 strcat(pLprData->szSaveLprSetting,"#");
278 strcat(pLprData->szSaveLprSetting,szTemp);
279 if (strlen(szTemp) > 0) {
280 strncat(szDesc, "\\", STR_LEN_PORTDESC - 1);
281 strncat(szDesc, szTemp, STR_LEN_PORTDESC - 1);
282 }
283 strncat(szDesc, "\\", STR_LEN_PORTDESC - 1);
284 strncat(szDesc, szShareName, STR_LEN_PORTDESC - 1);
285 /* Username */
286 WinQueryDlgItemText (hDlg, ID_USER, sizeof(szTemp), szTemp );
287 strcat(pLprData->szSaveLprSetting,"#");
288 strcat(pLprData->szSaveLprSetting,szTemp);
289 /* Number of copies */
290 WinQueryDlgItemText (hDlg, ID_COPIES, sizeof(szTemp), szTemp );
291 strcat(pLprData->szSaveLprSetting,"#");
292 strcat(pLprData->szSaveLprSetting,szTemp);
293 /* Password - must be the last item! */
294 WinQueryDlgItemText (hDlg, ID_PASSWORD, sizeof(szTemp), szTemp );
295 strcat(pLprData->szSaveLprSetting,"#");
296 strcpy(pwBuffer,szTemp);
297 encryptPassword(pwBuffer,szTemp);
298 strcat(pLprData->szSaveLprSetting,szTemp);
299
300 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
301 pLprData->pszAppName,
302 KEY_INITIALIZATION,
303 pLprData->szSaveLprSetting))
304 WinDismissDlg(hDlg, MBID_CANCEL);
305
306 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
307 APPNAME_PM_SPOOLER_PORT,
308 pLprData->pszPortName,
309 pLprData->szSaveLprSetting))
310 WinDismissDlg(hDlg, MBID_CANCEL);
311
312 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
313 pLprData->pszAppName,
314 KEY_DESCRIPTION,
315 szDesc ))
316 WinDismissDlg(hDlg, MBID_CANCEL);
317
318 WinDismissDlg(hDlg, TRUE);
319 break;
320 case DID_CANCEL:
321 WinDismissDlg(hDlg, MBID_CANCEL);
322 break;
323 }
324 break;
325 default:
326 return WinDefDlgProc(hDlg, msg, mp1, mp2) ;
327 break;
328 }
329return FALSE;
330}
331ULONG CalcStructLength ( HAB hab,
332 HMODULE hModule,
333 USHORT usID )
334{
335 ULONG cbRequired;
336 CHAR chString[STR_LEN_PORTDESC];
337
338 cbRequired = 0;
339
340 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, chString);
341 cbRequired += strlen (chString) + 1;
342 WinLoadString(hab, hModule, (USHORT)(usID + 1), STR_LEN_PORTDESC, chString);
343 cbRequired += strlen (chString) + 1;
344 cbRequired += sizeof (PORTNAMES);
345 return(cbRequired);
346}
347
348ULONG CalcBufLength ( HAB hab,
349 HMODULE hModule )
350{
351 ULONG cbRequired;
352 USHORT usID;
353
354 cbRequired = 0;
355
356 /*
357 ** calculate length required to fit all the port info.
358 */
359 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
360 {
361 cbRequired += CalcStructLength (hab, hModule, usID);
362 }
363
364 return(cbRequired);
365}
366
367ULONG NumPortsCanFit ( HAB hab,
368 HMODULE hModule,
369 ULONG cbBuf )
370{
371 ULONG cbRequired;
372 USHORT usID;
373 ULONG ulNumPort;
374
375 cbRequired = 0;
376 ulNumPort = 0;
377
378 /*
379 ** calculate how many ports we can fit in buf.
380 */
381 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
382 {
383 cbRequired += CalcStructLength (hab, hModule, usID);
384 if (cbRequired > cbBuf)
385 {
386 return(ulNumPort);
387 }
388 ulNumPort++;
389 }
390
391 return(ulNumPort);
392}
393VOID CopyStruct ( HAB hab,
394 HMODULE hModule,
395 USHORT usID,
396 PCH pBuf,
397 PULONG pulBeginStruct,
398 PULONG pulBeginText )
399{
400 PPORTNAMES pPortNames;
401
402 pPortNames = (PPORTNAMES)(pBuf + *pulBeginStruct);
403 *pulBeginStruct += sizeof (PORTNAMES);
404
405 /*
406 ** copy port name in the structure
407 */
408 pPortNames->pszPortName = pBuf + *pulBeginText;
409 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, pPortNames->pszPortName);
410 *pulBeginText += strlen (pPortNames->pszPortName) + 1;
411
412 /*
413 ** copy port description to the structure
414 */
415 pPortNames->pszPortDesc = pBuf + *pulBeginText;
416 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, pPortNames->pszPortDesc);
417 *pulBeginText += strlen (pPortNames->pszPortDesc) + 1;
418}
419VOID CopyNPorts ( HAB hab,
420 HMODULE hModule,
421 PCH pBuf,
422 ULONG ulReturned )
423{
424 USHORT usID;
425 ULONG ulBeginText;
426 ULONG ulBeginStruct;
427
428 ulBeginText = ulReturned * sizeof (PORTNAMES);
429 ulBeginStruct = 0;
430
431 for (usID = PORT_ID_FIRST;
432 usID <= PORT_ID_LAST && ulReturned;
433 usID += 2, --ulReturned)
434 {
435 CopyStruct (hab, hModule, usID, pBuf, &ulBeginStruct, &ulBeginText);
436 }
437}
438
439ULONG OpenLprPortDlg ( HAB hab,
440 HMODULE hModule,
441 PSZ pszPortName,
442 PSZ pszAppName )
443{
444 LPRDATA LprData;
445
446 memset (&LprData, 0, sizeof (LPRDATA));
447 LprData.hAB = hab;
448 LprData.hModule = hModule;
449 LprData.pszPortName = pszPortName;
450 LprData.pszAppName = pszAppName;
451
452 WinDlgBox (HWND_DESKTOP,
453 HWND_DESKTOP,
454 (PFNWP)CommDlg,
455 (HMODULE)hModule,
456 IDD_SMB,
457 &LprData);
458
459 return LprData.lfModified;
460}
461BOOL GetPortDescription ( HAB hab,
462 HMODULE hModule,
463 PSZ pszPortName,
464 PSZ pszPortDesc )
465{
466 USHORT usID;
467 CHAR chBuf[STR_LEN_PORTDESC] = {0};
468
469 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
470 {
471 WinLoadString(hab, hModule, usID, STR_LEN_PORTNAME, chBuf);
472 if (!strcmp (pszPortName, chBuf))
473 {
474 if ( WinLoadString(hab, hModule, usID+1, STR_LEN_PORTDESC, chBuf) ) {
475 strcpy (pszPortDesc, chBuf);
476 return(TRUE);
477 }
478 break;
479 }
480 }
481 return(FALSE);
482}
483BOOL GenerateUniquePortName( PSZ pszPortName )
484{
485 BOOL fPortExists;
486 PSZ pszEndPortName;
487 USHORT i;
488 CHAR chPortData[STR_LEN_PORTNAME];
489
490 /*
491 ** Generate a unique port name by adding numbers to the
492 ** end of pszPortName
493 */
494 pszEndPortName = pszPortName + strlen( pszPortName );
495 i = 1;
496 fPortExists = TRUE;
497 while ( (i < MAX_PORTS) && fPortExists )
498 {
499 _itoa( i, pszEndPortName, 10);
500 fPortExists = PrfQueryProfileString (HINI_SYSTEMPROFILE,
501 APPNAME_PM_SPOOLER_PORT,
502 pszPortName,
503 NULL,
504 chPortData,
505 sizeof(chPortData) - 1);
506 i++;
507 }
508 return(!fPortExists);
509}
510APIRET APIENTRY SplPdEnumPort ( HAB hab,
511 PVOID pBuf,
512 ULONG cbBuf,
513 PULONG pulReturned,
514 PULONG pulTotal,
515 PULONG pcbRequired )
516
517{
518 HMODULE hModule;
519 ULONG ulBootDrive;
520 ULONG rcLoadMod;
521 CHAR szPathName[260];
522
523 if (!pulReturned ||
524 !pulTotal ||
525 !pcbRequired)
526 {
527 return(ERROR_INVALID_PARAMETER);
528 }
529
530 if (!pBuf && cbBuf)
531 {
532 return(ERROR_INVALID_PARAMETER);
533 }
534
535 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
536 sizeof (ULONG));
537 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
538
539 PrfQueryProfileString (HINI_SYSTEMPROFILE,
540 "PM_PORT_DRIVER",
541 "SMB",
542 szDefaultPortDrvPath,
543 szPathName,
544 256 );
545
546 rcLoadMod = DosLoadModule (NULL, 0, szPathName, &hModule);
547
548 if (cbBuf == 0L)
549 {
550 *pulReturned = 0;
551 *pcbRequired = CalcBufLength (hab, hModule);
552 *pulTotal = MAX_PORTS;
553 if (!rcLoadMod)
554 DosFreeModule (hModule);
555 return(ERROR_MORE_DATA);
556 }
557
558 /*
559 ** check number of ports info we can fit in supplied buffer
560 */
561 *pulTotal = MAX_PORTS;
562 *pcbRequired = CalcBufLength (hab, hModule);
563 *pulReturned = NumPortsCanFit (hab, hModule, cbBuf);
564
565 /*
566 ** return error if we can not fit one port.
567 */
568 if (!(*pulReturned))
569 {
570 if (!rcLoadMod)
571 DosFreeModule (hModule);
572 return(ERROR_INSUFFICIENT_BUFFER);
573 }
574
575 /*
576 ** copy all the ports which we can store in the pBuf
577 */
578 CopyNPorts (hab, hModule, (PCH)pBuf, *pulReturned);
579
580 /*
581 ** Free the module - we do not need it any more.
582 */
583 if (!rcLoadMod)
584 DosFreeModule (hModule);
585
586 /*
587 ** copy all the ports which we can store in the pBuf
588 */
589 if (*pulReturned < *pulTotal)
590 {
591 return(ERROR_MORE_DATA);
592 }
593
594 return(NO_ERROR);
595}
596APIRET APIENTRY SplPdInstallPort ( HAB hab,
597 PSZ pszPortName )
598{
599 CHAR chBuf[STR_LEN_PORTNAME];
600 CHAR chPortDesc[STR_LEN_PORTDESC];
601 ULONG ulBootDrive;
602 HMODULE hModule;
603 CHAR szPathName[260]; /* will contain full path to this port driver */
604
605 if (!pszPortName)
606 {
607 return(ERROR_INVALID_PARAMETER);
608 }
609 strcpy(szDefaultPortDrvPath,PATH_SMB_PDR);
610 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
611 sizeof (ULONG));
612 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
613 strcpy( szPathName, szDefaultPortDrvPath );
614
615 /* Make sure the port driver itself is installed */
616 PrfWriteProfileString (HINI_SYSTEMPROFILE,
617 "PM_PORT_DRIVER",
618 "SMB",
619 szDefaultPortDrvPath);
620
621 /* Generate appname for "PM_SMBx" */
622 strcpy (chBuf, APPNAME_LEAD_STR);
623 strcat (chBuf, pszPortName);
624
625 /*
626 ** Check for this being our default Port Name to install.
627 ** If so (pszPortName == "SMB") then generate a unique
628 ** port name so that we can install multiple SMB printers.
629 */
630 if (!strcmp(pszPortName, DEF_PORTNAME))
631 {
632 /*
633 ** Use chBuf to store the new portname to install
634 ** Must first increment past "PM_" in chBuf
635 */
636 pszPortName = chBuf + 3;
637 GenerateUniquePortName( pszPortName );
638 }
639
640 /* Get initial port description (fall back to portname if unavailable) */
641 hModule = 0L ; /* Init module handle to null */
642 DosLoadModule (NULL, 0, szPathName, &hModule);
643 if (!GetPortDescription (hab, hModule, pszPortName, chPortDesc))
644 {
645 strcpy( chPortDesc, pszPortName );
646 }
647 DosFreeModule (hModule);
648
649 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
650 chBuf,
651 KEY_DESCRIPTION,
652 chPortDesc))
653 {
654 return (WinGetLastError (hab));
655 }
656
657 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
658 chBuf,
659 KEY_INITIALIZATION,
660 DEF_INITIALIZATION))
661 {
662 return (WinGetLastError (hab));
663 }
664
665 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
666 chBuf,
667 KEY_TERMINATION,
668 DEF_TERMINATION))
669 {
670 return (WinGetLastError (hab));
671 }
672
673 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
674 chBuf,
675 KEY_PORTDRIVER,
676 DEF_PORTDRIVER))
677 {
678 return (WinGetLastError (hab));
679 }
680
681 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
682 chBuf,
683 KEY_TIMEOUT,
684 DEF_TIMEOUT))
685 {
686 return (WinGetLastError (hab));
687 }
688 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
689 APPNAME_PM_SPOOLER_PORT,
690 pszPortName,
691 DEF_INITIALIZATION))
692 {
693 return (WinGetLastError (hab));
694 }
695 return(NO_ERROR);
696}
697BOOL APIENTRY SplPdGetPortIcon ( HAB hab,
698 PULONG idIcon )
699{
700 if (idIcon)
701 {
702 *idIcon = SMB_ICON;
703 }
704 return(TRUE);
705}
706APIRET APIENTRY SplPdQueryPort ( HAB hab,
707 PSZ pszPortName,
708 PVOID pBufIn,
709 ULONG cbBuf,
710 PULONG cItems )
711{
712 HMODULE hModule;
713 CHAR chString[STR_LEN_DESC];
714 USHORT usNumLines;
715 USHORT usLineID;
716 USHORT usStrLength;
717 ULONG ulBootDrive;
718 PCH pBuf = pBufIn;
719 CHAR szPathName[260]; /* will contain full path to this port driver */
720
721 if (!cItems)
722 {
723 return(ERROR_INVALID_PARAMETER);
724 }
725
726 if (!pBuf || !cbBuf)
727 {
728 return(ERROR_INVALID_PARAMETER);
729 }
730
731
732 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
733 sizeof (ULONG));
734 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
735
736 PrfQueryProfileString (HINI_SYSTEMPROFILE,
737 "PM_PORT_DRIVER",
738 "SMB",
739 szDefaultPortDrvPath,
740 szPathName,
741 256 );
742
743 hModule = 0L ;
744
745 DosLoadModule (NULL, 0, szPathName, &hModule);
746
747 chString[0] = '\0' ;
748
749 WinLoadString(hab, hModule, (USHORT)ID_NUMBER_OF_DESC_LINES, STR_LEN_DESC,
750 chString);
751 usNumLines = (USHORT)atoi (chString);
752 usLineID = ID_FIRST_DESC_LINES;
753 for (*cItems = 0; *cItems < usNumLines; *cItems++)
754 {
755 WinLoadString(hab, hModule, usLineID, STR_LEN_DESC, chString);
756 if (cbBuf >= (usStrLength = (USHORT)(strlen (chString) + 1)))
757 {
758 strcpy (pBuf, chString);
759 pBuf += usStrLength;
760 cbBuf -= usStrLength;
761 }
762 else
763 {
764 DosFreeModule (hModule);
765 return(ERROR_INSUFFICIENT_BUFFER);
766 }
767 }
768 DosFreeModule (hModule);
769 return(NO_ERROR);
770}
771APIRET APIENTRY SplPdSetPort ( HAB hab,
772 PSZ pszPortName,
773 PULONG flModified )
774{
775 CHAR chBuf[STR_LEN_PORTNAME];
776 CHAR chPortDriver[STR_LEN_PORTNAME];
777 ULONG ulBootDrive;
778 HMODULE hModule;
779 CHAR szPathName[260]; /* will contain full path to this port driver */
780
781 if (!pszPortName || !flModified)
782 {
783 return(ERROR_INVALID_PARAMETER);
784 }
785
786 strcpy (chBuf, APPNAME_LEAD_STR);
787 strcat (chBuf, pszPortName);
788
789 if (!(PrfQueryProfileString (HINI_SYSTEMPROFILE, chBuf,
790 KEY_PORTDRIVER, NULL, chPortDriver,
791 STR_LEN_PORTNAME)))
792 {
793 return(ERROR_INVALID_PARAMETER);
794 }
795
796 if (strcmp (chPortDriver, DEF_PORTDRIVER))
797 {
798 return(ERROR_INVALID_PARAMETER);
799 }
800
801 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
802 sizeof (ULONG));
803 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
804
805 PrfQueryProfileString (HINI_SYSTEMPROFILE,
806 "PM_PORT_DRIVER",
807 "SMB",
808 szDefaultPortDrvPath,
809 szPathName,
810 256 );
811
812 hModule = 0L ; /* Init module handle to null */
813
814 DosLoadModule (NULL, 0, szPathName, &hModule);
815
816 *flModified = OpenLprPortDlg (hab, hModule, pszPortName, chBuf);
817
818 DosFreeModule (hModule);
819 return(NO_ERROR);
820}
821
822
823APIRET APIENTRY SplPdRemovePort ( HAB hab,
824 PSZ pszPortName )
825{
826 CHAR chBuf[STR_LEN_PORTNAME];
827 CHAR chPortDriver[STR_LEN_PORTNAME];
828
829 if (!pszPortName)
830 {
831 return(ERROR_INVALID_PARAMETER);
832 }
833
834 strcpy (chBuf, APPNAME_LEAD_STR);
835 strcat (chBuf, pszPortName);
836
837 if (!(PrfQueryProfileString (HINI_SYSTEMPROFILE, chBuf,
838 KEY_PORTDRIVER, NULL, chPortDriver,
839 STR_LEN_PORTNAME)))
840 {
841 return(ERROR_INVALID_PARAMETER);
842 }
843
844 if (strcmp (chPortDriver, DEF_PORTDRIVER))
845 {
846 return(ERROR_INVALID_PARAMETER);
847 }
848
849 PrfWriteProfileString (HINI_SYSTEMPROFILE, chBuf, NULL, NULL);
850
851 PrfWriteProfileString (HINI_SYSTEMPROFILE,
852 APPNAME_PM_SPOOLER_PORT,
853 pszPortName,
854 NULL);
855 return(NO_ERROR);
856
857}
858ULONG APIENTRY SplPdOpen( PSZ pszPortName,
859 PHFILE phFile,
860 PULONG pDeviceFlags,
861 PVOID pPrtOpenStruct)
862{
863 APIRET rc;
864 ULONG ulAction = 0; /* Action taken by DosOpen */
865 ULONG ulBytesRead = 0; /* Number of bytes read by DosRead */
866 ULONG ulWrote = 0; /* Number of bytes written by DosWrite */
867 ULONG ulLocal = 0; /* File pointer position after DosSetFilePtr */
868 CHAR szTemp[ 256];
869 UCHAR tmp[256];
870 ULONG pcbWritten ;
871 USHORT i;
872 HFILE control;
873 UCHAR filename[256];
874 DATETIME dt;
875 UCHAR spool_dir[256];
876 PEAOP2 pEABuf = NULL;
877/* UCHAR pszPSHeader[] = "%!PS-Adobe-3.0\n";
878 ULONG cbHeader; */
879
880
881 if (!phFile || !pDeviceFlags )
882 {
883 return(ERROR_INVALID_PARAMETER);
884 }
885 DosGetDateTime(&dt);
886 rc = PrfQueryProfileString (HINI_SYSTEMPROFILE,
887 "PM_SPOOLER",
888 "DIR",
889 NULL,
890 (PSZ)spool_dir,
891 sizeof(spool_dir));
892 spool_dir[ strlen(spool_dir) - 1] = '\0';
893 sprintf(tmp,"%s\\SMB",spool_dir);
894 DosCreateDir( tmp,pEABuf );
895 sprintf(filename,"%s\\SMB\\%02d_%02d_%02d_%02d_%s",spool_dir,dt.hours,dt.minutes,dt.seconds,dt.hundredths,pszPortName);
896 rc = DosOpen(filename,
897 phFile, /* File handle */
898 &ulAction, /* Action taken */
899 100L, /* File primary allocation */
900 FILE_ARCHIVED | FILE_NORMAL, /* File attribute */
901 OPEN_ACTION_CREATE_IF_NEW |
902 OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
903 OPEN_FLAGS_NOINHERIT |
904 OPEN_SHARE_DENYNONE |
905 OPEN_ACCESS_READWRITE, /* Open mode of the file */
906 0L); /* No extended attribute */
907/* DosWrite(*phFile,pszPSHeader,strlen(pszPSHeader),&cbHeader); */
908 sprintf(szTemp,"PM_%s",pszPortName);
909 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
910 szTemp,
911 KEY_INITIALIZATION,
912 NULL,
913 szTemp,
914 sizeof(szTemp)))
915 {
916 sprintf(tmp ,"%s\\SMB\\%d.control",spool_dir,*phFile);
917 rc = DosOpen( tmp ,
918 &control, /* File handle */
919 &ulAction, /* Action taken */
920 strlen(szTemp), /* File primary allocation */
921 FILE_ARCHIVED | FILE_NORMAL, /* File attribute */
922 OPEN_ACTION_CREATE_IF_NEW |
923 OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
924 OPEN_FLAGS_NOINHERIT |
925 OPEN_SHARE_DENYNONE |
926 OPEN_ACCESS_READWRITE, /* Open mode of the file */
927 0L); /* No extended attribute */
928 rc = DosWrite( control,szTemp,strlen(szTemp),&pcbWritten);
929 rc = DosWrite( control,"#",1,&pcbWritten);
930 rc = DosWrite( control,filename,strlen(filename),&pcbWritten);
931 rc = DosWrite( control,"@",1,&pcbWritten);
932 rc = DosClose(control);
933 }
934return rc;
935
936}
937#if 1
938ULONG APIENTRY SplPdQuery ( PSZ pszPortName,
939 ULONG ulFlags,
940 ULONG ulCommand,
941 PVOID pInData,
942 ULONG cbInData,
943 PVOID pOutData,
944 PULONG pcbOutData )
945{
946 PPORTSETTINGS pSettings;
947 CHAR szAppName[ STR_LEN_PORTNAME ];
948 ULONG rc;
949
950 // Generate appname for "PM_SMBx"
951 strcpy( szAppName, APPNAME_LEAD_STR);
952 strncat( szAppName, pszPortName, STR_LEN_PORTNAME-1 );
953
954 switch ( ulCommand ) {
955
956 case BIDI_Q_PORTDRV:
957 // If no buffer was provided, just return the required size
958 if ( !pOutData && pcbOutData ) {
959 *pcbOutData = sizeof( PORTSETTINGS );
960 return ERROR_MORE_DATA;
961 }
962 // Make sure the data is valid
963 if ( !pOutData || !pcbOutData || ( *pcbOutData < sizeof( PORTSETTINGS )))
964 return( ERROR_INVALID_PARAMETER );
965 pSettings = (PPORTSETTINGS) pOutData;
966
967 PrfQueryProfileString( HINI_SYSTEMPROFILE, szAppName,
968 KEY_INITIALIZATION, NULL,
969 pSettings->szPortData, STR_LEN_PORTDESC );
970 *pcbOutData = sizeof( PORTSETTINGS );
971 rc = NO_ERROR;
972 break;
973
974 default:
975 rc = ERROR_NOT_SUPPORTED;
976 //rc = NO_ERROR;
977 break;
978 }
979
980 return ( rc );
981}
982ULONG APIENTRY SplPdSet ( PSZ pszPortName,
983 ULONG ulFlags,
984 ULONG ulCommand,
985 PVOID pInData,
986 ULONG cbInData )
987{
988 PPORTSETTINGS pSettings;
989 CHAR szIniStr[ STR_LEN_PORTDESC ] = {0};
990 CHAR szAppName[ STR_LEN_PORTNAME ];
991 PSZ token;
992 ULONG rc;
993
994 // Generate appname for "PM_CUPSx"
995 strcpy( szAppName, APPNAME_LEAD_STR);
996 strncat( szAppName, pszPortName, STR_LEN_PORTNAME-1 );
997
998 switch ( ulCommand ) {
999
1000 case BIDI_SET_PORTDRV:
1001 // Validate the data
1002 if ( !pInData || cbInData < sizeof( PORTSETTINGS ))
1003 return( ERROR_INVALID_PARAMETER );
1004 pSettings = (PPORTSETTINGS) pInData;
1005 // Update the INITIALIZATION string
1006 PrfWriteProfileString( HINI_SYSTEMPROFILE, szAppName,
1007 KEY_INITIALIZATION, pSettings->szPortData );
1008 PrfWriteProfileString( HINI_SYSTEMPROFILE, APPNAME_PM_SPOOLER_PORT,
1009 pszPortName, pSettings->szPortData );
1010 // Update the DESCRIPTION string
1011 if (( token = lprtok( pSettings->szPortData, "#")) != NULL ) {
1012 strncpy( szIniStr, token, STR_LEN_PORTDESC-1 );
1013 if (( token = lprtok( NULL, "#")) != NULL ) {
1014 if ( token[ strlen(token) - 1 ] == ';')
1015 token[ strlen(token) - 1 ] = '\0';
1016 strncat( szIniStr, ":", STR_LEN_PORTDESC-1 );
1017 strncat( szIniStr, token, STR_LEN_PORTDESC-1 );
1018 }
1019 }
1020 PrfWriteProfileString( HINI_SYSTEMPROFILE,
1021 szAppName, KEY_DESCRIPTION, szIniStr );
1022 rc = NO_ERROR;
1023 break;
1024
1025 default:
1026 //rc = ERROR_NOT_SUPPORTED;
1027 rc = NO_ERROR;
1028 break;
1029 }
1030 return ( rc );
1031
1032}
1033#else
1034ULONG APIENTRY SplPdQuery ( PSZ pszDeviceName,
1035 ULONG ulFlags,
1036 ULONG ulCommand,
1037 PVOID pInData,
1038 ULONG cbInData,
1039 PVOID pOutData,
1040 PULONG pcbOutData )
1041{
1042/* return ERROR_NOT_SUPPORTED; */
1043 return NO_ERROR;
1044}
1045ULONG APIENTRY SplPdSet ( PSZ pszDeviceName,
1046 ULONG ulFlags,
1047 ULONG ulCommand,
1048 PVOID pInData,
1049 ULONG cbInData )
1050{
1051/* return ERROR_NOT_SUPPORTED; */
1052 return NO_ERROR;
1053}
1054#endif
1055ULONG APIENTRY SplPdNewPage ( HFILE hFile, ULONG ulPageNumber )
1056{
1057 return NO_ERROR;
1058}
1059ULONG APIENTRY SplPdAbortDoc( HFILE hFile,
1060 PVOID pchData,
1061 ULONG cbData,
1062 ULONG ulFlags )
1063{
1064 return NO_ERROR;
1065}
1066ULONG APIENTRY SplPdClose( HFILE hFile )
1067{
1068 APIRET rc;
1069 APIRET resp;
1070 USHORT i;
1071 USHORT j;
1072 RESULTCODES rc_child;
1073 ULONG nbr_lu;
1074 ULONG ulAction;
1075 UCHAR szTemp[256];
1076 HFILE control;
1077 UCHAR binfile[256];
1078 UCHAR arg[256];
1079 UCHAR j_url[256] ;
1080 UCHAR j_id[3];
1081 UCHAR j_user[256];
1082 UCHAR j_title[256];
1083 UCHAR j_copies[3];
1084 UCHAR j_options[8];
1085 UCHAR filename[256];
1086 UCHAR ip_add[256];
1087 UCHAR queue_name[256];
1088 UCHAR workgroup[256];
1089 UCHAR username[256];
1090 UCHAR password_enc[256];
1091 UCHAR password_dec[256];
1092 UCHAR errorstr[256];
1093 USHORT pos;
1094 UCHAR spool_dir[256];
1095 ULONG ulBootDrive;
1096
1097 rc = PrfQueryProfileString (HINI_SYSTEMPROFILE,
1098 "PM_SPOOLER",
1099 "DIR",
1100 NULL,
1101 (PSZ)spool_dir,
1102 sizeof(spool_dir));
1103 spool_dir[ strlen(spool_dir) - 1] = '\0';
1104 sprintf(szTemp,"%s\\SMB\\%d.control",spool_dir,hFile);
1105 rc = DosOpen(szTemp,
1106 &control,
1107 &ulAction,
1108 0L,
1109 FILE_ARCHIVED | FILE_NORMAL,
1110 OPEN_ACTION_CREATE_IF_NEW |
1111 OPEN_ACTION_OPEN_IF_EXISTS,
1112 OPEN_FLAGS_NOINHERIT |
1113 OPEN_SHARE_DENYNONE |
1114 OPEN_ACCESS_READWRITE,
1115 0L);
1116 rc = DosRead( control,szTemp,sizeof(szTemp),&nbr_lu);
1117 rc = DosClose( control );
1118 sprintf(filename,"%s\\SMB\\%d.control",spool_dir,hFile);
1119 DosDelete(filename);
1120
1121 i = 0;
1122 j = 0;
1123 pos = 0;
1124 while (szTemp[i] != '@')
1125 {
1126 if (szTemp[i] == '#')
1127 {
1128 szTemp[i] = '\0';
1129 switch(j)
1130 {
1131 case 0:strcpy(ip_add,&szTemp[pos]);
1132 break;
1133 case 1:strcpy(queue_name,&szTemp[pos]);
1134 break;
1135 case 2:strcpy(workgroup,&szTemp[pos]);
1136 break;
1137 case 3:strcpy(username,&szTemp[pos]);
1138 break;
1139 case 4:strcpy(j_copies,&szTemp[pos]);
1140 break;
1141 case 5:strcpy(password_enc,&szTemp[pos]);
1142 break;
1143 }
1144 pos = i+1;
1145 j++;
1146 }
1147 i++;
1148 }
1149 szTemp[i] = '\0';
1150 strcpy(filename,&szTemp[pos]);
1151
1152 rc = DosClose( hFile );
1153 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
1154 sizeof (ULONG));
1155
1156 decryptPassword(password_enc,password_dec);
1157
1158// Usage: smbspool [DEVICE_URI] job-id user title copies options [file]
1159
1160 sprintf(binfile, "smbspool.exe\0");
1161 sprintf(j_url,"smb://%s:%s@%s/%s/%s",username,password_dec,workgroup,ip_add,queue_name);
1162 sprintf(j_id,"999");
1163 sprintf(j_user,username);
1164 sprintf(j_title,"from %s",getenv("HOSTNAME"));
1165 sprintf(j_options,"opt");
1166 rc = spawnlp(P_WAIT,binfile,binfile,j_url,j_id,j_user,j_title,j_copies,j_options,filename,NULL);
1167
1168 while (rc != 0)
1169 {
1170 sprintf(errorstr,"Error %d during spooling to smb://%s:****@%s/%s/%s",rc,username,workgroup,ip_add,queue_name);
1171 resp = WinMessageBox (HWND_DESKTOP,
1172 HWND_DESKTOP,
1173 errorstr,
1174 "CIFS/SMB Port driver error",
1175 0L, MB_RETRYCANCEL | MB_WARNING | MB_MOVEABLE);
1176 if (resp != MBID_CANCEL )
1177 {
1178 rc = spawnlp(P_WAIT,binfile,binfile,j_url,j_id,j_user,j_title,j_copies,j_options,filename,NULL);
1179 }
1180 else rc = 0;
1181 };
1182
1183 strcpy(filename,&szTemp[pos]);
1184 DosDelete(filename);
1185
1186 /* We always have to return success to the spooler subsystem */
1187 rc = NO_ERROR;
1188 return rc;
1189}
1190ULONG APIENTRY SplPdWrite( HFILE hFile,
1191 PVOID pchData,
1192 ULONG cbData,
1193 PULONG pcbWritten )
1194{ APIRET rc;
1195
1196 rc = DosWrite( hFile,pchData,cbData,pcbWritten);
1197 rc = DosSleep(0);
1198 return rc;
1199}
1200
Note: See TracBrowser for help on using the repository browser.