Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Feb 2008 09:35:53 -0600 (CST)
From:      Dan Nelson <dnelson@allantgroup.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   java/120718: [patch] Completely remove jdk16 dependency on cups-base
Message-ID:  <200802151535.m1FFZrn4003975@dan.emsphone.com>
Resent-Message-ID: <200802151540.m1FFe1EC005588@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         120718
>Category:       java
>Synopsis:       [patch] Completely remove jdk16 dependency on cups-base
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-java
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 15 15:40:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Dan Nelson
>Release:        FreeBSD 7.0-PRERELEASE i386
>Organization:
The Allant Group
>Environment:
System: FreeBSD dan.emsphone.com 7.0-PRERELEASE FreeBSD 7.0-PRERELEASE #532: Mon Jan 28 09:37:54 CST 2008 zsh@dan.emsphone.com:/usr/src-7/sys/i386/compile/DANSMP i386


	
>Description:
	

The jdk16 port currently requires the cups-base port to be installed to
build, which causes havok for any machine not using cups, because
cups-base installs incompatible lp/lpq/lpr binaries into
/usr/local/bin .  Luckily, the java source doesn't really require cups
at all; it only wants to #include a few headers.

>How-To-Repeat:
	
>Fix:

	

The following patch adds the 7 cups headers used by CUPSfuncs.c to the
files/cups/ directory and tells the build system to look there. 
Hopefully it can be added to the upcoming jdk160u3 port update.

Index: Makefile
===================================================================
RCS file: /home/ncvs/ports/java/jdk16/Makefile,v
retrieving revision 1.154
diff -u -r1.154 Makefile
--- Makefile	3 Feb 2008 18:46:25 -0000	1.154
+++ Makefile	14 Feb 2008 23:18:24 -0000
@@ -20,8 +20,7 @@
 
 BUILD_DEPENDS=	zip:${PORTSDIR}/archivers/zip \
 		unzip:${PORTSDIR}/archivers/unzip \
-		${X11BASE}/lib/libXm.so:${PORTSDIR}/x11-toolkits/open-motif \
-		${LOCALBASE}/include/cups/cups.h:${PORTSDIR}/print/cups-base
+		${X11BASE}/lib/libXm.so:${PORTSDIR}/x11-toolkits/open-motif
 RUN_DEPENDS=	javavm:${PORTSDIR}/java/javavmwrapper
 
 OPTIONS=	DEBUG	"Enable debugging support"	off \
@@ -136,6 +135,7 @@
 		SKIP_FASTDEBUG_BUILD="true" \
 		LOCALBASE="${LOCALBASE}" \
 		X11BASE="${X11BASE}" \
+		FILESDIR="${FILESDIR}" \
 		PTHREAD_LIBS="${PTHREAD_LIBS}"
 
 .if defined(WITH_DEBUG)
Index: files/patch-j2se-shared-Defs-bsd.gmk
===================================================================
RCS file: /home/ncvs/ports/java/jdk16/files/patch-j2se-shared-Defs-bsd.gmk,v
retrieving revision 1.1
diff -u -r1.1 patch-j2se-shared-Defs-bsd.gmk
--- files/patch-j2se-shared-Defs-bsd.gmk	5 Aug 2007 20:39:49 -0000	1.1
+++ files/patch-j2se-shared-Defs-bsd.gmk	14 Feb 2008 23:09:55 -0000
@@ -16,7 +16,7 @@
  
  # CUPS
 -_CUPS_HEADERS_PATH=/usr/local/include
-+_CUPS_HEADERS_PATH=${LOCALBASE}/include
++_CUPS_HEADERS_PATH=${FILESDIR}
  
  # JDK_IMPORT_PATH: location of previously built JDK (this version).
  ifdef ALT_JDK_IMPORT_PATH
Index: files/cups/array.h
===================================================================
RCS file: files/cups/array.h
diff -N files/cups/array.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/array.h	11 Jul 2007 21:46:42 -0000
@@ -0,0 +1,83 @@
+/*
+ * "$Id: array.h 6649 2007-07-11 21:46:42Z mike $"
+ *
+ *   Sorted array definitions for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_ARRAY_H_
+#  define _CUPS_ARRAY_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <stdlib.h>
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * Types and structures...
+ */
+
+typedef struct _cups_array_s cups_array_t;
+					/**** CUPS array type ****/
+typedef int (*cups_array_func_t)(void *first, void *second, void *data);
+					/**** Array comparison function ****/
+typedef int (*cups_ahash_func_t)(void *element, void *data);
+					/**** Array hash function ****/
+
+
+/*
+ * Functions...
+ */
+
+extern int		cupsArrayAdd(cups_array_t *a, void *e);
+extern void		cupsArrayClear(cups_array_t *a);
+extern int		cupsArrayCount(cups_array_t *a);
+extern void		*cupsArrayCurrent(cups_array_t *a);
+extern void		cupsArrayDelete(cups_array_t *a);
+extern cups_array_t	*cupsArrayDup(cups_array_t *a);
+extern void		*cupsArrayFind(cups_array_t *a, void *e);
+extern void		*cupsArrayFirst(cups_array_t *a);
+extern int		cupsArrayGetIndex(cups_array_t *a);
+extern int		cupsArrayGetInsert(cups_array_t *a);
+extern void		*cupsArrayIndex(cups_array_t *a, int n);
+extern int		cupsArrayInsert(cups_array_t *a, void *e);
+extern void		*cupsArrayLast(cups_array_t *a);
+extern cups_array_t	*cupsArrayNew(cups_array_func_t f, void *d);
+extern cups_array_t	*cupsArrayNew2(cups_array_func_t f, void *d,
+			               cups_ahash_func_t h, int hsize);
+extern void		*cupsArrayNext(cups_array_t *a);
+extern void		*cupsArrayPrev(cups_array_t *a);
+extern int		cupsArrayRemove(cups_array_t *a, void *e);
+extern void		*cupsArrayRestore(cups_array_t *a);
+extern int		cupsArraySave(cups_array_t *a);
+extern void		*cupsArrayUserData(cups_array_t *a);
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_ARRAY_H_ */
+
+/*
+ * End of "$Id: array.h 6649 2007-07-11 21:46:42Z mike $".
+ */
Index: files/cups/cups.h
===================================================================
RCS file: files/cups/cups.h
diff -N files/cups/cups.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/cups.h	19 Sep 2007 21:51:55 -0000
@@ -0,0 +1,260 @@
+/*
+ * "$Id: cups.h 6981 2007-09-19 21:51:55Z mike $"
+ *
+ *   API definitions for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_CUPS_H_
+#  define _CUPS_CUPS_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <sys/types.h>
+#  if defined(WIN32) && !defined(__CUPS_SSIZE_T_DEFINED)
+#    define __CUPS_SSIZE_T_DEFINED
+/* Windows does not support the ssize_t type, so map it to off_t... */
+typedef off_t ssize_t;			/* @private@ */
+#  endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */
+
+#  include "ipp.h"
+#  include "ppd.h"
+#  include "language.h"
+
+
+/*
+ * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get
+ * a warning at compile-time.
+ */
+
+#  if defined(__GNUC__) && __GNUC__ > 2
+#    define _CUPS_DEPRECATED __attribute__ ((__deprecated__))
+#  else
+#    define _CUPS_DEPRECATED
+#  endif /* __GNUC__ && __GNUC__ > 2 */
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * Constants...
+ */
+
+#  define CUPS_VERSION		1.0303
+#  define CUPS_VERSION_MAJOR	1
+#  define CUPS_VERSION_MINOR	3
+#  define CUPS_VERSION_PATCH	3
+#  define CUPS_DATE_ANY		-1
+
+
+/*
+ * Types and structures...
+ */
+
+typedef unsigned cups_ptype_t;		/**** Printer Type/Capability Bits ****/
+enum cups_ptype_e			/* Not a typedef'd enum so we can OR */
+{
+  CUPS_PRINTER_LOCAL = 0x0000,		/* Local printer or class */
+  CUPS_PRINTER_CLASS = 0x0001,		/* Printer class */
+  CUPS_PRINTER_REMOTE = 0x0002,		/* Remote printer or class */
+  CUPS_PRINTER_BW = 0x0004,		/* Can do B&W printing */
+  CUPS_PRINTER_COLOR = 0x0008,		/* Can do color printing */
+  CUPS_PRINTER_DUPLEX = 0x0010,		/* Can do duplexing */
+  CUPS_PRINTER_STAPLE = 0x0020,		/* Can staple output */
+  CUPS_PRINTER_COPIES = 0x0040,		/* Can do copies */
+  CUPS_PRINTER_COLLATE = 0x0080,	/* Can collage copies */
+  CUPS_PRINTER_PUNCH = 0x0100,		/* Can punch output */
+  CUPS_PRINTER_COVER = 0x0200,		/* Can cover output */
+  CUPS_PRINTER_BIND = 0x0400,		/* Can bind output */
+  CUPS_PRINTER_SORT = 0x0800,		/* Can sort output */
+  CUPS_PRINTER_SMALL = 0x1000,		/* Can do Letter/Legal/A4 */
+  CUPS_PRINTER_MEDIUM = 0x2000,		/* Can do Tabloid/B/C/A3/A2 */
+  CUPS_PRINTER_LARGE = 0x4000,		/* Can do D/E/A1/A0 */
+  CUPS_PRINTER_VARIABLE = 0x8000,	/* Can do variable sizes */
+  CUPS_PRINTER_IMPLICIT = 0x10000,	/* Implicit class */
+  CUPS_PRINTER_DEFAULT = 0x20000,	/* Default printer on network */
+  CUPS_PRINTER_FAX = 0x40000,		/* Fax queue */
+  CUPS_PRINTER_REJECTING = 0x80000,	/* Printer is rejecting jobs */
+  CUPS_PRINTER_DELETE = 0x100000,	/* Delete printer @since CUPS 1.2@ */
+  CUPS_PRINTER_NOT_SHARED = 0x200000,	/* Printer is not shared @since CUPS 1.2@ */
+  CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2@ */
+  CUPS_PRINTER_COMMANDS = 0x800000,	/* Printer supports maintenance commands @since CUPS 1.2@ */
+  CUPS_PRINTER_DISCOVERED = 0x1000000,	/* Printer was automatically discovered and added @since CUPS 1.3@ */
+  CUPS_PRINTER_OPTIONS = 0x6fffc	/* ~(CLASS | REMOTE | IMPLICIT | DEFAULT | FAX | REJECTING | DELETE | NOT_SHARED | AUTHENTICATED | COMMANDS | DISCOVERED) */
+};
+
+typedef const char *(*cups_password_cb_t)(const char *);
+					/**** Password callback ****/
+
+typedef struct cups_option_s		/**** Printer Options ****/
+{
+  char		*name;			/* Name of option */
+  char		*value;			/* Value of option */
+} cups_option_t;
+
+typedef struct cups_dest_s		/**** Destination ****/
+{
+  char		*name,			/* Printer or class name */
+		*instance;		/* Local instance name or NULL */
+  int		is_default;		/* Is this printer the default? */
+  int		num_options;		/* Number of options */
+  cups_option_t	*options;		/* Options */
+} cups_dest_t;
+
+typedef struct cups_job_s		/**** Job ****/
+{
+  int		id;			/* The job ID */
+  char		*dest;			/* Printer or class name */
+  char		*title;			/* Title/job name */
+  char		*user;			/* User the submitted the job */
+  char		*format;		/* Document format */
+  ipp_jstate_t	state;			/* Job state */
+  int		size;			/* Size in kilobytes */
+  int		priority;		/* Priority (1-100) */
+  time_t	completed_time;		/* Time the job was completed */
+  time_t	creation_time;		/* Time the job was created */
+  time_t	processing_time;	/* Time the job was processed */
+} cups_job_t;
+
+
+/*
+ * Functions...
+ */
+
+extern int		cupsCancelJob(const char *printer, int job);
+extern ipp_t		*cupsDoFileRequest(http_t *http, ipp_t *request,
+			                   const char *resource,
+					   const char *filename);
+extern ipp_t		*cupsDoRequest(http_t *http, ipp_t *request,
+			               const char *resource);
+extern http_encryption_t cupsEncryption(void);
+extern void		cupsFreeJobs(int num_jobs, cups_job_t *jobs);
+extern int		cupsGetClasses(char ***classes) _CUPS_DEPRECATED;
+extern const char	*cupsGetDefault(void);
+extern int		cupsGetJobs(cups_job_t **jobs, const char *dest,
+			            int myjobs, int completed);
+extern const char	*cupsGetPPD(const char *printer);
+extern int		cupsGetPrinters(char ***printers) _CUPS_DEPRECATED;
+extern ipp_status_t	cupsLastError(void);
+extern int		cupsPrintFile(const char *printer, const char *filename,
+			              const char *title, int num_options,
+				      cups_option_t *options);
+extern int		cupsPrintFiles(const char *printer, int num_files,
+			               const char **files, const char *title,
+				       int num_options, cups_option_t *options);
+extern char		*cupsTempFile(char *filename, int len) _CUPS_DEPRECATED;
+extern int		cupsTempFd(char *filename, int len);
+
+extern int		cupsAddDest(const char *name, const char *instance,
+			            int num_dests, cups_dest_t **dests);
+extern void		cupsFreeDests(int num_dests, cups_dest_t *dests);
+extern cups_dest_t	*cupsGetDest(const char *name, const char *instance,
+			             int num_dests, cups_dest_t *dests);
+extern int		cupsGetDests(cups_dest_t **dests);
+extern void		cupsSetDests(int num_dests, cups_dest_t *dests);
+
+extern int		cupsAddOption(const char *name, const char *value,
+			              int num_options, cups_option_t **options);
+extern void		cupsEncodeOptions(ipp_t *ipp, int num_options,
+					  cups_option_t *options);
+extern void		cupsFreeOptions(int num_options, cups_option_t *options);
+extern const char	*cupsGetOption(const char *name, int num_options,
+			               cups_option_t *options);
+extern int		cupsMarkOptions(ppd_file_t *ppd, int num_options,
+			                cups_option_t *options);
+extern int		cupsParseOptions(const char *arg, int num_options,
+			                 cups_option_t **options);
+
+extern const char	*cupsGetPassword(const char *prompt);
+extern const char	*cupsServer(void);
+extern void		cupsSetEncryption(http_encryption_t e);
+extern void		cupsSetPasswordCB(cups_password_cb_t cb);
+extern void		cupsSetServer(const char *server);
+extern void		cupsSetUser(const char *user);
+extern const char	*cupsUser(void);
+
+/**** New in CUPS 1.1.20 ****/
+extern int		cupsDoAuthentication(http_t *http, const char *method,
+			                     const char *resource);
+extern http_status_t	cupsGetFile(http_t *http, const char *resource,
+			            const char *filename);
+extern http_status_t	cupsGetFd(http_t *http, const char *resource, int fd);
+extern http_status_t	cupsPutFile(http_t *http, const char *resource,
+			            const char *filename);
+extern http_status_t	cupsPutFd(http_t *http, const char *resource, int fd);
+
+/**** New in CUPS 1.1.21 ****/
+extern const char	*cupsGetDefault2(http_t *http);
+extern int		cupsGetDests2(http_t *http, cups_dest_t **dests);
+extern int		cupsGetJobs2(http_t *http, cups_job_t **jobs,
+			             const char *dest, int myjobs,
+				     int completed);
+extern const char	*cupsGetPPD2(http_t *http, const char *printer);
+extern int		cupsPrintFile2(http_t *http, const char *printer,
+			               const char *filename,
+				       const char *title, int num_options,
+				       cups_option_t *options);
+extern int		cupsPrintFiles2(http_t *http, const char *printer,
+			                int num_files, const char **files,
+					const char *title, int num_options,
+					cups_option_t *options);
+extern int		cupsSetDests2(http_t *http, int num_dests,
+			              cups_dest_t *dests);
+
+/**** New in CUPS 1.2 ****/
+extern ssize_t		cupsBackChannelRead(char *buffer, size_t bytes,
+			                    double timeout);
+extern ssize_t		cupsBackChannelWrite(const char *buffer, size_t bytes,
+			                     double timeout);
+extern void		cupsEncodeOptions2(ipp_t *ipp, int num_options,
+					   cups_option_t *options,
+					   ipp_tag_t group_tag);
+extern const char	*cupsLastErrorString(void);
+extern char		*cupsNotifySubject(cups_lang_t *lang, ipp_t *event);
+extern char		*cupsNotifyText(cups_lang_t *lang, ipp_t *event);
+extern int		cupsRemoveOption(const char *name, int num_options,
+			                 cups_option_t **options);
+extern cups_file_t	*cupsTempFile2(char *filename, int len);
+
+/**** New in CUPS 1.3 ****/
+extern ipp_t		*cupsDoIORequest(http_t *http, ipp_t *request,
+			                 const char *resource, int infile,
+					 int outfile);
+extern char		*cupsGetServerPPD(http_t *http, const char *name);
+extern int		cupsRemoveDest(const char *name,
+			               const char *instance,
+				       int num_dests, cups_dest_t **dests);
+extern void		cupsSetDefaultDest(const char *name,
+			                   const char *instance,
+					   int num_dests,
+					   cups_dest_t *dests);
+
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+
+#endif /* !_CUPS_CUPS_H_ */
+
+/*
+ * End of "$Id: cups.h 6981 2007-09-19 21:51:55Z mike $".
+ */
Index: files/cups/file.h
===================================================================
RCS file: files/cups/file.h
diff -N files/cups/file.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/file.h	11 Jul 2007 21:46:42 -0000
@@ -0,0 +1,104 @@
+/*
+ * "$Id: file.h 6649 2007-07-11 21:46:42Z mike $"
+ *
+ *   Public file definitions for the Common UNIX Printing System (CUPS).
+ *
+ *   Since stdio files max out at 256 files on many systems, we have to
+ *   write similar functions without this limit.  At the same time, using
+ *   our own file functions allows us to provide transparent support of
+ *   gzip'd print files, PPD files, etc.
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ */
+
+#ifndef _CUPS_FILE_H_
+#  define _CUPS_FILE_H_
+
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <sys/types.h>
+#  if defined(WIN32) && !defined(__CUPS_SSIZE_T_DEFINED)
+#    define __CUPS_SSIZE_T_DEFINED
+/* Windows does not support the ssize_t type, so map it to off_t... */
+typedef off_t ssize_t;			/* @private@ */
+#  endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * CUPS file definitions...
+ */
+
+#  define CUPS_FILE_NONE	0	/* No compression */
+#  define CUPS_FILE_GZIP	1	/* GZIP compression */
+
+
+/*
+ * Types and structures...
+ */
+
+typedef struct _cups_file_s cups_file_t;/**** CUPS file type ****/
+
+
+/*
+ * Prototypes...
+ */
+
+extern int		cupsFileClose(cups_file_t *fp);
+extern int		cupsFileCompression(cups_file_t *fp);
+extern int		cupsFileEOF(cups_file_t *fp);
+extern const char	*cupsFileFind(const char *filename, const char *path,
+			              int executable, char *buffer,
+				      int bufsize);
+extern int		cupsFileFlush(cups_file_t *fp);
+extern int		cupsFileGetChar(cups_file_t *fp);
+extern char		*cupsFileGetConf(cups_file_t *fp, char *buf, size_t buflen,
+			                 char **value, int *linenum);
+extern size_t		cupsFileGetLine(cups_file_t *fp, char *buf,
+			                size_t buflen);
+extern char		*cupsFileGets(cups_file_t *fp, char *buf, size_t buflen);
+extern int		cupsFileLock(cups_file_t *fp, int block);
+extern int		cupsFileNumber(cups_file_t *fp);
+extern cups_file_t	*cupsFileOpen(const char *filename, const char *mode);
+extern cups_file_t	*cupsFileOpenFd(int fd, const char *mode);
+extern int		cupsFilePeekChar(cups_file_t *fp);
+extern int		cupsFilePrintf(cups_file_t *fp, const char *format, ...);
+extern int		cupsFilePutChar(cups_file_t *fp, int c);
+extern int		cupsFilePuts(cups_file_t *fp, const char *s);
+extern ssize_t		cupsFileRead(cups_file_t *fp, char *buf, size_t bytes);
+extern off_t		cupsFileRewind(cups_file_t *fp);
+extern off_t		cupsFileSeek(cups_file_t *fp, off_t pos);
+extern cups_file_t	*cupsFileStderr(void);
+extern cups_file_t	*cupsFileStdin(void);
+extern cups_file_t	*cupsFileStdout(void);
+extern off_t		cupsFileTell(cups_file_t *fp);
+extern int		cupsFileUnlock(cups_file_t *fp);
+extern ssize_t		cupsFileWrite(cups_file_t *fp, const char *buf, size_t bytes);
+
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_FILE_H_ */
+
+/*
+ * End of "$Id: file.h 6649 2007-07-11 21:46:42Z mike $".
+ */
Index: files/cups/http.h
===================================================================
RCS file: files/cups/http.h
diff -N files/cups/http.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/http.h	25 Jul 2007 17:19:09 -0000
@@ -0,0 +1,461 @@
+/*
+ * "$Id: http.h 6722 2007-07-25 17:19:09Z mike $"
+ *
+ *   Hyper-Text Transport Protocol definitions for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_HTTP_H_
+#  define _CUPS_HTTP_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <string.h>
+#  include <time.h>
+#  include <sys/types.h>
+#  ifdef WIN32
+#    ifndef __CUPS_SSIZE_T_DEFINED
+#      define __CUPS_SSIZE_T_DEFINED
+/* Windows does not support the ssize_t type, so map it to off_t... */
+typedef off_t ssize_t;			/* @private@ */
+#    endif /* !__CUPS_SSIZE_T_DEFINED */
+#    include <winsock2.h>
+#    include <ws2tcpip.h>
+#  else
+#    ifdef __sgi
+#      define INET6			/* IRIX IPv6 support... */
+#    endif /* __sgi */
+#    include <unistd.h>
+#    include <sys/time.h>
+#    include <sys/socket.h>
+#    include <netdb.h>
+#    include <netinet/in.h>
+#    include <arpa/inet.h>
+#    include <netinet/in_systm.h>
+#    include <netinet/ip.h>
+#    if !defined(__APPLE__) || !defined(TCP_NODELAY)
+#      include <netinet/tcp.h>
+#    endif /* !__APPLE__ || !TCP_NODELAY */
+#    if defined(AF_UNIX) && !defined(AF_LOCAL)
+#      define AF_LOCAL AF_UNIX		/* Older UNIX's have old names... */
+#    endif /* AF_UNIX && !AF_LOCAL */
+#    ifdef AF_LOCAL
+#      include <sys/un.h>
+#    endif /* AF_LOCAL */
+#    if defined(LOCAL_PEERCRED) && !defined(SO_PEERCRED)
+#      define SO_PEERCRED LOCAL_PEERCRED
+#    endif /* LOCAL_PEERCRED && !SO_PEERCRED */
+#  endif /* WIN32 */
+
+/*
+ * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get
+ * a warning at compile-time.
+ */
+
+#  if defined(__GNUC__) && __GNUC__ > 2
+#    define _HTTP_DEPRECATED __attribute__ ((__deprecated__))
+#  else
+#    define _HTTP_DEPRECATED
+#  endif /* __GNUC__ && __GNUC__ > 2 */
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * Oh, the wonderful world of IPv6 compatibility.  Apparently some
+ * implementations expose the (more logical) 32-bit address parts
+ * to everyone, while others only expose it to kernel code...  To
+ * make supporting IPv6 even easier, each vendor chose different
+ * core structure and union names, so the same defines or code
+ * can't be used on all platforms.
+ *
+ * The following will likely need tweaking on new platforms that
+ * support IPv6 - the "s6_addr32" define maps to the 32-bit integer
+ * array in the in6_addr union, which is named differently on various
+ * platforms.
+ */
+
+#if defined(AF_INET6) && !defined(s6_addr32)
+#  if defined(__sun)
+#    define s6_addr32	_S6_un._S6_u32
+#  elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
+#    define s6_addr32	__u6_addr.__u6_addr32
+#  elif defined(__osf__)
+#    define s6_addr32	s6_un.sa6_laddr
+#  elif defined(WIN32)
+/*
+ * Windows only defines byte and 16-bit word members of the union and
+ * requires special casing of all raw address code...
+ */
+#    define s6_addr32	error_need_win32_specific_code
+#  endif /* __sun */
+#endif /* AF_INET6 && !s6_addr32 */
+
+
+/*
+ * Limits...
+ */
+
+#  define HTTP_MAX_URI		1024	/* Max length of URI string */
+#  define HTTP_MAX_HOST		256	/* Max length of hostname string */
+#  define HTTP_MAX_BUFFER	2048	/* Max length of data buffer */
+#  define HTTP_MAX_VALUE	256	/* Max header field value length */
+
+
+/*
+ * Types and structures...
+ */
+
+typedef enum http_auth_e		/**** HTTP authentication types ****/
+{
+  HTTP_AUTH_NONE,			/* No authentication in use */
+  HTTP_AUTH_BASIC,			/* Basic authentication in use */
+  HTTP_AUTH_MD5,			/* Digest authentication in use */
+  HTTP_AUTH_MD5_SESS,			/* MD5-session authentication in use */
+  HTTP_AUTH_MD5_INT,			/* Digest authentication in use for body */
+  HTTP_AUTH_MD5_SESS_INT,		/* MD5-session authentication in use for body */
+  HTTP_AUTH_NEGOTIATE			/* GSSAPI authentication in use @since CUPS 1.3@ */
+} http_auth_t;
+
+typedef enum http_encoding_e		/**** HTTP transfer encoding values ****/
+{
+  HTTP_ENCODE_LENGTH,			/* Data is sent with Content-Length */
+  HTTP_ENCODE_CHUNKED,			/* Data is chunked */
+  HTTP_ENCODE_FIELDS			/* Sending HTTP fields */
+} http_encoding_t;
+
+typedef enum http_encryption_e		/**** HTTP encryption values ****/
+{
+  HTTP_ENCRYPT_IF_REQUESTED,		/* Encrypt if requested (TLS upgrade) */
+  HTTP_ENCRYPT_NEVER,			/* Never encrypt */
+  HTTP_ENCRYPT_REQUIRED,		/* Encryption is required (TLS upgrade) */
+  HTTP_ENCRYPT_ALWAYS			/* Always encrypt (SSL) */
+} http_encryption_t;
+
+typedef enum http_field_e		/**** HTTP field names ****/
+{
+  HTTP_FIELD_UNKNOWN = -1,		/* Unknown field */
+  HTTP_FIELD_ACCEPT_LANGUAGE,		/* Accept-Language field */
+  HTTP_FIELD_ACCEPT_RANGES,		/* Accept-Ranges field */
+  HTTP_FIELD_AUTHORIZATION,		/* Authorization field */
+  HTTP_FIELD_CONNECTION,		/* Connection field */
+  HTTP_FIELD_CONTENT_ENCODING,		/* Content-Encoding field */
+  HTTP_FIELD_CONTENT_LANGUAGE,		/* Content-Language field */
+  HTTP_FIELD_CONTENT_LENGTH,		/* Content-Length field */
+  HTTP_FIELD_CONTENT_LOCATION,		/* Content-Location field */
+  HTTP_FIELD_CONTENT_MD5,		/* Content-MD5 field */
+  HTTP_FIELD_CONTENT_RANGE,		/* Content-Range field */
+  HTTP_FIELD_CONTENT_TYPE,		/* Content-Type field */
+  HTTP_FIELD_CONTENT_VERSION,		/* Content-Version field */
+  HTTP_FIELD_DATE,			/* Date field */
+  HTTP_FIELD_HOST,			/* Host field */
+  HTTP_FIELD_IF_MODIFIED_SINCE,		/* If-Modified-Since field */
+  HTTP_FIELD_IF_UNMODIFIED_SINCE,	/* If-Unmodified-Since field */
+  HTTP_FIELD_KEEP_ALIVE,		/* Keep-Alive field */
+  HTTP_FIELD_LAST_MODIFIED,		/* Last-Modified field */
+  HTTP_FIELD_LINK,			/* Link field */
+  HTTP_FIELD_LOCATION,			/* Location field */
+  HTTP_FIELD_RANGE,			/* Range field */
+  HTTP_FIELD_REFERER,			/* Referer field */
+  HTTP_FIELD_RETRY_AFTER,		/* Retry-After field */
+  HTTP_FIELD_TRANSFER_ENCODING,		/* Transfer-Encoding field */
+  HTTP_FIELD_UPGRADE,			/* Upgrade field */
+  HTTP_FIELD_USER_AGENT,		/* User-Agent field */
+  HTTP_FIELD_WWW_AUTHENTICATE,		/* WWW-Authenticate field */
+  HTTP_FIELD_MAX			/* Maximum field index */
+} http_field_t;
+
+typedef enum http_keepalive_e		/**** HTTP keep-alive values ****/
+{
+  HTTP_KEEPALIVE_OFF = 0,		/* No keep alive support */
+  HTTP_KEEPALIVE_ON			/* Use keep alive */
+} http_keepalive_t;
+
+typedef enum http_state_e		/**** HTTP state values; states
+					 **** are server-oriented...
+					 ****/
+{
+  HTTP_WAITING,				/* Waiting for command */
+  HTTP_OPTIONS,				/* OPTIONS command, waiting for blank line */
+  HTTP_GET,				/* GET command, waiting for blank line */
+  HTTP_GET_SEND,			/* GET command, sending data */
+  HTTP_HEAD,				/* HEAD command, waiting for blank line */
+  HTTP_POST,				/* POST command, waiting for blank line */
+  HTTP_POST_RECV,			/* POST command, receiving data */
+  HTTP_POST_SEND,			/* POST command, sending data */
+  HTTP_PUT,				/* PUT command, waiting for blank line */
+  HTTP_PUT_RECV,			/* PUT command, receiving data */
+  HTTP_DELETE,				/* DELETE command, waiting for blank line */
+  HTTP_TRACE,				/* TRACE command, waiting for blank line */
+  HTTP_CLOSE,				/* CLOSE command, waiting for blank line */
+  HTTP_STATUS				/* Command complete, sending status */
+} http_state_t;
+
+typedef enum http_status_e		/**** HTTP status codes ****/
+{
+  HTTP_ERROR = -1,			/* An error response from httpXxxx() */
+
+  HTTP_CONTINUE = 100,			/* Everything OK, keep going... */
+  HTTP_SWITCHING_PROTOCOLS,		/* HTTP upgrade to TLS/SSL */
+
+  HTTP_OK = 200,			/* OPTIONS/GET/HEAD/POST/TRACE command was successful */
+  HTTP_CREATED,				/* PUT command was successful */
+  HTTP_ACCEPTED,			/* DELETE command was successful */
+  HTTP_NOT_AUTHORITATIVE,		/* Information isn't authoritative */
+  HTTP_NO_CONTENT,			/* Successful command, no new data */
+  HTTP_RESET_CONTENT,			/* Content was reset/recreated */
+  HTTP_PARTIAL_CONTENT,			/* Only a partial file was recieved/sent */
+
+  HTTP_MULTIPLE_CHOICES = 300,		/* Multiple files match request */
+  HTTP_MOVED_PERMANENTLY,		/* Document has moved permanently */
+  HTTP_MOVED_TEMPORARILY,		/* Document has moved temporarily */
+  HTTP_SEE_OTHER,			/* See this other link... */
+  HTTP_NOT_MODIFIED,			/* File not modified */
+  HTTP_USE_PROXY,			/* Must use a proxy to access this URI */
+
+  HTTP_BAD_REQUEST = 400,		/* Bad request */
+  HTTP_UNAUTHORIZED,			/* Unauthorized to access host */
+  HTTP_PAYMENT_REQUIRED,		/* Payment required */
+  HTTP_FORBIDDEN,			/* Forbidden to access this URI */
+  HTTP_NOT_FOUND,			/* URI was not found */
+  HTTP_METHOD_NOT_ALLOWED,		/* Method is not allowed */
+  HTTP_NOT_ACCEPTABLE,			/* Not Acceptable */
+  HTTP_PROXY_AUTHENTICATION,		/* Proxy Authentication is Required */
+  HTTP_REQUEST_TIMEOUT,			/* Request timed out */
+  HTTP_CONFLICT,			/* Request is self-conflicting */
+  HTTP_GONE,				/* Server has gone away */
+  HTTP_LENGTH_REQUIRED,			/* A content length or encoding is required */
+  HTTP_PRECONDITION,			/* Precondition failed */
+  HTTP_REQUEST_TOO_LARGE,		/* Request entity too large */
+  HTTP_URI_TOO_LONG,			/* URI too long */
+  HTTP_UNSUPPORTED_MEDIATYPE,		/* The requested media type is unsupported */
+  HTTP_REQUESTED_RANGE,			/* The requested range is not satisfiable */
+  HTTP_EXPECTATION_FAILED,		/* The expectation given in an Expect header field was not met */
+  HTTP_UPGRADE_REQUIRED = 426,		/* Upgrade to SSL/TLS required */
+
+  HTTP_SERVER_ERROR = 500,		/* Internal server error */
+  HTTP_NOT_IMPLEMENTED,			/* Feature not implemented */
+  HTTP_BAD_GATEWAY,			/* Bad gateway */
+  HTTP_SERVICE_UNAVAILABLE,		/* Service is unavailable */
+  HTTP_GATEWAY_TIMEOUT,			/* Gateway connection timed out */
+  HTTP_NOT_SUPPORTED			/* HTTP version not supported */
+} http_status_t;
+
+typedef enum http_uri_status_e		/**** URI separation status @since CUPS1.2@ ****/
+{
+  HTTP_URI_OVERFLOW = -8,		/* URI buffer for httpAssembleURI is too small */
+  HTTP_URI_BAD_ARGUMENTS = -7,		/* Bad arguments to function (error) */
+  HTTP_URI_BAD_RESOURCE = -6,		/* Bad resource in URI (error) */
+  HTTP_URI_BAD_PORT = -5,		/* Bad port number in URI (error) */
+  HTTP_URI_BAD_HOSTNAME = -4,		/* Bad hostname in URI (error) */
+  HTTP_URI_BAD_USERNAME = -3,		/* Bad username in URI (error) */
+  HTTP_URI_BAD_SCHEME = -2,		/* Bad scheme in URI (error) */
+  HTTP_URI_BAD_URI = -1,		/* Bad/empty URI (error) */
+  HTTP_URI_OK = 0,			/* URI decoded OK */
+  HTTP_URI_MISSING_SCHEME,		/* Missing scheme in URI (warning) */
+  HTTP_URI_UNKNOWN_SCHEME,		/* Unknown scheme in URI (warning) */
+  HTTP_URI_MISSING_RESOURCE		/* Missing resource in URI (warning) */
+} http_uri_status_t;
+
+typedef enum http_uri_coding_e		/**** URI en/decode flags ****/
+{
+  HTTP_URI_CODING_NONE = 0,		/* Don't en/decode anything */
+  HTTP_URI_CODING_USERNAME = 1,		/* En/decode the username portion */
+  HTTP_URI_CODING_HOSTNAME = 2,		/* En/decode the hostname portion */
+  HTTP_URI_CODING_RESOURCE = 4,		/* En/decode the resource portion */
+  HTTP_URI_CODING_MOST = 7,		/* En/decode all but the query */
+  HTTP_URI_CODING_QUERY = 8,		/* En/decode the query portion */
+  HTTP_URI_CODING_ALL = 15		/* En/decode everything */
+} http_uri_coding_t;
+
+typedef enum http_version_e		/**** HTTP version numbers ****/
+{
+  HTTP_0_9 = 9,				/* HTTP/0.9 */
+  HTTP_1_0 = 100,			/* HTTP/1.0 */
+  HTTP_1_1 = 101			/* HTTP/1.1 */
+} http_version_t;
+
+typedef union _http_addr_u		/**** Socket address union, which
+					 **** makes using IPv6 and other
+					 **** address types easier and
+					 **** more portable. @since CUPS 1.2@
+					 ****/
+{
+  struct sockaddr	addr;		/* Base structure for family value */
+  struct sockaddr_in	ipv4;		/* IPv4 address */
+#ifdef AF_INET6
+  struct sockaddr_in6	ipv6;		/* IPv6 address */
+#endif /* AF_INET6 */
+#ifdef AF_LOCAL
+  struct sockaddr_un	un;		/* Domain socket file */
+#endif /* AF_LOCAL */
+  char			pad[256];	/* Padding to ensure binary compatibility */
+} http_addr_t;
+
+typedef struct http_addrlist_s		/**** Socket address list, which is
+					 **** used to enumerate all of the
+					 **** addresses that are associated
+					 **** with a hostname. @since CUPS 1.2@
+					 ****/
+{
+  struct http_addrlist_s *next;		/* Pointer to next address in list */
+  http_addr_t		addr;		/* Address */
+} http_addrlist_t;
+
+typedef struct _http_s http_t;		/**** HTTP connection type ****/
+
+
+/*
+ * Prototypes...
+ */
+
+extern void		httpBlocking(http_t *http, int b);
+extern int		httpCheck(http_t *http);
+extern void		httpClearFields(http_t *http);
+extern void		httpClose(http_t *http);
+extern http_t		*httpConnect(const char *host, int port);
+extern http_t		*httpConnectEncrypt(const char *host, int port,
+			                    http_encryption_t encryption);
+extern int		httpDelete(http_t *http, const char *uri);
+extern int		httpEncryption(http_t *http, http_encryption_t e);
+extern int		httpError(http_t *http);
+extern void		httpFlush(http_t *http);
+extern int		httpGet(http_t *http, const char *uri);
+extern char		*httpGets(char *line, int length, http_t *http);
+extern const char	*httpGetDateString(time_t t);
+extern time_t		httpGetDateTime(const char *s);
+extern const char	*httpGetField(http_t *http, http_field_t field);
+extern struct hostent	*httpGetHostByName(const char *name);
+extern char		*httpGetSubField(http_t *http, http_field_t field,
+			                 const char *name, char *value);
+extern int		httpHead(http_t *http, const char *uri);
+extern void		httpInitialize(void);
+extern int		httpOptions(http_t *http, const char *uri);
+extern int		httpPost(http_t *http, const char *uri);
+extern int		httpPrintf(http_t *http, const char *format, ...)
+#  ifdef __GNUC__
+__attribute__ ((__format__ (__printf__, 2, 3)))
+#  endif /* __GNUC__ */
+;
+extern int		httpPut(http_t *http, const char *uri);
+extern int		httpRead(http_t *http, char *buffer, int length) _HTTP_DEPRECATED;
+extern int		httpReconnect(http_t *http);
+extern void		httpSeparate(const char *uri, char *method,
+			             char *username, char *host, int *port,
+				     char *resource) _HTTP_DEPRECATED;
+extern void		httpSetField(http_t *http, http_field_t field,
+			             const char *value);
+extern const char	*httpStatus(http_status_t status);
+extern int		httpTrace(http_t *http, const char *uri);
+extern http_status_t	httpUpdate(http_t *http);
+extern int		httpWrite(http_t *http, const char *buffer, int length) _HTTP_DEPRECATED;
+extern char		*httpEncode64(char *out, const char *in) _HTTP_DEPRECATED;
+extern char		*httpDecode64(char *out, const char *in) _HTTP_DEPRECATED;
+extern int		httpGetLength(http_t *http) _HTTP_DEPRECATED;
+extern char		*httpMD5(const char *, const char *, const char *,
+			         char [33]);
+extern char		*httpMD5Final(const char *, const char *, const char *,
+			              char [33]);
+extern char		*httpMD5String(const unsigned char *, char [33]);
+
+/**** New in CUPS 1.1.19 ****/
+extern void		httpClearCookie(http_t *http);
+extern const char	*httpGetCookie(http_t *http);
+extern void		httpSetCookie(http_t *http, const char *cookie);
+extern int		httpWait(http_t *http, int msec);
+
+/**** New in CUPS 1.1.21 ****/
+extern char		*httpDecode64_2(char *out, int *outlen, const char *in);
+extern char		*httpEncode64_2(char *out, int outlen, const char *in,
+			                int inlen);
+extern void		httpSeparate2(const char *uri,
+			              char *method, int methodlen,
+			              char *username, int usernamelen,
+				      char *host, int hostlen, int *port,
+				      char *resource, int resourcelen) _HTTP_DEPRECATED;
+
+/**** New in CUPS 1.2 ****/
+extern int		httpAddrAny(const http_addr_t *addr);
+extern http_addrlist_t	*httpAddrConnect(http_addrlist_t *addrlist, int *sock);
+extern int		httpAddrEqual(const http_addr_t *addr1,
+			              const http_addr_t *addr2);
+extern void		httpAddrFreeList(http_addrlist_t *addrlist);
+extern http_addrlist_t	*httpAddrGetList(const char *hostname, int family,
+			                 const char *service);
+extern int		httpAddrLength(const http_addr_t *addr);
+extern int		httpAddrLocalhost(const http_addr_t *addr);
+extern char		*httpAddrLookup(const http_addr_t *addr,
+                                        char *name, int namelen);
+extern char		*httpAddrString(const http_addr_t *addr,
+			                char *s, int slen);
+extern http_uri_status_t httpAssembleURI(http_uri_coding_t encoding,
+			                 char *uri, int urilen,
+			        	 const char *scheme,
+					 const char *username,
+					 const char *host, int port,
+					 const char *resource);
+extern http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding,
+			                  char *uri, int urilen,
+			        	  const char *scheme,
+					  const char *username,
+					  const char *host, int port,
+					  const char *resourcef, ...);
+extern int		httpFlushWrite(http_t *http);
+extern int		httpGetBlocking(http_t *http);
+extern const char	*httpGetDateString2(time_t t, char *s, int slen);
+extern int		httpGetFd(http_t *http);
+extern const char	*httpGetHostname(http_t *http, char *s, int slen);
+extern off_t		httpGetLength2(http_t *http);
+extern http_status_t	httpGetStatus(http_t *http);
+extern char		*httpGetSubField2(http_t *http, http_field_t field,
+			                  const char *name, char *value,
+					  int valuelen);
+extern ssize_t		httpRead2(http_t *http, char *buffer, size_t length);
+extern http_uri_status_t httpSeparateURI(http_uri_coding_t decoding,
+			                 const char *uri,
+			        	 char *scheme, int schemelen,
+			        	 char *username, int usernamelen,
+					 char *host, int hostlen, int *port,
+					 char *resource, int resourcelen);
+extern void		httpSetExpect(http_t *http, http_status_t expect);
+extern void		httpSetLength(http_t *http, size_t length);
+extern ssize_t		httpWrite2(http_t *http, const char *buffer,
+			           size_t length);
+
+/**** New in CUPS 1.3 ****/
+extern char		*httpGetAuthString(http_t *http);
+extern void		httpSetAuthString(http_t *http, const char *scheme,
+			                  const char *data);
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_HTTP_H_ */
+
+/*
+ * End of "$Id: http.h 6722 2007-07-25 17:19:09Z mike $".
+ */
Index: files/cups/ipp.h
===================================================================
RCS file: files/cups/ipp.h
diff -N files/cups/ipp.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/ipp.h	11 Jul 2007 21:46:42 -0000
@@ -0,0 +1,496 @@
+/*
+ * "$Id: ipp.h 6649 2007-07-11 21:46:42Z mike $"
+ *
+ *   Internet Printing Protocol definitions for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2006 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_IPP_H_
+#  define _CUPS_IPP_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include "http.h"
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * IPP version string...
+ */
+
+#  define IPP_VERSION		"\001\001"
+
+/*
+ * IPP registered port number...
+ *
+ * Note: Applications should never use IPP_PORT, but instead use the
+ * ippPort() function to allow overrides via the IPP_PORT environment
+ * variable and services file if needed!
+ */
+
+#  define IPP_PORT		631
+
+/*
+ * Common limits...
+ */
+
+#  define IPP_MAX_NAME		256
+#  define IPP_MAX_VALUES	8	/* Power-of-2 allocation increment */
+
+
+/*
+ * Types and structures...
+ */
+
+typedef enum ipp_tag_e			/**** Format tags for attributes... ****/
+{
+  IPP_TAG_ZERO = 0x00,			/* Zero tag - used for separators */
+  IPP_TAG_OPERATION,			/* Operation group */
+  IPP_TAG_JOB,				/* Job group */
+  IPP_TAG_END,				/* End-of-attributes */
+  IPP_TAG_PRINTER,			/* Printer group */
+  IPP_TAG_UNSUPPORTED_GROUP,		/* Unsupported attributes group */
+  IPP_TAG_SUBSCRIPTION,			/* Subscription group */
+  IPP_TAG_EVENT_NOTIFICATION,		/* Event group */
+  IPP_TAG_UNSUPPORTED_VALUE = 0x10,	/* Unsupported value */
+  IPP_TAG_DEFAULT,			/* Default value */
+  IPP_TAG_UNKNOWN,			/* Unknown value */
+  IPP_TAG_NOVALUE,			/* No-value value */
+  IPP_TAG_NOTSETTABLE = 0x15,		/* Not-settable value */
+  IPP_TAG_DELETEATTR,			/* Delete-attribute value */
+  IPP_TAG_ADMINDEFINE,			/* Admin-defined value */
+  IPP_TAG_INTEGER = 0x21,		/* Integer value */
+  IPP_TAG_BOOLEAN,			/* Boolean value */
+  IPP_TAG_ENUM,				/* Enumeration value */
+  IPP_TAG_STRING = 0x30,		/* Octet string value */
+  IPP_TAG_DATE,				/* Date/time value */
+  IPP_TAG_RESOLUTION,			/* Resolution value */
+  IPP_TAG_RANGE,			/* Range value */
+  IPP_TAG_BEGIN_COLLECTION,		/* Beginning of collection value */
+  IPP_TAG_TEXTLANG,			/* Text-with-language value */
+  IPP_TAG_NAMELANG,			/* Name-with-language value */
+  IPP_TAG_END_COLLECTION,		/* End of collection value */
+  IPP_TAG_TEXT = 0x41,			/* Text value */
+  IPP_TAG_NAME,				/* Name value */
+  IPP_TAG_KEYWORD = 0x44,		/* Keyword value */
+  IPP_TAG_URI,				/* URI value */
+  IPP_TAG_URISCHEME,			/* URI scheme value */
+  IPP_TAG_CHARSET,			/* Character set value */
+  IPP_TAG_LANGUAGE,			/* Language value */
+  IPP_TAG_MIMETYPE,			/* MIME media type value */
+  IPP_TAG_MEMBERNAME,			/* Collection member name value */
+  IPP_TAG_MASK = 0x7fffffff,		/* Mask for copied attribute values */
+  IPP_TAG_COPY = -0x7fffffff-1		/* Bitflag for copied attribute values */
+} ipp_tag_t;
+
+typedef enum ipp_res_e			/**** Resolution units... ****/
+{
+  IPP_RES_PER_INCH = 3,			/* Pixels per inch */
+  IPP_RES_PER_CM			/* Pixels per centimeter */
+} ipp_res_t;
+
+typedef enum ipp_finish_e		/**** Finishings... ****/
+{
+  IPP_FINISHINGS_NONE = 3,		/* No finishing */
+  IPP_FINISHINGS_STAPLE,		/* Staple (any location) */
+  IPP_FINISHINGS_PUNCH,			/* Punch (any location/count) */
+  IPP_FINISHINGS_COVER,			/* Add cover */
+  IPP_FINISHINGS_BIND,			/* Bind */
+  IPP_FINISHINGS_SADDLE_STITCH,		/* Staple interior */
+  IPP_FINISHINGS_EDGE_STITCH,		/* Stitch along any side */
+  IPP_FINISHINGS_FOLD,			/* Fold (any type) */
+  IPP_FINISHINGS_TRIM,			/* Trim (any type) */
+  IPP_FINISHINGS_BALE,			/* Bale (any type) */
+  IPP_FINISHINGS_BOOKLET_MAKER,		/* Fold to make booklet */
+  IPP_FINISHINGS_JOB_OFFSET,		/* Offset for binding (any type) */
+  IPP_FINISHINGS_STAPLE_TOP_LEFT = 20,	/* Staple top left corner */
+  IPP_FINISHINGS_STAPLE_BOTTOM_LEFT,	/* Staple bottom left corner */
+  IPP_FINISHINGS_STAPLE_TOP_RIGHT,	/* Staple top right corner */
+  IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT,	/* Staple bottom right corner */
+  IPP_FINISHINGS_EDGE_STITCH_LEFT,	/* Stitch along left side */
+  IPP_FINISHINGS_EDGE_STITCH_TOP,	/* Stitch along top edge */
+  IPP_FINISHINGS_EDGE_STITCH_RIGHT,	/* Stitch along right side */
+  IPP_FINISHINGS_EDGE_STITCH_BOTTOM,	/* Stitch along bottom edge */
+  IPP_FINISHINGS_STAPLE_DUAL_LEFT,	/* Two staples on left */
+  IPP_FINISHINGS_STAPLE_DUAL_TOP,	/* Two staples on top */
+  IPP_FINISHINGS_STAPLE_DUAL_RIGHT,	/* Two staples on right */
+  IPP_FINISHINGS_STAPLE_DUAL_BOTTOM,	/* Two staples on bottom */
+  IPP_FINISHINGS_BIND_LEFT = 50,	/* Bind on left */
+  IPP_FINISHINGS_BIND_TOP,		/* Bind on top */
+  IPP_FINISHINGS_BIND_RIGHT,		/* Bind on right */
+  IPP_FINISHINGS_BIND_BOTTOM		/* Bind on bottom */
+} ipp_finish_t;
+
+typedef enum ipp_orient_e		/**** Orientation... ****/
+{
+  IPP_PORTRAIT = 3,			/* No rotation */
+  IPP_LANDSCAPE,			/* 90 degrees counter-clockwise */
+  IPP_REVERSE_LANDSCAPE,		/* 90 degrees clockwise */
+  IPP_REVERSE_PORTRAIT			/* 180 degrees */
+} ipp_orient_t;
+
+typedef enum ipp_quality_e		/**** Qualities... ****/
+{
+  IPP_QUALITY_DRAFT = 3,		/* Draft quality */
+  IPP_QUALITY_NORMAL,			/* Normal quality */
+  IPP_QUALITY_HIGH			/* High quality */
+} ipp_quality_t;
+
+typedef enum ipp_jstate_e		/**** Job States.... */
+{
+  IPP_JOB_PENDING = 3,			/* Job is waiting to be printed */
+  IPP_JOB_HELD,				/* Job is held for printing */
+  IPP_JOB_PROCESSING,			/* Job is currently printing */
+  IPP_JOB_STOPPED,			/* Job has been stopped */
+  IPP_JOB_CANCELED,			/* Job has been canceled */
+  IPP_JOB_ABORTED,			/* Job has aborted due to error */
+  IPP_JOB_COMPLETED			/* Job has completed successfully */
+} ipp_jstate_t;
+#define IPP_JOB_CANCELLED IPP_JOB_CANCELED
+
+typedef enum ipp_pstate_e		/**** Printer States.... */
+{
+  IPP_PRINTER_IDLE = 3,			/* Printer is idle */
+  IPP_PRINTER_PROCESSING,		/* Printer is working */
+  IPP_PRINTER_STOPPED			/* Printer is stopped */
+} ipp_pstate_t;
+
+typedef enum ipp_state_e		/**** IPP states... ****/
+{
+  IPP_ERROR = -1,			/* An error occurred */
+  IPP_IDLE,				/* Nothing is happening/request completed */
+  IPP_HEADER,				/* The request header needs to be sent/received */
+  IPP_ATTRIBUTE,			/* One or more attributes need to be sent/received */
+  IPP_DATA				/* IPP request data needs to be sent/received */
+} ipp_state_t;
+
+typedef enum ipp_op_e			/**** IPP operations... ****/
+{
+  IPP_PRINT_JOB = 0x0002,		/* Print a single file */
+  IPP_PRINT_URI,			/* Print a single URL @private@ */
+  IPP_VALIDATE_JOB,			/* Validate job options */
+  IPP_CREATE_JOB,			/* Create an empty print job */
+  IPP_SEND_DOCUMENT,			/* Add a file to a job */
+  IPP_SEND_URI,				/* Add a URL to a job @private@ */
+  IPP_CANCEL_JOB,			/* Cancel a job */
+  IPP_GET_JOB_ATTRIBUTES,		/* Get job attributes */
+  IPP_GET_JOBS,				/* Get a list of jobs */
+  IPP_GET_PRINTER_ATTRIBUTES,		/* Get printer attributes */
+  IPP_HOLD_JOB,				/* Hold a job for printing */
+  IPP_RELEASE_JOB,			/* Release a job for printing */
+  IPP_RESTART_JOB,			/* Reprint a job */
+  IPP_PAUSE_PRINTER = 0x0010,		/* Stop a printer */
+  IPP_RESUME_PRINTER,			/* Start a printer */
+  IPP_PURGE_JOBS,			/* Cancel all jobs */
+  IPP_SET_PRINTER_ATTRIBUTES,		/* Set printer attributes @private@ */
+  IPP_SET_JOB_ATTRIBUTES,		/* Set job attributes */
+  IPP_GET_PRINTER_SUPPORTED_VALUES,	/* Get supported attribute values */
+  IPP_CREATE_PRINTER_SUBSCRIPTION,	/* Create a printer subscription @since CUPS 1.2@ */
+  IPP_CREATE_JOB_SUBSCRIPTION,		/* Create a job subscription @since CUPS 1.2@ */
+  IPP_GET_SUBSCRIPTION_ATTRIBUTES,	/* Get subscription attributes @since CUPS 1.2@ */
+  IPP_GET_SUBSCRIPTIONS,		/* Get list of subscriptions @since CUPS 1.2@ */
+  IPP_RENEW_SUBSCRIPTION,		/* Renew a printer subscription @since CUPS 1.2@ */
+  IPP_CANCEL_SUBSCRIPTION,		/* Cancel a subscription @since CUPS 1.2@ */
+  IPP_GET_NOTIFICATIONS,		/* Get notification events @since CUPS 1.2@ */
+  IPP_SEND_NOTIFICATIONS,		/* Send notification events @private@ */
+  IPP_GET_PRINT_SUPPORT_FILES = 0x0021,	/* Get printer support files @private@ */
+  IPP_ENABLE_PRINTER,			/* Start a printer */
+  IPP_DISABLE_PRINTER,			/* Stop a printer */
+  IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB,	/* Stop printer after the current job @private@ */
+  IPP_HOLD_NEW_JOBS,			/* Hold new jobs @private@ */
+  IPP_RELEASE_HELD_NEW_JOBS,		/* Release new jobs @private@ */
+  IPP_DEACTIVATE_PRINTER,		/* Stop a printer @private@ */
+  IPP_ACTIVATE_PRINTER,			/* Start a printer @private@ */
+  IPP_RESTART_PRINTER,			/* Restart a printer @private@ */
+  IPP_SHUTDOWN_PRINTER,			/* Turn a printer off @private@ */
+  IPP_STARTUP_PRINTER,			/* Turn a printer on @private@ */
+  IPP_REPROCESS_JOB,			/* Reprint a job @private@ */
+  IPP_CANCEL_CURRENT_JOB,		/* Cancel the current job @private@ */
+  IPP_SUSPEND_CURRENT_JOB,		/* Suspend the current job @private@ */
+  IPP_RESUME_JOB,			/* Resume the current job @private@ */
+  IPP_PROMOTE_JOB,			/* Promote a job to print sooner @private@ */
+  IPP_SCHEDULE_JOB_AFTER,		/* Schedule a job to print after another @private@ */
+  IPP_PRIVATE = 0x4000,			/* Reserved @private@ */
+  CUPS_GET_DEFAULT,			/* Get the default printer */
+  CUPS_GET_PRINTERS,			/* Get a list of printers and/or classes */
+  CUPS_ADD_MODIFY_PRINTER,		/* Add or modify a printer */
+  CUPS_DELETE_PRINTER,			/* Delete a printer */
+  CUPS_GET_CLASSES,			/* Get a list of classes @deprecated@ */
+  CUPS_ADD_MODIFY_CLASS,		/* Add or modify a class */
+  CUPS_DELETE_CLASS,			/* Delete a class */
+  CUPS_ACCEPT_JOBS,			/* Accept new jobs on a printer */
+  CUPS_REJECT_JOBS,			/* Reject new jobs on a printer */
+  CUPS_SET_DEFAULT,			/* Set the default printer */
+  CUPS_GET_DEVICES,			/* Get a list of supported devices */
+  CUPS_GET_PPDS,			/* Get a list of supported drivers */
+  CUPS_MOVE_JOB,			/* Move a job to a different printer */
+  CUPS_AUTHENTICATE_JOB,		/* Authenticate a job @since CUPS 1.2@ */
+  CUPS_GET_PPD				/* Get a PPD file @since CUPS 1.3@ */
+} ipp_op_t;
+
+/* Old names for the operations */
+#define CUPS_ADD_PRINTER	CUPS_ADD_MODIFY_PRINTER
+#define CUPS_ADD_CLASS		CUPS_ADD_MODIFY_CLASS
+
+typedef enum ipp_status_e		/**** IPP status codes... ****/
+{
+  IPP_OK = 0x0000,			/* successful-ok */
+  IPP_OK_SUBST,				/* successful-ok-ignored-or-substituted-attributes */
+  IPP_OK_CONFLICT,			/* successful-ok-conflicting-attributes */
+  IPP_OK_IGNORED_SUBSCRIPTIONS,		/* successful-ok-ignored-subscriptions */
+  IPP_OK_IGNORED_NOTIFICATIONS,		/* successful-ok-ignored-notifications */
+  IPP_OK_TOO_MANY_EVENTS,		/* successful-ok-too-many-events */
+  IPP_OK_BUT_CANCEL_SUBSCRIPTION,	/* successful-ok-but-cancel-subscription */
+  IPP_OK_EVENTS_COMPLETE,		/* successful-ok-events-complete */
+  IPP_REDIRECTION_OTHER_SITE = 0x200,	/*  */
+  CUPS_SEE_OTHER = 0x280,		/* cups-see-other */
+  IPP_BAD_REQUEST = 0x0400,		/* client-error-bad-request */
+  IPP_FORBIDDEN,			/* client-error-forbidden */
+  IPP_NOT_AUTHENTICATED,		/* client-error-not-authenticated */
+  IPP_NOT_AUTHORIZED,			/* client-error-not-authorized */
+  IPP_NOT_POSSIBLE,			/* client-error-not-possible */
+  IPP_TIMEOUT,				/* client-error-timeout */
+  IPP_NOT_FOUND,			/* client-error-not-found */
+  IPP_GONE,				/* client-error-gone */
+  IPP_REQUEST_ENTITY,			/* client-error-request-entity-too-large */
+  IPP_REQUEST_VALUE,			/* client-error-request-value-too-long */
+  IPP_DOCUMENT_FORMAT,			/* client-error-document-format-not-supported */
+  IPP_ATTRIBUTES,			/* client-error-attributes-or-values-not-supported */
+  IPP_URI_SCHEME,			/* client-error-uri-scheme-not-supported */
+  IPP_CHARSET,				/* client-error-charset-not-supported */
+  IPP_CONFLICT,				/* client-error-conflicting-attributes */
+  IPP_COMPRESSION_NOT_SUPPORTED,	/* client-error-compression-not-supported */
+  IPP_COMPRESSION_ERROR,		/* client-error-compression-error */
+  IPP_DOCUMENT_FORMAT_ERROR,		/* client-error-document-format-error */
+  IPP_DOCUMENT_ACCESS_ERROR,		/* client-error-document-access-error */
+  IPP_ATTRIBUTES_NOT_SETTABLE,		/* client-error-attributes-not-settable */
+  IPP_IGNORED_ALL_SUBSCRIPTIONS,	/* client-error-ignored-all-subscriptions */
+  IPP_TOO_MANY_SUBSCRIPTIONS,		/* client-error-too-many-subscriptions */
+  IPP_IGNORED_ALL_NOTIFICATIONS,	/* client-error-ignored-all-notifications */
+  IPP_PRINT_SUPPORT_FILE_NOT_FOUND,	/* client-error-print-support-file-not-found */
+
+  IPP_INTERNAL_ERROR = 0x0500,		/* server-error-internal-error */
+  IPP_OPERATION_NOT_SUPPORTED,		/* server-error-operation-not-supported */
+  IPP_SERVICE_UNAVAILABLE,		/* server-error-service-unavailable */
+  IPP_VERSION_NOT_SUPPORTED,		/* server-error-version-not-supported */
+  IPP_DEVICE_ERROR,			/* server-error-device-error */
+  IPP_TEMPORARY_ERROR,			/* server-error-temporary-error */
+  IPP_NOT_ACCEPTING,			/* server-error-not-accepting-jobs */
+  IPP_PRINTER_BUSY,			/* server-error-busy */
+  IPP_ERROR_JOB_CANCELED,		/* server-error-job-canceled */
+  IPP_MULTIPLE_JOBS_NOT_SUPPORTED,	/* server-error-multiple-document-jobs-not-supported */
+  IPP_PRINTER_IS_DEACTIVATED		/* server-error-printer-is-deactivated */
+} ipp_status_t;
+#define IPP_ERROR_JOB_CANCELLED IPP_ERROR_JOB_CANCELED
+
+typedef unsigned char ipp_uchar_t;	/**** Unsigned 8-bit integer/character ****/
+
+/**** New in CUPS 1.2 ****/
+typedef ssize_t	(*ipp_iocb_t)(void *, ipp_uchar_t *, size_t);
+					/**** IPP IO Callback Function @since CUPS 1.2@ ****/
+
+typedef union ipp_request_u		/**** Request Header ****/
+{
+  struct				/* Any Header */
+  {
+    ipp_uchar_t	version[2];		/* Protocol version number */
+    int		op_status;		/* Operation ID or status code*/
+    int		request_id;		/* Request ID */
+  }		any;
+
+  struct				/* Operation Header */
+  {
+    ipp_uchar_t	version[2];		/* Protocol version number */
+    ipp_op_t	operation_id;		/* Operation ID */
+    int		request_id;		/* Request ID */
+  }		op;
+
+  struct				/* Status Header */
+  {
+    ipp_uchar_t	version[2];		/* Protocol version number */
+    ipp_status_t status_code;		/* Status code */
+    int		request_id;		/* Request ID */
+  }		status;
+
+  /**** New in CUPS 1.1.19 ****/
+  struct				/* Event Header */
+  {
+    ipp_uchar_t	version[2];		/* Protocol version number */
+    ipp_status_t status_code;		/* Status code */
+    int		request_id;		/* Request ID */
+  }		event;
+} ipp_request_t;
+
+/**** New in CUPS 1.1.19 ****/
+typedef struct ipp_s ipp_t;
+
+typedef union ipp_value_u		/**** Attribute Value ****/
+{
+  int		integer;		/* Integer/enumerated value */
+
+  char		boolean;		/* Boolean value */
+
+  ipp_uchar_t	date[11];		/* Date/time value */
+
+  struct
+  {
+    int		xres,			/* Horizontal resolution */
+		yres;			/* Vertical resolution */
+    ipp_res_t	units;			/* Resolution units */
+  }		resolution;		/* Resolution value */
+
+  struct
+  {
+    int		lower,			/* Lower value */
+		upper;			/* Upper value */
+  }		range;			/* Range of integers value */
+
+  struct
+  {
+    char	*charset;		/* Character set */
+    char	*text;			/* String */
+  }		string;			/* String with language value */
+
+  struct
+  {
+    int		length;			/* Length of attribute */
+    void	*data;			/* Data in attribute */
+  }		unknown;		/* Unknown attribute type */
+
+/**** New in CUPS 1.1.19 ****/
+  ipp_t		*collection;		/* Collection value */
+} ipp_value_t;
+
+typedef struct ipp_attribute_s		/**** Attribute ****/
+{
+  struct ipp_attribute_s *next;		/* Next attribute in list */
+  ipp_tag_t	group_tag,		/* Job/Printer/Operation group tag */
+		value_tag;		/* What type of value is it? */
+  char		*name;			/* Name of attribute */
+  int		num_values;		/* Number of values */
+  ipp_value_t	values[1];		/* Values */
+} ipp_attribute_t;
+
+struct ipp_s				/**** IPP Request/Response/Notification ****/
+{
+  ipp_state_t	state;			/* State of request */
+  ipp_request_t	request;		/* Request header */
+  ipp_attribute_t *attrs;		/* Attributes */
+  ipp_attribute_t *last;		/* Last attribute in list */
+  ipp_attribute_t *current;		/* Current attribute (for read/write) */
+  ipp_tag_t	curtag;			/* Current attribute group tag */
+
+/**** New in CUPS 1.2 ****/
+  ipp_attribute_t *prev;		/* Previous attribute (for read) */
+};
+
+
+/*
+ * Prototypes...
+ */
+
+extern ipp_attribute_t	*ippAddBoolean(ipp_t *ipp, ipp_tag_t group,
+			               const char *name, char value);
+extern ipp_attribute_t	*ippAddBooleans(ipp_t *ipp, ipp_tag_t group,
+			                const char *name, int num_values,
+					const char *values);
+extern ipp_attribute_t	*ippAddDate(ipp_t *ipp, ipp_tag_t group,
+			            const char *name, const ipp_uchar_t *value);
+extern ipp_attribute_t	*ippAddInteger(ipp_t *ipp, ipp_tag_t group,
+			               ipp_tag_t type, const char *name,
+				       int value);
+extern ipp_attribute_t	*ippAddIntegers(ipp_t *ipp, ipp_tag_t group,
+			                ipp_tag_t type, const char *name,
+					int num_values, const int *values);
+extern ipp_attribute_t	*ippAddRange(ipp_t *ipp, ipp_tag_t group,
+			             const char *name, int lower, int upper);
+extern ipp_attribute_t	*ippAddRanges(ipp_t *ipp, ipp_tag_t group,
+			              const char *name, int num_values,
+				      const int *lower, const int *upper);
+extern ipp_attribute_t	*ippAddResolution(ipp_t *ipp, ipp_tag_t group,
+			                  const char *name, ipp_res_t units,
+					  int xres, int yres);
+extern ipp_attribute_t	*ippAddResolutions(ipp_t *ipp, ipp_tag_t group,
+			                   const char *name, int num_values,
+					   ipp_res_t units, const int *xres,
+					   const int *yres);
+extern ipp_attribute_t	*ippAddSeparator(ipp_t *ipp);
+extern ipp_attribute_t	*ippAddString(ipp_t *ipp, ipp_tag_t group,
+			              ipp_tag_t type, const char *name,
+				      const char *charset, const char *value);
+extern ipp_attribute_t	*ippAddStrings(ipp_t *ipp, ipp_tag_t group,
+			               ipp_tag_t type, const char *name,
+				       int num_values, const char *charset,
+				       const char * const *values);
+extern time_t		ippDateToTime(const ipp_uchar_t *date);
+extern void		ippDelete(ipp_t *ipp);
+extern const char	*ippErrorString(ipp_status_t error);
+extern ipp_attribute_t	*ippFindAttribute(ipp_t *ipp, const char *name,
+			                  ipp_tag_t type);
+extern ipp_attribute_t	*ippFindNextAttribute(ipp_t *ipp, const char *name,
+			                      ipp_tag_t type);
+extern size_t		ippLength(ipp_t *ipp);
+extern ipp_t		*ippNew(void);
+extern ipp_state_t	ippRead(http_t *http, ipp_t *ipp);
+extern const ipp_uchar_t *ippTimeToDate(time_t t);
+extern ipp_state_t	ippWrite(http_t *http, ipp_t *ipp);
+extern int		ippPort(void);
+extern void		ippSetPort(int p);
+
+/**** New in CUPS 1.1.19 ****/
+extern ipp_attribute_t	*ippAddCollection(ipp_t *ipp, ipp_tag_t group,
+			                  const char *name, ipp_t *value);
+extern ipp_attribute_t	*ippAddCollections(ipp_t *ipp, ipp_tag_t group,
+			                   const char *name, int num_values,
+					   const ipp_t **values);
+extern void		ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr);
+extern ipp_state_t	ippReadFile(int fd, ipp_t *ipp);
+extern ipp_state_t	ippWriteFile(int fd, ipp_t *ipp);
+
+/**** New in CUPS 1.2 ****/
+extern ipp_attribute_t	*ippAddOctetString(ipp_t *ipp, ipp_tag_t group,
+			                   const char *name,
+					   const void *data, int datalen);
+extern ipp_status_t	ippErrorValue(const char *name);
+extern ipp_t		*ippNewRequest(ipp_op_t op);
+extern const char	*ippOpString(ipp_op_t op);
+extern ipp_op_t		ippOpValue(const char *name);
+extern ipp_state_t	ippReadIO(void *src, ipp_iocb_t cb, int blocking,
+			          ipp_t *parent, ipp_t *ipp);
+extern ipp_state_t	ippWriteIO(void *dst, ipp_iocb_t cb, int blocking,
+			           ipp_t *parent, ipp_t *ipp);
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_IPP_H_ */
+
+/*
+ * End of "$Id: ipp.h 6649 2007-07-11 21:46:42Z mike $".
+ */
Index: files/cups/language.h
===================================================================
RCS file: files/cups/language.h
diff -N files/cups/language.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/language.h	11 Jul 2007 21:46:42 -0000
@@ -0,0 +1,114 @@
+/*
+ * "$Id: language.h 6649 2007-07-11 21:46:42Z mike $"
+ *
+ *   Multi-language support for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2006 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_LANGUAGE_H_
+#  define _CUPS_LANGUAGE_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <locale.h>
+#  include "array.h"
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * Types...
+ */
+
+typedef enum cups_encoding_e		/**** Language Encodings ****/
+{
+  CUPS_AUTO_ENCODING = -1,		/* Auto-detect the encoding @private@ */
+  CUPS_US_ASCII,			/* US ASCII */
+  CUPS_ISO8859_1,			/* ISO-8859-1 */
+  CUPS_ISO8859_2,			/* ISO-8859-2 */
+  CUPS_ISO8859_3,			/* ISO-8859-3 */
+  CUPS_ISO8859_4,			/* ISO-8859-4 */
+  CUPS_ISO8859_5,			/* ISO-8859-5 */
+  CUPS_ISO8859_6,			/* ISO-8859-6 */
+  CUPS_ISO8859_7,			/* ISO-8859-7 */
+  CUPS_ISO8859_8,			/* ISO-8859-8 */
+  CUPS_ISO8859_9,			/* ISO-8859-9 */
+  CUPS_ISO8859_10,			/* ISO-8859-10 */
+  CUPS_UTF8,				/* UTF-8 */
+  CUPS_ISO8859_13,			/* ISO-8859-13 */
+  CUPS_ISO8859_14,			/* ISO-8859-14 */
+  CUPS_ISO8859_15,			/* ISO-8859-15 */
+  CUPS_WINDOWS_874,			/* CP-874 */
+  CUPS_WINDOWS_1250,			/* CP-1250 */
+  CUPS_WINDOWS_1251,			/* CP-1251 */
+  CUPS_WINDOWS_1252,			/* CP-1252 */
+  CUPS_WINDOWS_1253,			/* CP-1253 */
+  CUPS_WINDOWS_1254,			/* CP-1254 */
+  CUPS_WINDOWS_1255,			/* CP-1255 */
+  CUPS_WINDOWS_1256,			/* CP-1256 */
+  CUPS_WINDOWS_1257,			/* CP-1257 */
+  CUPS_WINDOWS_1258,			/* CP-1258 */
+  CUPS_KOI8_R,				/* KOI-8-R */
+  CUPS_KOI8_U,				/* KOI-8-U */
+  CUPS_ISO8859_11,			/* ISO-8859-11 */
+  CUPS_ISO8859_16,			/* ISO-8859-16 */
+  CUPS_MAC_ROMAN,			/* MacRoman */
+  CUPS_ENCODING_SBCS_END = 63,		/* End of single-bybte encodings @private@ */
+
+  CUPS_WINDOWS_932,			/* Japanese JIS X0208-1990 */
+  CUPS_WINDOWS_936,			/* Simplified Chinese GB 2312-80 */
+  CUPS_WINDOWS_949,			/* Korean KS C5601-1992 */
+  CUPS_WINDOWS_950,			/* Traditional Chinese Big Five */
+  CUPS_WINDOWS_1361,			/* Korean Johab */
+  CUPS_ENCODING_DBCS_END = 127,		/* End of double-byte encodings @private@ */
+
+  CUPS_EUC_CN,				/* EUC Simplified Chinese */
+  CUPS_EUC_JP,				/* EUC Japanese */
+  CUPS_EUC_KR,				/* EUC Korean */
+  CUPS_EUC_TW,				/* EUC Traditional Chinese */
+  CUPS_ENCODING_VBCS_END = 191		/* End of variable-length encodings @private@ */
+} cups_encoding_t;
+
+typedef struct cups_lang_s		/**** Language Cache Structure ****/
+{
+  struct cups_lang_s	*next;		/* Next language in cache */
+  int			used;		/* Number of times this entry has been used. */
+  cups_encoding_t	encoding;	/* Text encoding */
+  char			language[16];	/* Language/locale name */
+  cups_array_t		*strings;	/* Message strings @private@ */
+} cups_lang_t;
+
+
+/*
+ * Prototypes...
+ */
+
+extern cups_lang_t	*cupsLangDefault(void);
+extern const char	*cupsLangEncoding(cups_lang_t *lang);
+extern void		cupsLangFlush(void);
+extern void		cupsLangFree(cups_lang_t *lang);
+extern cups_lang_t	*cupsLangGet(const char *language);
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+
+#endif /* !_CUPS_LANGUAGE_H_ */
+
+/*
+ * End of "$Id: language.h 6649 2007-07-11 21:46:42Z mike $".
+ */
Index: files/cups/ppd.h
===================================================================
RCS file: files/cups/ppd.h
diff -N files/cups/ppd.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/cups/ppd.h	11 Jul 2007 21:46:42 -0000
@@ -0,0 +1,409 @@
+/*
+ * "$Id: ppd.h 6649 2007-07-11 21:46:42Z mike $"
+ *
+ *   PostScript Printer Description definitions for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   Copyright 2007 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   PostScript is a trademark of Adobe Systems, Inc.
+ *
+ *   This code and any derivative of it may be used and distributed
+ *   freely under the terms of the GNU General Public License when
+ *   used with GNU Ghostscript or its derivatives.  Use of the code
+ *   (or any derivative of it) with software other than GNU
+ *   GhostScript (or its derivatives) is governed by the CUPS license
+ *   agreement.
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_PPD_H_
+#  define _CUPS_PPD_H_
+
+/*
+ * Include necessary headers...
+ */
+
+#  include <stdio.h>
+#  include "array.h"
+#  include "file.h"
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+
+/*
+ * PPD version...
+ */
+
+#  define PPD_VERSION	4.3		/* Kept in sync with Adobe version number */
+
+
+/*
+ * PPD size limits (defined in Adobe spec)
+ */
+
+#  define PPD_MAX_NAME	41		/* Maximum size of name + 1 for nul */
+#  define PPD_MAX_TEXT	81		/* Maximum size of text + 1 for nul */
+#  define PPD_MAX_LINE	256		/* Maximum size of line + 1 for nul */
+
+
+/*
+ * Types and structures...
+ */
+
+typedef enum ppd_ui_e			/**** UI Types ****/
+{
+  PPD_UI_BOOLEAN,			/* True or False option */
+  PPD_UI_PICKONE,			/* Pick one from a list */
+  PPD_UI_PICKMANY			/* Pick zero or more from a list */
+} ppd_ui_t;
+
+typedef enum ppd_section_e		/**** Order dependency sections ****/
+{
+  PPD_ORDER_ANY,			/* Option code can be anywhere in the file */
+  PPD_ORDER_DOCUMENT,			/* ... must be in the DocumentSetup section */
+  PPD_ORDER_EXIT,			/* ... must be sent prior to the document */
+  PPD_ORDER_JCL,			/* ... must be sent as a JCL command */
+  PPD_ORDER_PAGE,			/* ... must be in the PageSetup section */
+  PPD_ORDER_PROLOG			/* ... must be in the Prolog section */
+} ppd_section_t;
+
+typedef enum ppd_cs_e			/**** Colorspaces ****/
+{
+  PPD_CS_CMYK = -4,			/* CMYK colorspace */
+  PPD_CS_CMY,				/* CMY colorspace */
+  PPD_CS_GRAY = 1,			/* Grayscale colorspace */
+  PPD_CS_RGB = 3,			/* RGB colorspace */
+  PPD_CS_RGBK,				/* RGBK (K = gray) colorspace */
+  PPD_CS_N				/* DeviceN colorspace */
+} ppd_cs_t;
+
+typedef enum ppd_status_e		/**** Status Codes @since CUPS 1.1.19@ ****/
+{
+  PPD_OK = 0,				/* OK */
+  PPD_FILE_OPEN_ERROR,			/* Unable to open PPD file */
+  PPD_NULL_FILE,			/* NULL PPD file pointer */
+  PPD_ALLOC_ERROR,			/* Memory allocation error */
+  PPD_MISSING_PPDADOBE4,		/* Missing PPD-Adobe-4.x header */
+  PPD_MISSING_VALUE,			/* Missing value string */
+  PPD_INTERNAL_ERROR,			/* Internal error */
+  PPD_BAD_OPEN_GROUP,			/* Bad OpenGroup */
+  PPD_NESTED_OPEN_GROUP,		/* OpenGroup without a CloseGroup first */
+  PPD_BAD_OPEN_UI,			/* Bad OpenUI/JCLOpenUI */
+  PPD_NESTED_OPEN_UI,			/* OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first */
+  PPD_BAD_ORDER_DEPENDENCY,		/* Bad OrderDependency */
+  PPD_BAD_UI_CONSTRAINTS,		/* Bad UIConstraints */
+  PPD_MISSING_ASTERISK,			/* Missing asterisk in column 0 */
+  PPD_LINE_TOO_LONG,			/* Line longer than 255 chars */
+  PPD_ILLEGAL_CHARACTER,		/* Illegal control character */
+  PPD_ILLEGAL_MAIN_KEYWORD,		/* Illegal main keyword string */
+  PPD_ILLEGAL_OPTION_KEYWORD,		/* Illegal option keyword string */
+  PPD_ILLEGAL_TRANSLATION,		/* Illegal translation string */
+  PPD_ILLEGAL_WHITESPACE,		/* Illegal whitespace character */
+  PPD_BAD_CUSTOM_PARAM			/* Bad custom parameter */
+} ppd_status_t;
+
+typedef enum ppd_conform_e		/**** Conformance Levels @since CUPS 1.1.19@ ****/
+{
+  PPD_CONFORM_RELAXED,			/* Relax whitespace and control char */
+  PPD_CONFORM_STRICT			/* Require strict conformance */
+} ppd_conform_t;
+
+typedef struct ppd_attr_s		/**** PPD Attribute Structure @since CUPS 1.1.19@ ****/
+{
+  char		name[PPD_MAX_NAME];	/* Name of attribute (cupsXYZ) */
+  char		spec[PPD_MAX_NAME];	/* Specifier string, if any */
+  char		text[PPD_MAX_TEXT];	/* Human-readable text, if any */
+  char		*value;			/* Value string */
+} ppd_attr_t;
+
+typedef struct ppd_option_s ppd_option_t;
+					/**** Options ****/
+
+typedef struct ppd_choice_s		/**** Option choices ****/
+{
+  char		marked;			/* 0 if not selected, 1 otherwise */
+  char		choice[PPD_MAX_NAME];	/* Computer-readable option name */
+  char		text[PPD_MAX_TEXT];	/* Human-readable option name */
+  char		*code;			/* Code to send for this option */
+  ppd_option_t	*option;		/* Pointer to parent option structure */
+} ppd_choice_t;
+
+struct ppd_option_s			/**** Options ****/
+{
+  char		conflicted;		/* 0 if no conflicts exist, 1 otherwise */
+  char		keyword[PPD_MAX_NAME];	/* Option keyword name ("PageSize", etc.) */
+  char		defchoice[PPD_MAX_NAME];/* Default option choice */
+  char		text[PPD_MAX_TEXT];	/* Human-readable text */
+  ppd_ui_t	ui;			/* Type of UI option */
+  ppd_section_t	section;		/* Section for command */
+  float		order;			/* Order number */
+  int		num_choices;		/* Number of option choices */
+  ppd_choice_t	*choices;		/* Option choices */
+};
+
+typedef struct ppd_group_s		/**** Groups ****/
+{
+  /**** Group text strings are limited to 39 chars + nul in order to
+   **** preserve binary compatibility and allow applications to get
+   **** the group's keyword name.
+   ****/
+  char		text[PPD_MAX_TEXT - PPD_MAX_NAME];
+  					/* Human-readable group name */
+  char		name[PPD_MAX_NAME];	/* Group name @since CUPS 1.1.18@ */
+  int		num_options;		/* Number of options */
+  ppd_option_t	*options;		/* Options */
+  int		num_subgroups;		/* Number of sub-groups */
+  struct ppd_group_s *subgroups;	/* Sub-groups (max depth = 1) */
+} ppd_group_t;
+
+typedef struct				/**** Constraints ****/
+{
+  char		option1[PPD_MAX_NAME];	/* First keyword */
+  char		choice1[PPD_MAX_NAME];	/* First option/choice (blank for all) */
+  char		option2[PPD_MAX_NAME];	/* Second keyword */
+  char		choice2[PPD_MAX_NAME];	/* Second option/choice (blank for all) */
+} ppd_const_t;
+
+typedef struct ppd_size_s		/**** Page Sizes ****/
+{
+  int		marked;			/* Page size selected? */
+  char		name[PPD_MAX_NAME];	/* Media size option */
+  float		width;			/* Width of media in points */
+  float		length;			/* Length of media in points */
+  float		left;			/* Left printable margin in points */
+  float		bottom;			/* Bottom printable margin in points */
+  float		right;			/* Right printable margin in points */
+  float		top;			/* Top printable margin in points */
+} ppd_size_t;
+
+typedef struct ppd_emul_s		/**** Emulators ****/
+{
+  char		name[PPD_MAX_NAME];	/* Emulator name */
+  char		*start;			/* Code to switch to this emulation */
+  char		*stop;			/* Code to stop this emulation */
+} ppd_emul_t;
+
+typedef struct ppd_profile_s		/**** sRGB Color Profiles ****/
+{
+  char		resolution[PPD_MAX_NAME];
+  					/* Resolution or "-" */
+  char		media_type[PPD_MAX_NAME];
+					/* Media type or "-" */
+  float		density;		/* Ink density to use */
+  float		gamma;			/* Gamma correction to use */
+  float		matrix[3][3];		/* Transform matrix */
+} ppd_profile_t;
+
+/**** New in CUPS 1.2 ****/
+typedef enum ppd_cptype_e		/**** Custom Parameter Type @since CUPS 1.2@ ****/
+{
+  PPD_CUSTOM_CURVE,			/* Curve value for f(x) = x^value */
+  PPD_CUSTOM_INT,			/* Integer number value */
+  PPD_CUSTOM_INVCURVE,			/* Curve value for f(x) = x^(1/value) */
+  PPD_CUSTOM_PASSCODE,			/* String of (hidden) numbers */
+  PPD_CUSTOM_PASSWORD,			/* String of (hidden) characters */
+  PPD_CUSTOM_POINTS,			/* Measurement value in points */
+  PPD_CUSTOM_REAL,			/* Real number value */
+  PPD_CUSTOM_STRING			/* String of characters */
+} ppd_cptype_t;
+
+typedef union ppd_cplimit_u		/**** Custom Parameter Limit @since CUPS 1.2@ ****/
+{
+  float		custom_curve;		/* Gamma value */
+  int		custom_int;		/* Integer value */
+  float		custom_invcurve;	/* Gamma value */
+  int		custom_passcode;	/* Passcode length */
+  int		custom_password;	/* Password length */
+  float		custom_points;		/* Measurement value */
+  float		custom_real;		/* Real value */
+  int		custom_string;		/* String length */
+} ppd_cplimit_t;
+
+typedef union ppd_cpvalue_u		/**** Custom Parameter Value @since CUPS 1.2@ ****/
+{
+  float		custom_curve;		/* Gamma value */
+  int		custom_int;		/* Integer value */
+  float		custom_invcurve;	/* Gamma value */
+  char		*custom_passcode;	/* Passcode value */
+  char		*custom_password;	/* Password value */
+  float		custom_points;		/* Measurement value */
+  float		custom_real;		/* Real value */
+  char		*custom_string;		/* String value */
+} ppd_cpvalue_t;
+
+typedef struct ppd_cparam_s		/**** Custom Parameter @since CUPS 1.2@ ****/
+{
+  char		name[PPD_MAX_NAME];	/* Parameter name */
+  char		text[PPD_MAX_TEXT];	/* Human-readable text */
+  int		order;			/* Order (0 to N) */
+  ppd_cptype_t	type;			/* Parameter type */
+  ppd_cplimit_t	minimum,		/* Minimum value */
+		maximum;		/* Maximum value */
+  ppd_cpvalue_t	current;		/* Current value */
+} ppd_cparam_t;
+
+typedef struct ppd_coption_s		/**** Custom Option @since CUPS 1.2@ ****/
+{
+  char		keyword[PPD_MAX_NAME];	/* Name of option that is being extended... */
+  ppd_option_t	*option;		/* Option that is being extended... */
+  int		marked;			/* Extended option is marked */
+  cups_array_t	*params;		/* Parameters */
+} ppd_coption_t;
+
+typedef struct ppd_file_s		/**** PPD File ****/
+{
+  int		language_level;		/* Language level of device */
+  int		color_device;		/* 1 = color device, 0 = grayscale */
+  int		variable_sizes;		/* 1 = supports variable sizes, 0 = doesn't */
+  int		accurate_screens;	/* 1 = supports accurate screens, 0 = not */
+  int		contone_only;		/* 1 = continuous tone only, 0 = not */
+  int		landscape;		/* -90 or 90 */
+  int		model_number;		/* Device-specific model number */
+  int		manual_copies;		/* 1 = Copies done manually, 0 = hardware */
+  int		throughput;		/* Pages per minute */
+  ppd_cs_t	colorspace;		/* Default colorspace */
+  char		*patches;		/* Patch commands to be sent to printer */
+  int		num_emulations;		/* Number of emulations supported */
+  ppd_emul_t	*emulations;		/* Emulations and the code to invoke them */
+  char		*jcl_begin;		/* Start JCL commands */
+  char		*jcl_ps;		/* Enter PostScript interpreter */
+  char		*jcl_end;		/* End JCL commands */
+  char		*lang_encoding;		/* Language encoding */
+  char		*lang_version;		/* Language version (English, Spanish, etc.) */
+  char		*modelname;		/* Model name (general) */
+  char		*ttrasterizer;		/* Truetype rasterizer */
+  char		*manufacturer;		/* Manufacturer name */
+  char		*product;		/* Product name (from PS RIP/interpreter) */
+  char		*nickname;		/* Nickname (specific) */
+  char		*shortnickname;		/* Short version of nickname */
+  int		num_groups;		/* Number of UI groups */
+  ppd_group_t	*groups;		/* UI groups */
+  int		num_sizes;		/* Number of page sizes */
+  ppd_size_t	*sizes;			/* Page sizes */
+  float		custom_min[2];		/* Minimum variable page size */
+  float		custom_max[2];		/* Maximum variable page size */
+  float		custom_margins[4];	/* Margins around page */
+  int		num_consts;		/* Number of UI/Non-UI constraints */
+  ppd_const_t	*consts;		/* UI/Non-UI constraints */
+  int		num_fonts;		/* Number of pre-loaded fonts */
+  char		**fonts;		/* Pre-loaded fonts */
+  int		num_profiles;		/* Number of sRGB color profiles */
+  ppd_profile_t	*profiles;		/* sRGB color profiles */
+  int		num_filters;		/* Number of filters */
+  char		**filters;		/* Filter strings... */
+
+  /**** New in CUPS 1.1 ****/
+  int		flip_duplex;		/* 1 = Flip page for back sides @deprecated@ */
+
+  /**** New in CUPS 1.1.19 ****/
+  char		*protocols;		/* Protocols (BCP, TBCP) string @since CUPS 1.1.19@ */
+  char		*pcfilename;		/* PCFileName string @since CUPS 1.1.19@ */
+  int		num_attrs;		/* Number of attributes @since CUPS 1.1.19@ @private@ */
+  int		cur_attr;		/* Current attribute @since CUPS 1.1.19@ @private@ */
+  ppd_attr_t	**attrs;		/* Attributes @since CUPS 1.1.19@ @private@ */
+
+  /**** New in CUPS 1.2 ****/
+  cups_array_t	*sorted_attrs;		/* Attribute lookup array @since CUPS 1.2@ @private@ */
+  cups_array_t	*options;		/* Option lookup array @since CUPS 1.2@ @private@ */
+  cups_array_t	*coptions;		/* Custom options array @since CUPS 1.2@ @private@ */
+
+  /**** New in CUPS 1.3 ****/
+  cups_array_t	*marked;		/* Marked choices @since CUPS 1.3@ @private@ */
+} ppd_file_t;
+
+
+/*
+ * Prototypes...
+ */
+
+extern void		ppdClose(ppd_file_t *ppd);
+extern int		ppdCollect(ppd_file_t *ppd, ppd_section_t section,
+			           ppd_choice_t  ***choices);
+extern int		ppdConflicts(ppd_file_t *ppd);
+extern int		ppdEmit(ppd_file_t *ppd, FILE *fp,
+			        ppd_section_t section);
+extern int		ppdEmitFd(ppd_file_t *ppd, int fd,
+			          ppd_section_t section);
+extern int		ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id,
+			           const char *user, const char *title);
+extern ppd_choice_t	*ppdFindChoice(ppd_option_t *o, const char *option);
+extern ppd_choice_t	*ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword);
+extern ppd_option_t	*ppdFindOption(ppd_file_t *ppd, const char *keyword);
+extern int		ppdIsMarked(ppd_file_t *ppd, const char *keyword,
+			            const char *option);
+extern void		ppdMarkDefaults(ppd_file_t *ppd);
+extern int		ppdMarkOption(ppd_file_t *ppd, const char *keyword,
+			              const char *option);
+extern ppd_file_t	*ppdOpen(FILE *fp);
+extern ppd_file_t	*ppdOpenFd(int fd);
+extern ppd_file_t	*ppdOpenFile(const char *filename);
+extern float		ppdPageLength(ppd_file_t *ppd, const char *name);
+extern ppd_size_t	*ppdPageSize(ppd_file_t *ppd, const char *name);
+extern float		ppdPageWidth(ppd_file_t *ppd, const char *name);
+
+/**** New in CUPS 1.1.19 ****/
+extern const char	*ppdErrorString(ppd_status_t status);
+extern ppd_attr_t	*ppdFindAttr(ppd_file_t *ppd, const char *name,
+			             const char *spec);
+extern ppd_attr_t	*ppdFindNextAttr(ppd_file_t *ppd, const char *name,
+			                 const char *spec);
+extern ppd_status_t	ppdLastError(int *line);
+
+/**** New in CUPS 1.1.20 ****/
+extern void		ppdSetConformance(ppd_conform_t c);
+
+/**** New in CUPS 1.2 ****/
+extern int		ppdCollect2(ppd_file_t *ppd, ppd_section_t section,
+			            float min_order, ppd_choice_t  ***choices);
+extern int		ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp,
+			                  ppd_section_t section, int limit,
+					  float min_order);
+extern int		ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp);
+extern char		*ppdEmitString(ppd_file_t *ppd, ppd_section_t section,
+			               float min_order);
+extern ppd_coption_t	*ppdFindCustomOption(ppd_file_t *ppd,
+			                     const char *keyword);
+extern ppd_cparam_t	*ppdFindCustomParam(ppd_coption_t *opt,
+			                    const char *name);
+extern ppd_cparam_t	*ppdFirstCustomParam(ppd_coption_t *opt);
+extern ppd_option_t	*ppdFirstOption(ppd_file_t *ppd);
+extern ppd_cparam_t	*ppdNextCustomParam(ppd_coption_t *opt);
+extern ppd_option_t	*ppdNextOption(ppd_file_t *ppd);
+extern int		ppdLocalize(ppd_file_t *ppd);
+extern ppd_file_t	*ppdOpen2(cups_file_t *fp);
+
+/**** New in CUPS 1.3 ****/
+extern const char	*ppdLocalizeIPPReason(ppd_file_t *ppd,
+			                      const char *reason,
+					      const char *scheme,
+					      char *buffer, size_t bufsize);
+
+
+/*
+ * C++ magic...
+ */
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_PPD_H_ */
+
+/*
+ * End of "$Id: ppd.h 6649 2007-07-11 21:46:42Z mike $".
+ */

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802151535.m1FFZrn4003975>