[PATCH 2/6] winspool: Remove support for parsing /etc/printcap.

Huw Davies huw at codeweavers.com
Tue Oct 26 05:18:08 CDT 2021


This is extremely obsolete and doesn't provide the location
of the ppd file anyway.

Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/winspool.drv/info.c | 310 ++-------------------------------------
 1 file changed, 11 insertions(+), 299 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index fd02d2b2b3e..badde6ea5ae 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -750,20 +750,6 @@ static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
     return open_printer_reg_key( name, phkey );
 }
 
-static void set_default_printer(const char *devname, const char *name)
-{
-    char *buf = HeapAlloc(GetProcessHeap(), 0, strlen(name)+strlen(devname)+strlen(",WINEPS.DRV,LPR:")+1);
-    HKEY hkey;
-
-    sprintf(buf, "%s,WINEPS.DRV,LPR:%s", devname, name);
-    if (!RegCreateKeyW(HKEY_CURRENT_USER, user_default_reg_key, &hkey))
-    {
-        RegSetValueExA(hkey, "Device", 0, REG_SZ, (BYTE *)buf, strlen(buf) + 1);
-        RegCloseKey(hkey);
-    }
-    HeapFree(GetProcessHeap(), 0, buf);
-}
-
 static BOOL add_printer_driver(const WCHAR *name, WCHAR *ppd)
 {
     DRIVER_INFO_3W di3;
@@ -801,52 +787,6 @@ static BOOL add_printer_driver(const WCHAR *name, WCHAR *ppd)
     return TRUE;
 }
 
-static inline char *expand_env_string( char *str, DWORD type )
-{
-    if (type == REG_EXPAND_SZ)
-    {
-        char *tmp;
-        DWORD needed = ExpandEnvironmentStringsA( str, NULL, 0 );
-        tmp = HeapAlloc( GetProcessHeap(), 0, needed );
-        if (tmp)
-        {
-            ExpandEnvironmentStringsA( str, tmp, needed );
-            HeapFree( GetProcessHeap(), 0, str );
-            return tmp;
-        }
-    }
-    return str;
-}
-
-static char *get_fallback_ppd_name( const char *printer_name )
-{
-    static const WCHAR ppds_key[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
-                                     'P','r','i','n','t','i','n','g','\\','P','P','D',' ','F','i','l','e','s',0};
-    HKEY hkey;
-    DWORD needed, type;
-    char *ret = NULL;
-
-    if (RegOpenKeyW( HKEY_CURRENT_USER, ppds_key, &hkey ) == ERROR_SUCCESS )
-    {
-        const char *value_name = NULL;
-
-        if (RegQueryValueExA( hkey, printer_name, 0, NULL, NULL, &needed ) == ERROR_SUCCESS)
-            value_name = printer_name;
-        else if (RegQueryValueExA( hkey, "generic", 0, NULL, NULL, &needed ) == ERROR_SUCCESS)
-            value_name = "generic";
-
-        if (value_name)
-        {
-            ret = HeapAlloc( GetProcessHeap(), 0, needed );
-            if (!ret) return NULL;
-            RegQueryValueExA( hkey, value_name, 0, &type, (BYTE *)ret, &needed );
-        }
-        RegCloseKey( hkey );
-        if (ret) return expand_env_string( ret, type );
-    }
-    return NULL;
-}
-
 static BOOL copy_file( const char *src, const char *dst )
 {
     int fds[2] = {-1, -1}, num;
@@ -893,28 +833,6 @@ static BOOL get_internal_fallback_ppd( const WCHAR *ppd )
     return ret;
 }
 
-static BOOL get_fallback_ppd( const char *printer_name, const WCHAR *ppd )
-{
-    char *dst, *src = get_fallback_ppd_name( printer_name );
-    BOOL ret = FALSE;
-
-    if (!src) return get_internal_fallback_ppd( ppd );
-
-    TRACE( "(%s %s) found %s\n", debugstr_a(printer_name), debugstr_w(ppd), debugstr_a(src) );
-
-    if (!(dst = wine_get_unix_file_name( ppd ))) goto fail;
-
-    if (symlink( src, dst ) == -1)
-        if (errno != ENOSYS || !copy_file( src, dst ))
-            goto fail;
-
-    ret = TRUE;
-fail:
-    HeapFree( GetProcessHeap(), 0, dst );
-    HeapFree( GetProcessHeap(), 0, src );
-    return ret;
-}
-
 static WCHAR *get_ppd_filename( const WCHAR *dir, const WCHAR *file_name )
 {
     static const WCHAR dot_ppd[] = {'.','p','p','d',0};
@@ -1039,7 +957,7 @@ static BOOL get_cups_ppd( const char *printer_name, const WCHAR *ppd )
 
     TRACE( "failed to get ppd for printer %s from cups (status %d), calling fallback\n",
            debugstr_a(printer_name), http_status );
-    return get_fallback_ppd( printer_name, ppd );
+    return get_internal_fallback_ppd( ppd );
 }
 
 static WCHAR *get_cups_option( const char *name, int num_options, cups_option_t *options )
@@ -1106,17 +1024,11 @@ static BOOL CUPS_LoadPrinters(void)
             continue;
         }
 
-        port = HeapAlloc(GetProcessHeap(), 0, sizeof(CUPS_Port) + lstrlenW(nameW) * sizeof(WCHAR));
-        lstrcpyW(port, CUPS_Port);
-        lstrcatW(port, nameW);
-
         if(RegOpenKeyW(hkeyPrinters, nameW, &hkeyPrinter) == ERROR_SUCCESS) {
             DWORD status = get_dword_from_reg( hkeyPrinter, StatusW );
             /* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
                and continue */
             TRACE("Printer already exists\n");
-            /* overwrite old LPR:* port */
-            RegSetValueExW(hkeyPrinter, PortW, 0, REG_SZ, (LPBYTE)port, (lstrlenW(port) + 1) * sizeof(WCHAR));
             RegDeleteValueW(hkeyPrinter, May_Delete_Value);
             /* flag that the PPD file should be checked for an update */
             set_reg_DWORD( hkeyPrinter, StatusW, status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
@@ -1124,11 +1036,8 @@ static BOOL CUPS_LoadPrinters(void)
         } else {
             BOOL added_driver = FALSE;
 
-            if (!ppd_dir && !(ppd_dir = get_ppd_dir()))
-            {
-                HeapFree( GetProcessHeap(), 0, port );
-                break;
-            }
+            if (!ppd_dir && !(ppd_dir = get_ppd_dir())) break;
+
             ppd = get_ppd_filename( ppd_dir, nameW );
             if (get_cups_ppd( dests[i].name, ppd ))
             {
@@ -1136,11 +1045,11 @@ static BOOL CUPS_LoadPrinters(void)
                 unlink_ppd( ppd );
             }
             HeapFree( GetProcessHeap(), 0, ppd );
-            if (!added_driver)
-            {
-                HeapFree( GetProcessHeap(), 0, port );
-                continue;
-            }
+            if (!added_driver) continue;
+
+            port = heap_alloc( sizeof(CUPS_Port) + lstrlenW( nameW ) * sizeof(WCHAR) );
+            lstrcpyW( port, CUPS_Port );
+            lstrcatW( port, nameW );
 
             memset(&pi2, 0, sizeof(PRINTER_INFO_2W));
             pi2.pPrinterName    = nameW;
@@ -1159,10 +1068,10 @@ static BOOL CUPS_LoadPrinters(void)
             else if (GetLastError() != ERROR_PRINTER_ALREADY_EXISTS)
                 ERR( "printer '%s' not added by AddPrinter (error %d)\n", debugstr_w(nameW), GetLastError() );
 
+            heap_free( port );
             HeapFree( GetProcessHeap(), 0, pi2.pComment );
             HeapFree( GetProcessHeap(), 0, pi2.pLocation );
         }
-        HeapFree( GetProcessHeap(), 0, port );
 
         hadprinter = TRUE;
         if (dests[i].is_default) {
@@ -1292,7 +1201,7 @@ static BOOL update_driver( HANDLE printer )
         ret = get_cups_ppd( queue_name, ppd );
     else
 #endif
-        ret = get_fallback_ppd( queue_name, ppd );
+        ret = get_internal_fallback_ppd( ppd );
 
     if (ret)
     {
@@ -1312,199 +1221,6 @@ static BOOL update_driver( HANDLE printer )
     return ret;
 }
 
-static BOOL PRINTCAP_ParseEntry( const char *pent, BOOL isfirst )
-{
-    PRINTER_INFO_2A	pinfo2a;
-    const char	*r;
-    size_t		name_len;
-    char		*e,*s,*name,*prettyname,*devname;
-    BOOL		ret = FALSE, set_default = FALSE;
-    char *port = NULL, *env_default;
-    HKEY hkeyPrinter, hkeyPrinters = NULL;
-    WCHAR devnameW[MAX_PATH], *ppd_dir = NULL, *ppd;
-    HANDLE added_printer;
-
-    while (isspace(*pent)) pent++;
-    r = strchr(pent,':');
-    if (r)
-        name_len = r - pent;
-    else
-        name_len = strlen(pent);
-    name = HeapAlloc(GetProcessHeap(), 0, name_len + 1);
-    memcpy(name, pent, name_len);
-    name[name_len] = '\0';
-    if (r)
-        pent = r;
-    else
-        pent = "";
-
-    TRACE("name=%s entry=%s\n",name, pent);
-
-    if(ispunct(*name)) { /* a tc entry, not a real printer */
-        TRACE("skipping tc entry\n");
-        goto end;
-    }
-
-    if(strstr(pent,":server")) { /* server only version so skip */
-        TRACE("skipping server entry\n");
-        goto end;
-    }
-
-    /* Determine whether this is a postscript printer. */
-
-    ret = TRUE;
-    env_default = getenv("PRINTER");
-    prettyname = name;
-    /* Get longest name, usually the one at the right for later display. */
-    while((s=strchr(prettyname,'|'))) {
-        *s = '\0';
-        e = s;
-        while(isspace(*--e)) *e = '\0';
-        TRACE("\t%s\n", debugstr_a(prettyname));
-        if(env_default && !_strnicmp(prettyname, env_default, -1)) set_default = TRUE;
-        for(prettyname = s+1; isspace(*prettyname); prettyname++)
-            ;
-    }
-    e = prettyname + strlen(prettyname);
-    while(isspace(*--e)) *e = '\0';
-    TRACE("\t%s\n", debugstr_a(prettyname));
-    if(env_default && !_strnicmp(prettyname, env_default, -1)) set_default = TRUE;
-
-    /* prettyname must fit into the dmDeviceName member of DEVMODE struct,
-     * if it is too long, we use it as comment below. */
-    devname = prettyname;
-    if (strlen(devname)>=CCHDEVICENAME-1)
-	 devname = name;
-    if (strlen(devname)>=CCHDEVICENAME-1) {
-        ret = FALSE;
-        goto end;
-    }
-
-    port = HeapAlloc(GetProcessHeap(),0,strlen("LPR:")+strlen(name)+1);
-    sprintf(port,"LPR:%s",name);
-
-    if(RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) !=
-       ERROR_SUCCESS) {
-        ERR("Can't create Printers key\n");
-	ret = FALSE;
-        goto end;
-    }
-
-    MultiByteToWideChar(CP_ACP, 0, devname, -1, devnameW, ARRAY_SIZE(devnameW));
-
-    if(RegOpenKeyA(hkeyPrinters, devname, &hkeyPrinter) == ERROR_SUCCESS) {
-        DWORD status = get_dword_from_reg( hkeyPrinter, StatusW );
-        /* Printer already in registry, delete the tag added in WINSPOOL_LoadSystemPrinters
-           and continue */
-        TRACE("Printer already exists\n");
-        RegDeleteValueW(hkeyPrinter, May_Delete_Value);
-        /* flag that the PPD file should be checked for an update */
-        set_reg_DWORD( hkeyPrinter, StatusW, status | PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
-        RegCloseKey(hkeyPrinter);
-    } else {
-        static CHAR data_type[]   = "RAW",
-                    print_proc[]  = "WinPrint",
-                    comment[]     = "WINEPS Printer using LPR",
-                    params[]      = "<parameters?>",
-                    share_name[]  = "<share name?>",
-                    sep_file[]    = "<sep file?>";
-        BOOL added_driver = FALSE;
-
-        if (!ppd_dir && !(ppd_dir = get_ppd_dir())) goto end;
-        ppd = get_ppd_filename( ppd_dir, devnameW );
-        if (get_fallback_ppd( devname, ppd ))
-        {
-            added_driver = add_printer_driver( devnameW, ppd );
-            unlink_ppd( ppd );
-        }
-        HeapFree( GetProcessHeap(), 0, ppd );
-        if (!added_driver) goto end;
-
-        memset(&pinfo2a,0,sizeof(pinfo2a));
-        pinfo2a.pPrinterName    = devname;
-        pinfo2a.pDatatype       = data_type;
-        pinfo2a.pPrintProcessor = print_proc;
-        pinfo2a.pDriverName     = devname;
-        pinfo2a.pComment        = comment;
-        pinfo2a.pLocation       = prettyname;
-        pinfo2a.pPortName       = port;
-        pinfo2a.pParameters     = params;
-        pinfo2a.pShareName      = share_name;
-        pinfo2a.pSepFile        = sep_file;
-
-        added_printer = AddPrinterA( NULL, 2, (LPBYTE)&pinfo2a );
-        if (added_printer) ClosePrinter( added_printer );
-        else if (GetLastError() != ERROR_PRINTER_ALREADY_EXISTS)
-            ERR( "printer '%s' not added by AddPrinter (error %d)\n", debugstr_a(name), GetLastError() );
-    }
-
-    if (isfirst || set_default)
-        set_default_printer(devname, name);
-
- end:
-    if (hkeyPrinters) RegCloseKey( hkeyPrinters );
-    if (ppd_dir)
-    {
-        RemoveDirectoryW( ppd_dir );
-        HeapFree( GetProcessHeap(), 0, ppd_dir );
-    }
-    HeapFree(GetProcessHeap(), 0, port);
-    HeapFree(GetProcessHeap(), 0, name);
-    return ret;
-}
-
-static BOOL
-PRINTCAP_LoadPrinters(void) {
-    BOOL		hadprinter = FALSE;
-    char		buf[200];
-    FILE		*f;
-    char *pent = NULL;
-    BOOL had_bash = FALSE;
-
-    f = fopen("/etc/printcap","r");
-    if (!f)
-	return FALSE;
-
-    while(fgets(buf,sizeof(buf),f)) {
-        char *start, *end;
-
-        end=strchr(buf,'\n');
-        if (end) *end='\0';
-    
-        start = buf;
-        while(isspace(*start)) start++;
-        if(*start == '#' || *start == '\0')
-            continue;
-
-        if(pent && !had_bash && *start != ':' && *start != '|') { /* start of new entry, parse the previous one */
-	    hadprinter |= PRINTCAP_ParseEntry(pent,!hadprinter);
-            HeapFree(GetProcessHeap(),0,pent);
-            pent = NULL;
-        }
-
-        if (end && *--end == '\\') {
-            *end = '\0';
-            had_bash = TRUE;
-        } else
-            had_bash = FALSE;
-
-        if (pent) {
-            pent=HeapReAlloc(GetProcessHeap(),0,pent,strlen(pent)+strlen(start)+1);
-            strcat(pent,start);
-        } else {
-            pent=HeapAlloc(GetProcessHeap(),0,strlen(start)+1);
-            strcpy(pent,start);
-        }
-
-    }
-    if(pent) {
-        hadprinter |= PRINTCAP_ParseEntry(pent,!hadprinter);
-        HeapFree(GetProcessHeap(),0,pent);
-    }
-    fclose(f);
-    return hadprinter;
-}
-
 static inline DWORD set_reg_szW(HKEY hkey, const WCHAR *keyname, const WCHAR *value)
 {
     if (value)
@@ -1783,7 +1499,6 @@ void WINSPOOL_LoadSystemPrinters(void)
     HKEY                hkey, hkeyPrinters;
     DWORD               needed, num, i;
     WCHAR               PrinterName[256];
-    BOOL                done = FALSE;
 
     /* FIXME: The init code should be moved to spoolsv.exe */
     init_mutex = CreateMutexW( NULL, TRUE, winspool_mutex_name );
@@ -1823,12 +1538,9 @@ void WINSPOOL_LoadSystemPrinters(void)
     old_printer_check( FALSE );
 
 #ifdef SONAME_LIBCUPS
-    done = CUPS_LoadPrinters();
+    CUPS_LoadPrinters();
 #endif
 
-    if(!done) /* If we have any CUPS based printers, skip looking for printcap printers */
-        PRINTCAP_LoadPrinters();
-
     old_printer_check( TRUE );
 
     ReleaseMutex( init_mutex );
-- 
2.23.0




More information about the wine-devel mailing list