Merge branch 'master' of ssh://git.samba.org/data/git/abartlet/samba into extended...
[abartlet/samba.git/.git] / source3 / printing / print_svid.c
index f3573961d9f59aa62df1369f6b45bfc03c87e6ef..681b2bf459b93bc30e4e1e6547d6a8f5763f5387 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  * 
  * This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  * GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
 
 
 #include "includes.h"
-#include "smb.h"
 
-#ifdef SYSV
-
-extern int DEBUGLEVEL;
-
-typedef struct printer {
-       char *name;
-       struct printer *next;
-} printer_t;
-static printer_t *printers = NULL;
-
-static void populate_printers(void)
+#if defined(SYSV) || defined(HPUX)
+bool sysv_cache_reload(void)
 {
        char **lines;
        int i;
 
-       lines = file_lines_pload("/usr/bin/lpstat -v", NULL);
-       if (!lines) return;
+#if defined(HPUX)
+       DEBUG(5, ("reloading hpux printcap cache\n"));
+#else
+       DEBUG(5, ("reloading sysv printcap cache\n"));
+#endif
+
+       if ((lines = file_lines_pload("/usr/bin/lpstat -v", NULL)) == NULL)
+       {
+#if defined(HPUX)
+      
+                      /*
+               * if "lpstat -v" is NULL then we check if schedular is running if it is
+               * that means no printers are added on the HP-UX system, if schedular is not
+               * running we display reload error.
+               */
+
+               char **scheduler;
+                scheduler = file_lines_pload("/usr/bin/lpstat -r", NULL);
+                if(!strcmp(*scheduler,"scheduler is running")){
+                        DEBUG(3,("No Printers found!!!\n"));
+                       TALLOC_FREE(scheduler);
+                        return True;
+                }
+                else{
+                        DEBUG(3,("Scheduler is not running!!!\n"));
+                       TALLOC_FREE(scheduler);
+                       return False;
+               }
+#else
+               DEBUG(3,("No Printers found!!!\n"));
+               return False;
+#endif
+       }
 
-       for (i=0;lines[i];i++) {
-               printer_t *ptmp;
+       for (i = 0; lines[i]; i++) {
                char *name, *tmp;
                char *buf = lines[i];
 
@@ -67,7 +86,7 @@ static void populate_printers(void)
                 * In case we're only at the "for ".
                 */
 
-               if(!strncmp("for ",++tmp,4)) {
+               if(!strncmp("for ", ++tmp, 4)) {
                        tmp=strchr_m(tmp, ' ');
                        tmp++;
                }
@@ -81,7 +100,7 @@ static void populate_printers(void)
                 * On HPUX there is an extra line that can be ignored.
                 * d.thibadeau 2001/08/09
                 */
-               if(!strncmp("remote to",name,9))
+               if(!strncmp("remote to", tmp, 9))
                        continue;
 
                name = tmp;
@@ -91,53 +110,14 @@ static void populate_printers(void)
                        *tmp = '\0';
                
                /* add it to the cache */
-               if ((ptmp = malloc(sizeof (*ptmp))) != NULL) {
-                       ZERO_STRUCTP(ptmp);
-                       if((ptmp->name = strdup(name)) == NULL)
-                               DEBUG(0,("populate_printers: malloc fail in strdup !\n"));
-                       ptmp->next = printers;
-                       printers = ptmp;
-               } else {
-                       DEBUG(0,("populate_printers: malloc fail for ptmp\n"));
+               if (!pcap_cache_add(name, NULL)) {
+                       TALLOC_FREE(lines);
+                       return False;
                }
        }
 
-       file_lines_free(lines);
-}
-
-
-/*
- * provide the equivalent of pcap_printer_fn() for SVID/XPG4 conforming
- * systems.  It was unclear why pcap_printer_fn() was tossing names longer
- * than 8 characters.  I suspect that its a protocol limit, but amazingly
- * names longer than 8 characters appear to work with my test
- * clients (Win95/NT).
- */
-void sysv_printer_fn(void (*fn)(char *, char *))
-{
-       printer_t *tmp;
-
-       if (printers == NULL)
-               populate_printers();
-       for (tmp = printers; tmp != NULL; tmp = tmp->next)
-               (fn)(tmp->name, "");
-}
-
-
-/*
- * provide the equivalent of pcap_printername_ok() for SVID/XPG4 conforming
- * systems.
- */
-int sysv_printername_ok(char *name)
-{
-       printer_t *tmp;
-
-       if (printers == NULL)
-               populate_printers();
-       for (tmp = printers; tmp != NULL; tmp = tmp->next)
-               if (strcmp(tmp->name, name) == 0)
-                       return (True);
-       return (False);
+       TALLOC_FREE(lines);
+       return True;
 }
 
 #else