Blame lang/cl/gpg-error.lisp

Packit fc043f
;;;; libgpg-error.lisp
Packit fc043f
Packit fc043f
;;; Copyright (C) 2006 g10 Code GmbH
Packit fc043f
;;;
Packit fc043f
;;; This file is part of libgpg-error.
Packit fc043f
;;;
Packit fc043f
;;; libgpg-error is free software; you can redistribute it and/or
Packit fc043f
;;; modify it under the terms of the GNU Lesser General Public License
Packit fc043f
;;; as published by the Free Software Foundation; either version 2.1 of
Packit fc043f
;;; the License, or (at your option) any later version.
Packit fc043f
;;;
Packit fc043f
;;; libgpg-error is distributed in the hope that it will be useful, but
Packit fc043f
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
Packit fc043f
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit fc043f
;;; Lesser General Public License for more details.
Packit fc043f
;;;
Packit fc043f
;;; You should have received a copy of the GNU Lesser General Public
Packit fc043f
;;; License along with libgpg-error; if not, write to the Free
Packit fc043f
;;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
Packit fc043f
;;; 02111-1307, USA.
Packit fc043f
Packit fc043f
;;; Set up the library.
Packit fc043f
Packit fc043f
(in-package :gpg-error)
Packit fc043f
Packit fc043f
(define-foreign-library libgpg-error
Packit fc043f
  (:unix "libgpg-error.so")
Packit fc043f
  (t (:default "libgpg-error")))
Packit fc043f
   
Packit fc043f
(use-foreign-library libgpg-error)
Packit fc043f
Packit fc043f
;;; System dependencies.
Packit fc043f
Packit fc043f
(defctype size-t :unsigned-int "The system size_t type.")
Packit fc043f
Packit fc043f
;;; Error sources.
Packit fc043f
Packit fc043f
(defcenum gpg-err-source-t
Packit fc043f
  "The GPG error source type."
Packit fc043f
  (:gpg-err-source-unknown 0)
Packit fc043f
  (:gpg-err-source-gcrypt 1)
Packit fc043f
  (:gpg-err-source-gpg 2)
Packit fc043f
  (:gpg-err-source-gpgsm 3)
Packit fc043f
  (:gpg-err-source-gpgagent 4)
Packit fc043f
  (:gpg-err-source-pinentry 5)
Packit fc043f
  (:gpg-err-source-scd 6)
Packit fc043f
  (:gpg-err-source-gpgme 7)
Packit fc043f
  (:gpg-err-source-keybox 8)
Packit fc043f
  (:gpg-err-source-ksba 9)
Packit fc043f
  (:gpg-err-source-dirmngr 10)
Packit fc043f
  (:gpg-err-source-gsti 11)
Packit fc043f
  (:gpg-err-source-any 31)
Packit fc043f
  (:gpg-err-source-user-1 32)
Packit fc043f
  (:gpg-err-source-user-2 33)
Packit fc043f
  (:gpg-err-source-user-3 34)
Packit fc043f
  (:gpg-err-source-user-4 35))
Packit fc043f
Packit fc043f
(defconstant +gpg-err-source-dim+ 256)
Packit fc043f
Packit fc043f
;;; The error code type gpg-err-code-t.
Packit fc043f
Packit fc043f
;;; libgpg-error-codes.lisp is loaded by ASDF.
Packit fc043f
Packit fc043f
(defctype gpg-error-t :unsigned-int "The GPG error code type.")
Packit fc043f
Packit fc043f
;;; Bit mask manipulation constants.
Packit fc043f
Packit fc043f
(defconstant +gpg-err-code-mask+ (- +gpg-err-code-dim+ 1))
Packit fc043f
Packit fc043f
(defconstant +gpg-err-source-mask+ (- +gpg-err-source-dim+ 1))
Packit fc043f
(defconstant +gpg-err-source-shift+ 24)
Packit fc043f
Packit fc043f
;;; Constructor and accessor functions.
Packit fc043f
Packit fc043f
;;; If we had in-library versions of our static inlines, we wouldn't
Packit fc043f
;;; need to replicate them here.  Oh well.
Packit fc043f
Packit fc043f
(defun c-gpg-err-make (source code)
Packit fc043f
  "Construct an error value from an error code and source.
Packit fc043f
   Within a subsystem, use gpg-error instead."
Packit fc043f
  (logior
Packit fc043f
   (ash (logand source +gpg-err-source-mask+)
Packit fc043f
	+gpg-err-source-shift+)
Packit fc043f
   (logand code +gpg-err-code-mask+)))
Packit fc043f
Packit fc043f
(defun c-gpg-err-code (err)
Packit fc043f
  "retrieve the error code from an error value." 
Packit fc043f
  (logand err +gpg-err-code-mask+))
Packit fc043f
Packit fc043f
(defun c-gpg-err-source (err)
Packit fc043f
  "retrieve the error source from an error value." 
Packit fc043f
  (logand (ash err (- +gpg-err-source-shift+))
Packit fc043f
	  +gpg-err-source-mask+))
Packit fc043f
Packit fc043f
;;; String functions.
Packit fc043f
Packit fc043f
(defcfun ("gpg_strerror" c-gpg-strerror) :string
Packit fc043f
  (err gpg-error-t))
Packit fc043f
Packit fc043f
(defcfun ("gpg_strsource" c-gpg-strsource) :string
Packit fc043f
  (err gpg-error-t))
Packit fc043f
Packit fc043f
;;; Mapping of system errors (errno).
Packit fc043f
Packit fc043f
(defcfun ("gpg_err_code_from_errno" c-gpg-err-code-from-errno) gpg-err-code-t
Packit fc043f
  (err :int))
Packit fc043f
Packit fc043f
(defcfun ("gpg_err_code_to_errno" c-gpg-err-code-to-errno) :int
Packit fc043f
  (code gpg-err-code-t))
Packit fc043f
Packit fc043f
(defcfun ("gpg_err_code_from_syserror"
Packit fc043f
           c-gpg-err-code-from-syserror) gpg-err-code-t)
Packit fc043f
Packit fc043f
;;; Self-documenting convenience functions.
Packit fc043f
Packit fc043f
;;; See below.
Packit fc043f
Packit fc043f
;;;
Packit fc043f
;;;
Packit fc043f
;;; Lispy interface.
Packit fc043f
;;;
Packit fc043f
;;;
Packit fc043f
Packit fc043f
;;; Low-level support functions.
Packit fc043f
Packit fc043f
(defun gpg-err-code-as-value (code-key)
Packit fc043f
  (foreign-enum-value 'gpg-err-code-t code-key))
Packit fc043f
Packit fc043f
(defun gpg-err-code-as-key (code)
Packit fc043f
  (foreign-enum-keyword 'gpg-err-code-t code))
Packit fc043f
Packit fc043f
(defun gpg-err-source-as-value (source-key)
Packit fc043f
  (foreign-enum-value 'gpg-err-source-t source-key))
Packit fc043f
Packit fc043f
(defun gpg-err-source-as-key (source)
Packit fc043f
  (foreign-enum-keyword 'gpg-err-source-t source))
Packit fc043f
Packit fc043f
(defun gpg-err-canonicalize (err)
Packit fc043f
  "Canonicalize the error value err."
Packit fc043f
  (gpg-err-make (gpg-err-source err) (gpg-err-code err)))
Packit fc043f
Packit fc043f
(defun gpg-err-as-value (err)
Packit fc043f
  "Get the integer representation of the error value ERR."
Packit fc043f
  (let ((error (gpg-err-canonicalize err)))
Packit fc043f
    (c-gpg-err-make (gpg-err-source-as-value (gpg-err-source error))
Packit fc043f
		    (gpg-err-code-as-value (gpg-err-code error)))))
Packit fc043f
Packit fc043f
;;; Constructor and accessor functions.
Packit fc043f
Packit fc043f
(defun gpg-err-make (source code)
Packit fc043f
  "Construct an error value from an error code and source.
Packit fc043f
   Within a subsystem, use gpg-error instead."
Packit fc043f
  ;; As an exception to the rule, the function gpg-err-make will use
Packit fc043f
  ;; the error source value as is when provided as integer, instead of
Packit fc043f
  ;; parsing it as an error value.
Packit fc043f
  (list (if (integerp source)
Packit fc043f
	    (gpg-err-source-as-key source)
Packit fc043f
	    (gpg-err-source source))
Packit fc043f
	(gpg-err-code code)))
Packit fc043f
Packit fc043f
(defvar *gpg-err-source-default* :gpg-err-source-unknown
Packit fc043f
  "define this to specify a default source for gpg-error.")
Packit fc043f
Packit fc043f
(defun gpg-error (code)
Packit fc043f
  "Construct an error value from an error code, using the default source."
Packit fc043f
  (gpg-err-make *gpg-err-source-default* code))
Packit fc043f
Packit fc043f
(defun gpg-err-code (err)
Packit fc043f
    "Retrieve an error code from the error value ERR."
Packit fc043f
    (cond ((listp err) (second err))
Packit fc043f
	  ((keywordp err) err) ; FIXME
Packit fc043f
	  (t (gpg-err-code-as-key (c-gpg-err-code err)))))
Packit fc043f
Packit fc043f
(defun gpg-err-source (err)
Packit fc043f
    "Retrieve an error source from the error value ERR."
Packit fc043f
    (cond ((listp err) (first err))
Packit fc043f
	  ((keywordp err) err) ; FIXME
Packit fc043f
	  (t (gpg-err-source-as-key (c-gpg-err-source err)))))
Packit fc043f
Packit fc043f
;;; String functions.
Packit fc043f
Packit fc043f
(defun gpg-strerror (err)
Packit fc043f
  "Return a string containig a description of the error code."
Packit fc043f
  (c-gpg-strerror (gpg-err-as-value err)))
Packit fc043f
Packit fc043f
;;; FIXME: maybe we should use this as the actual implementation for
Packit fc043f
;;; gpg-strerror.
Packit fc043f
Packit fc043f
;; (defcfun ("gpg_strerror_r" c-gpg-strerror-r) :int
Packit fc043f
;;   (err gpg-error-t)
Packit fc043f
;;   (buf :string)
Packit fc043f
;;   (buflen size-t))
Packit fc043f
Packit fc043f
;; (defun gpg-strerror-r (err)
Packit fc043f
;;   "Return a string containig a description of the error code."
Packit fc043f
;;   (with-foreign-pointer-as-string (errmsg 256 errmsg-size)
Packit fc043f
;;     (c-gpg-strerror-r (gpg-err-code-as-value (gpg-err-code err))
Packit fc043f
;; 		      errmsg errmsg-size)))
Packit fc043f
Packit fc043f
(defun gpg-strsource (err)
Packit fc043f
  "Return a string containig a description of the error source."
Packit fc043f
  (c-gpg-strsource (gpg-err-as-value err)))
Packit fc043f
Packit fc043f
;;; Mapping of system errors (errno).
Packit fc043f
Packit fc043f
(defun gpg-err-code-from-errno (err)
Packit fc043f
  "Retrieve the error code for the system error.  If the system error
Packit fc043f
   is not mapped, :gpg-err-unknown-errno is returned."
Packit fc043f
  (gpg-err-code-as-key (c-gpg-err-code-from-errno err)))
Packit fc043f
Packit fc043f
(defun gpg-err-code-to-errno (code)
Packit fc043f
  "Retrieve the system error for the error code.  If this is not a
Packit fc043f
   system error, 0 is returned."
Packit fc043f
  (c-gpg-err-code-to-errno (gpg-err-code code)))
Packit fc043f
Packit fc043f
(defun gpg-err-code-from-syserror ()
Packit fc043f
  "Retrieve the error code directly from the system ERRNO.  If the system error
Packit fc043f
   is not mapped, :gpg-err-unknown-errno is returned and 
Packit fc043f
   :gpg-err-missing-errno if ERRNO has the value 0."
Packit fc043f
  (gpg-err-code-as-key (c-gpg-err-code-from-syserror)))
Packit fc043f
Packit fc043f
Packit fc043f
;;; Self-documenting convenience functions.
Packit fc043f
Packit fc043f
(defun gpg-err-make-from-errno (source err)
Packit fc043f
  (gpg-err-make source (gpg-err-code-from-errno err)))
Packit fc043f
Packit fc043f
(defun gpg-error-from-errno (err)
Packit fc043f
  (gpg-error (gpg-err-code-from-errno err)))
Packit fc043f
Packit fc043f
(defun gpg-error-from-syserror ()
Packit fc043f
  (gpg-error (gpg-err-code-from-syserror)))
Packit fc043f