Search code examples
clisp

how to retrieve errno from an os error?


This question is divided into two parts.

Part one:

I run this ...

 1 (handler-case (posix:kill 1 0)
 2   (error (the-condition) (prin1 (type-of the-condition)) (terpri)
 3                          (princ the-condition) (terpri)))

... and get this output:

SYSTEM::SIMPLE-OS-ERROR
UNIX error 1 (EPERM): Operation not permitted

I can use #'princ-to-string and parse the string to get the error number. But is there a more direct way to retrieve errno? Something like #'file-error-pathname, but for errno instead?

Part two:

Where in the documentation could I have found the answer to Part one?


Solution

  • Released version

    The released version 2.49 does not have an accessor for the errno. You can get it, however, thusly:

    [4]> (setq c (nth-value 1 (ignore-errors (posix:kill 1 0))))
    #<SYSTEM::SIMPLE-OS-ERROR #x00000002002634A1>
    [5]> (describe c)
    
    #<SYSTEM::SIMPLE-OS-ERROR #x000000020021AF69> is an instance of the CLOS class #1=#<STANDARD-CLASS SYSTEM::SIMPLE-OS-ERROR>.
    Slots:
      SYSTEM::$FORMAT-CONTROL     = 
    "UNIX error ~S (EPERM): Operation not permitted
    "
      SYSTEM::$FORMAT-ARGUMENTS   = (1)
    
     "UNIX error ~S (EPERM): Operation not permitted
    " is a simple 1 dimensional array (vector) of CHARACTERs, of size 47 (a ISO-8859-1 string).
    
     (1) is a list of length 1.
    
    [6]> (car (slot-value c 'SYSTEM::$FORMAT-ARGUMENTS))
    1
    

    Development version

    The dev version in the tip of the mercurial repo has os-error instead:

    [1]> (setq c (nth-value 1 (ignore-errors (posix:kill 1 0))))
    #<OS-ERROR #x0000000200253301>
    [2]> (describe c)
    
    #<OS-ERROR #x0000000200253301> is an instance of the CLOS class #1=#<STANDARD-CLASS OS-ERROR>.
    Slots:
      SYSTEM::$CODE   = 1
    
     1 is an integer, uses 1 bit, is represented as a fixnum.
    
    [6]> (apropos "os-error")
    OS-ERROR                                   class
    OS-ERROR-CODE                              function
    EXT::OS-ERROR-CODE-1                    
    
    [10]> (os-error-code c)
    1