]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/ppd.c
Remove bdb env on exit
[netatalk.git] / etc / papd / ppd.c
index 120ff74c5fd5280ad27fc779e9e29a14763add73..f16469289f9a4af9af93cba62fad839025affefe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ppd.c,v 1.11 2008-11-14 10:29:08 didg Exp $
+ * $Id: ppd.c,v 1.17 2009-10-14 02:24:05 didg Exp $
  *
  * Copyright (c) 1995 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
 struct ppd_font                *ppd_fonts = NULL;
 
 struct ppd_feature     ppd_features[] = {
-    { "*LanguageLevel",        0 },
-    { "*PSVersion",    0 },
+    { "*LanguageLevel",        NULL },
+    { "*PSVersion",    NULL },
 #ifdef HAVE_CUPS
     { "*FreeVM",       "33554432" },
 #else
-    { "*FreeVM",       0 },
+    { "*FreeVM",       NULL },
 #endif
-    { "*Product",      0 },
-    { "*PCFileName",   0 },
-    { "*ModelName",    0 },
-    { "*NickName",     0 },
-    { "*ColorDevice",  0 },
-    { "*FaxSupport",   0 },
-    { "*TTRasterizer", 0 },
-    { 0, 0 },
+    { "*Product",      NULL },
+    { "*PCFileName",   NULL },
+    { "*ModelName",    NULL },
+    { "*NickName",     NULL },
+    { "*ColorDevice",  NULL },
+    { "*FaxSupport",   NULL },
+    { "*TTRasterizer", NULL },
+    { NULL, NULL },
 };
 
 struct ppdent {
@@ -51,31 +51,29 @@ struct ppdent {
 };
 
 #ifndef SHOWPPD
-int ppd_inited = 0;
+static int ppd_inited;
 
-int ppd_init()
+static void ppd_init(void)
 {
-    if ( ppd_inited ) {
-       return( -1 );
-    }
+    if (ppd_inited)
+        return;
+
     ppd_inited++;
 
-    return read_ppd( printer->p_ppdfile, 0 );
+    if (printer->p_ppdfile)
+        read_ppd( printer->p_ppdfile, 0 );
 }
 #endif /* SHOWPPD */
 
 
 /* quick and ugly hack to be able to read
    ppd files with Mac line ending */
-static char* my_fgets(buf, bufsize, stream) 
-    char   *buf;
-    size_t bufsize;
-    FILE   *stream;
+static char* my_fgets(char *buf, size_t bufsize, FILE *stream)
 {
     int p;           /* uninitialized, OK 310105 */
     size_t count = 0;
  
-    while (count < bufsize && EOF != (p=fgetc(stream))) {
+    while (count < (bufsize - 1) && EOF != (p=fgetc(stream))) {
         buf[count] = p;
         count++;
         if ( p == '\r' || p == '\n')
@@ -93,8 +91,7 @@ static char* my_fgets(buf, bufsize, stream)
     return buf;
 }
 
-struct ppdent *getppdent( stream )
-    FILE       *stream;
+static struct ppdent *getppdent( FILE *stream)
 {
     static char                        buf[ 1024 ];
     static struct ppdent       ppdent;
@@ -107,7 +104,7 @@ struct ppdent *getppdent( stream )
        if ( *p != '*' ) {      /* main key word */
            continue;
        }
-       if ( p[ strlen( p ) - 1 ] != '\n' && p[ strlen( p ) - 1 ] != '\r') {
+       if ( p[ strlen( p ) - 1 ] != '\n') {
            LOG(log_error, logtype_papd, "getppdent: line too long" );
            continue;
        }
@@ -178,9 +175,7 @@ struct ppdent *getppdent( stream )
     return( NULL );
 }
 
-int read_ppd( file, fcnt )
-    char       *file;
-    int                fcnt;
+int read_ppd(char *file, int fcnt)
 {
     FILE               *ppdfile;
     struct ppdent      *pe;
@@ -205,7 +200,7 @@ int read_ppd( file, fcnt )
        }
 
        /* *Font */
-       if ( strcmp( pe->pe_main, "*Font" ) == 0 ) {
+       if ( strcmp( pe->pe_main, "*Font" ) == 0 && pe->pe_option ) {
            for ( pfo = ppd_fonts; pfo; pfo = pfo->pd_next ) {
                if ( strcmp( pfo->pd_font, pe->pe_option ) == 0 ) {
                    break;
@@ -238,7 +233,7 @@ int read_ppd( file, fcnt )
                break;
            }
        }
-       if ( pfe->pd_name ) { /*&& (pfe->pd_value == NULL) ) { */
+       if ( pfe->pd_name && pe->pe_value ) { 
            if (( pfe->pd_value =
                    (char *)malloc( strlen( pe->pe_value ) + 1 )) == NULL ) {
                LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
@@ -254,8 +249,7 @@ int read_ppd( file, fcnt )
     return( 0 );
 }
 
-struct ppd_font *ppd_font( font )
-    char       *font;
+struct ppd_font *ppd_font( char *font)
 {
     struct ppd_font    *pfo;
 
@@ -273,9 +267,7 @@ struct ppd_font *ppd_font( font )
     return( NULL );
 }
 
-struct ppd_feature *ppd_feature( feature, len )
-    const char *feature;
-    int                len;
+struct ppd_feature *ppd_feature( const char *feature, int len)
 {
     struct ppd_feature *pfe;
     char               ppd_feature_main[ 256 ];
@@ -288,6 +280,9 @@ struct ppd_feature *ppd_feature( feature, len )
     }
 #endif /* SHOWPPD */
 
+    if (len > sizeof(ppd_feature_main) -1)
+        return( NULL );
+        
     for ( end = feature + len, p = feature, q = ppd_feature_main;
            (p <= end) && (*p != '\n') && (*p != '\r'); p++, q++ ) {
        *q = *p;