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 0 : const char *drivername; 81 0 : int numlines = 0; 82 0 : 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 : }