Removed version number from file header.
[samba.git] / source / printing / pcap.c
index ff0a2b54772e47d25679f25e26a36d1caeafd893..920c6f354e27daa0ba0f4ac2c012dc880eb6d428 100644 (file)
@@ -1,14 +1,15 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    printcap parsing
-   Copyright (C) Karl Auer 1993-1997
+   Copyright (C) Karl Auer 1993-1998
 
    Re-working by Martin Kiff, 1994
    
    Re-written again by Andrew Tridgell
 
    Modified for SVID support by Norm Jacobs, 1997
+
+   Modified for CUPS support by Michael Sweet, 1999
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
  *
  *  Modified to call SVID/XPG4 support if printcap name is set to "lpstat"
  *  in smb.conf under Solaris.
+ *
+ *  Modified to call CUPS support if printcap name is set to "cups"
+ *  in smb.conf.
  */
 
 #include "includes.h"
 
 #include "smb.h"
 
-extern int DEBUGLEVEL;
-
 #ifdef AIX
 /*  ******************************************
      Extend for AIX system and qconfig file
@@ -69,7 +71,7 @@ extern int DEBUGLEVEL;
     ****************************************** */
 static int strlocate(char *xpLine,char *xpS)
 {
-       int iS,iL,i,iRet;
+       int iS,iL,iRet;
        char *p;
        iS = strlen(xpS);
        iL = strlen(xpLine);
@@ -91,17 +93,17 @@ static int strlocate(char *xpLine,char *xpS)
 /* ******************************************************************* */
 /* *    Scan qconfig and search all virtual printer (device printer) * */
 /* ******************************************************************* */
-static void ScanQconfig_fn(char *psz,void (*fn)())
+static void ScanQconfig_fn(char *psz,void (*fn)(char *, char *))
 {
-       int iLg,iEtat;
-       FILE *pfile;
+       int iEtat;
+       XFILE *pfile;
        char *line,*p;
        pstring name,comment;
        line  = NULL;
        *name = 0;
        *comment = 0;
 
-       if ((pfile = fopen(psz, "r")) == NULL)
+       if ((pfile = x_fopen(psz, O_RDONLY, 0)) == NULL)
        {
              DEBUG(0,( "Unable to open qconfig file %s for read!\n", psz));
              return;
@@ -117,13 +119,13 @@ static void ScanQconfig_fn(char *psz,void (*fn)())
                {
                        case 0: /* locate an entry */
                         if (*line == '\t' || *line == ' ') continue;
-                        if ((p=strchr(line,':')))
+                        if ((p=strchr_m(line,':')))
                         {
                                *p = '\0';
                                p = strtok(line,":");
                                if (strcmp(p,"bsh")!=0)
                                  {
-                                   strcpy(name,p);
+                                   pstrcpy(name,p);
                                    iEtat = 1;
                                    continue;
                                  }
@@ -155,7 +157,7 @@ static void ScanQconfig_fn(char *psz,void (*fn)())
                          break;
                }
        }
-       fclose(pfile);
+       x_fclose(pfile);
 }
 
 /* Scan qconfig file and locate de printername */
@@ -163,7 +165,7 @@ static void ScanQconfig_fn(char *psz,void (*fn)())
 static BOOL ScanQconfig(char *psz,char *pszPrintername)
 {
        int iLg,iEtat;
-       FILE *pfile;
+       XFILE *pfile;
        char *pName;
        char *line;
 
@@ -176,13 +178,13 @@ static BOOL ScanQconfig(char *psz,char *pszPrintername)
                DEBUG(0,(" Unable to allocate memory for printer %s\n",pszPrintername));
                return(False);
        }
-       if ((pfile = fopen(psz, "r")) == NULL)
+       if ((pfile = x_fopen(psz, O_RDONLY, 0)) == NULL)
        {
              DEBUG(0,( "Unable to open qconfig file %s for read!\n", psz));
              free(pName);
              return(False);
        }
-       sprintf(pName,"%s:",pszPrintername);
+       slprintf(pName, iLg + 9, "%s:",pszPrintername);
        iLg = strlen(pName);
        /*DEBUG(3,( " Looking for entry %s\n",pName));*/
        iEtat = 0;
@@ -229,23 +231,27 @@ static BOOL ScanQconfig(char *psz,char *pszPrintername)
                }
        }
        free (pName);
-       fclose(pfile);
+       x_fclose(pfile);
        return(False);
 }
+#endif /* AIX */
+
 
-#endif
 /***************************************************************************
 Scan printcap file pszPrintcapname for a printer called pszPrintername. 
 Return True if found, else False. Returns False on error, too, after logging 
 the error at level 0. For generality, the printcap name may be passed - if
-passed as NULL, the configuration will be queried for the name.
+passed as NULL, the configuration will be queried for the name. pszPrintername
+must be in DOS codepage.
+The xxx_printername_ok functions need fixing to understand they are being
+given a DOS codepage. FIXME !! JRA.
 ***************************************************************************/
 BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname)
 {
   char *line=NULL;
   char *psz;
   char *p,*q;
-  FILE *pfile;
+  XFILE *pfile;
 
   if (pszPrintername == NULL || pszPrintername[0] == '\0')
     {
@@ -261,17 +267,22 @@ BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname)
        return(False);
       }
 
+#ifdef HAVE_CUPS
+    if (strequal(psz, "cups"))
+       return (cups_printername_ok(pszPrintername));
+#endif /* HAVE_CUPS */
+
 #ifdef SYSV
     if (strequal(psz, "lpstat"))
        return (sysv_printername_ok(pszPrintername));
 #endif
 
 #ifdef AIX
-  if (strlocate(psz,"/qconfig") != NULL)
+  if (strlocate(psz,"/qconfig"))
      return(ScanQconfig(psz,pszPrintername));
 #endif
 
-  if ((pfile = fopen(psz, "r")) == NULL)
+  if ((pfile = x_fopen(psz, O_RDONLY, 0)) == NULL)
     {
       DEBUG(0,( "Unable to open printcap file %s for read!\n", psz));
       return(False);
@@ -283,43 +294,45 @@ BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname)
        continue;
 
       /* now we have a real printer line - cut it off at the first : */      
-      p = strchr(line,':');
+      p = strchr_m(line,':');
       if (p) *p = 0;
       
       /* now just check if the name is in the list */
       /* NOTE: I avoid strtok as the fn calling this one may be using it */
       for (p=line; p; p=q)
        {
-         if ((q = strchr(p,'|'))) *q++ = 0;
+         if ((q = strchr_m(p,'|'))) *q++ = 0;
 
          if (strequal(p,pszPrintername))
            {
              /* normalise the case */
-             strcpy(pszPrintername,p);
+             pstrcpy(pszPrintername,p);
              free(line);
-             fclose(pfile);
+             x_fclose(pfile);
              return(True);           
            }
          p = q;
        }
     }
 
-  fclose(pfile);
+  x_fclose(pfile);
   return(False);
 }
 
 
 /***************************************************************************
 run a function on each printer name in the printcap file. The function is 
-passed the primary name and the comment (if possible)
+passed the primary name and the comment (if possible). Note the fn() takes
+strings in DOS codepage. This means the xxx_printer_fn() calls must be fixed
+to return DOS codepage. FIXME !! JRA.
 ***************************************************************************/
-void pcap_printer_fn(void (*fn)())
+void pcap_printer_fn(void (*fn)(char *, char *))
 {
   pstring name,comment;
   char *line;
   char *psz;
   char *p,*q;
-  FILE *pfile;
+  XFILE *pfile;
 
   /* only go looking if no printcap name supplied */
   if (((psz = lp_printcapname()) == NULL) || (psz[0] == '\0'))
@@ -328,6 +341,13 @@ void pcap_printer_fn(void (*fn)())
       return;
     }
 
+#ifdef HAVE_CUPS
+    if (strequal(psz, "cups")) {
+      cups_printer_fn(fn);
+      return;
+    }
+#endif /* HAVE_CUPS */
+
 #ifdef SYSV
     if (strequal(psz, "lpstat")) {
       sysv_printer_fn(fn);
@@ -336,14 +356,14 @@ void pcap_printer_fn(void (*fn)())
 #endif
 
 #ifdef AIX
-  if (strlocate(psz,"/qconfig") != NULL)
+  if (strlocate(psz,"/qconfig"))
   {
        ScanQconfig_fn(psz,fn);
      return;
   }
 #endif
 
-  if ((pfile = fopen(psz, "r")) == NULL)
+  if ((pfile = x_fopen(psz, O_RDONLY, 0)) == NULL)
     {
       DEBUG(0,( "Unable to open printcap file %s for read!\n", psz));
       return;
@@ -355,7 +375,7 @@ void pcap_printer_fn(void (*fn)())
        continue;
 
       /* now we have a real printer line - cut it off at the first : */      
-      p = strchr(line,':');
+      p = strchr_m(line,':');
       if (p) *p = 0;
       
       /* now find the most likely printer name and comment 
@@ -365,9 +385,9 @@ void pcap_printer_fn(void (*fn)())
       for (p=line; p; p=q)
        {
          BOOL has_punctuation;
-         if ((q = strchr(p,'|'))) *q++ = 0;
+         if ((q = strchr_m(p,'|'))) *q++ = 0;
 
-         has_punctuation = (strchr(p,' ') || strchr(p,'(') || strchr(p,')'));
+         has_punctuation = (strchr_m(p,' ') || strchr_m(p,'\t') || strchr_m(p,'(') || strchr_m(p,')'));
 
          if (strlen(p)>strlen(comment) && has_punctuation)
            {
@@ -375,14 +395,14 @@ void pcap_printer_fn(void (*fn)())
              continue;
            }
 
-         if (strlen(p) <= 8 && strlen(p)>strlen(name) && !has_punctuation)
+         if (strlen(p) <= MAXPRINTERLEN && strlen(p)>strlen(name) && !has_punctuation)
            {
              if (!*comment) pstrcpy(comment,name);
              pstrcpy(name,p);
              continue;
            }
 
-         if (!strchr(comment,' ') && 
+         if (!strchr_m(comment,' ') && 
              strlen(p) > strlen(comment))
            {
              StrnCpy(comment,p,sizeof(comment)-1);
@@ -391,10 +411,10 @@ void pcap_printer_fn(void (*fn)())
        }
 
       comment[60] = 0;
-      name[8] = 0;
+      name[MAXPRINTERLEN] = 0;
 
-      if (*name)
+      if (*name) 
        fn(name,comment);
     }
-  fclose(pfile);
+  x_fclose(pfile);
 }