Question

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?

Was it helpful?

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top