Line data Source code
1 : /*
2 : * Unix SMB/CIFS implementation.
3 : * RPC Pipe client / server routines
4 : * Copyright (C) Andrew Tridgell 1992-2000,
5 : * Copyright (C) Jean François Micouleau 1998-2000.
6 : * Copyright (C) Gerald Carter 2002-2005.
7 : *
8 : * This program is free software; you can redistribute it and/or modify
9 : * it under the terms of the GNU General Public License as published by
10 : * the Free Software Foundation; either version 3 of the License, or
11 : * (at your option) any later version.
12 : *
13 : * This program is distributed in the hope that it will be useful,
14 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : * GNU General Public License for more details.
17 : *
18 : * You should have received a copy of the GNU General Public License
19 : * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "printing/nt_printing_os2.h"
24 :
25 : /****************************************************************************
26 : ***************************************************************************/
27 :
28 : static char *win_driver;
29 : static char *os2_driver;
30 :
31 0 : static const char *get_win_driver(void)
32 : {
33 0 : if (win_driver == NULL) {
34 0 : return "";
35 : }
36 0 : return win_driver;
37 : }
38 :
39 0 : static const char *get_os2_driver(void)
40 : {
41 0 : if (os2_driver == NULL) {
42 0 : return "";
43 : }
44 0 : return os2_driver;
45 : }
46 :
47 0 : static bool set_driver_mapping(const char *from, const char *to)
48 : {
49 0 : SAFE_FREE(win_driver);
50 0 : SAFE_FREE(os2_driver);
51 :
52 0 : win_driver = SMB_STRDUP(from);
53 0 : os2_driver = SMB_STRDUP(to);
54 :
55 0 : if (win_driver == NULL || os2_driver == NULL) {
56 0 : SAFE_FREE(win_driver);
57 0 : SAFE_FREE(os2_driver);
58 0 : return false;
59 : }
60 0 : return true;
61 : }
62 :
63 : /**
64 : * @internal
65 : *
66 : * @brief Map a Windows driver to a OS/2 driver.
67 : *
68 : * @param[in] mem_ctx The memory context to use.
69 : *
70 : * @param[in,out] pdrivername The drivername of Windows to remap.
71 : *
72 : * @return WERR_OK on success, a corresponding WERROR on failure.
73 : */
74 0 : WERROR spoolss_map_to_os2_driver(TALLOC_CTX *mem_ctx, const char **pdrivername)
75 : {
76 0 : const struct loadparm_substitution *lp_sub =
77 0 : loadparm_s3_global_substitution();
78 0 : const char *mapfile = lp_os2_driver_map(talloc_tos(), lp_sub);
79 0 : char **lines = NULL;
80 : const char *drivername;
81 0 : int numlines = 0;
82 : int i;
83 :
84 0 : if (pdrivername == NULL || *pdrivername == NULL || *pdrivername[0] == '\0') {
85 0 : return WERR_INVALID_PARAMETER;
86 : }
87 :
88 0 : drivername = *pdrivername;
89 :
90 0 : if (mapfile[0] == '\0') {
91 0 : return WERR_FILE_NOT_FOUND;
92 : }
93 :
94 0 : if (strequal(drivername, get_win_driver())) {
95 0 : DEBUG(3,("Mapped Windows driver %s to OS/2 driver %s\n",
96 : drivername, get_os2_driver()));
97 0 : drivername = talloc_strdup(mem_ctx, get_os2_driver());
98 0 : if (drivername == NULL) {
99 0 : return WERR_NOT_ENOUGH_MEMORY;
100 : }
101 0 : *pdrivername = drivername;
102 0 : return WERR_OK;
103 : }
104 :
105 0 : lines = file_lines_load(mapfile, &numlines, 0, NULL);
106 0 : if (numlines == 0 || lines == NULL) {
107 0 : DEBUG(0,("No entries in OS/2 driver map %s\n", mapfile));
108 0 : TALLOC_FREE(lines);
109 0 : return WERR_EMPTY;
110 : }
111 :
112 0 : DEBUG(4,("Scanning OS/2 driver map %s\n",mapfile));
113 :
114 0 : for( i = 0; i < numlines; i++) {
115 0 : char *nt_name = lines[i];
116 0 : char *os2_name = strchr(nt_name, '=');
117 :
118 0 : if (os2_name == NULL) {
119 0 : continue;
120 : }
121 :
122 0 : *os2_name++ = '\0';
123 :
124 0 : while (isspace(*nt_name)) {
125 0 : nt_name++;
126 : }
127 :
128 0 : if (*nt_name == '\0' || strchr("#;", *nt_name)) {
129 0 : continue;
130 : }
131 :
132 : {
133 0 : int l = strlen(nt_name);
134 0 : while (l && isspace(nt_name[l - 1])) {
135 0 : nt_name[l - 1] = 0;
136 0 : l--;
137 : }
138 : }
139 :
140 0 : while (isspace(*os2_name)) {
141 0 : os2_name++;
142 : }
143 :
144 : {
145 0 : int l = strlen(os2_name);
146 0 : while (l && isspace(os2_name[l-1])) {
147 0 : os2_name[l-1] = 0;
148 0 : l--;
149 : }
150 : }
151 :
152 0 : if (strequal(nt_name, drivername)) {
153 0 : DEBUG(3,("Mapped Windows driver %s to OS/2 driver %s\n",drivername,os2_name));
154 0 : set_driver_mapping(drivername, os2_name);
155 0 : drivername = talloc_strdup(mem_ctx, os2_name);
156 0 : TALLOC_FREE(lines);
157 0 : if (drivername == NULL) {
158 0 : return WERR_NOT_ENOUGH_MEMORY;
159 : }
160 0 : *pdrivername = drivername;
161 0 : return WERR_OK;
162 : }
163 : }
164 :
165 0 : TALLOC_FREE(lines);
166 0 : return WERR_OK;
167 : }
|