I have defined wrappers for openlog and syslog. The openlog function requires an ident string. Whatever I pass to openlog does not survive until a call to syslog. I have tried to protect the string with ##still-copy (with and without box/unbox) but it does not work. Here is the example: (define const-ident #f) (define openlog (let ((openlog (c-lambda (char-string int int) void "openlog"))) (lambda (ident option facility) (set! const-ident (box (##still-copy ident))) (openlog (unbox const-ident) option facility)))) (define syslog (let ((syslog (c-lambda (int nonnull-char-string) void "syslog"))) (lambda (priority . args) (syslog priority (apply string-append args))))) This program: (define (main . args) (openlog "gambit" (+ LOG_NDELAY LOG_PID) LOG_USER) (syslog LOG_INFO "hello") (closelog)) will generate random syslog tags: Nov 21 17:58:49 sn-e0692 ��*#002[11621]: hello What is the correct way to protect a string to be able to pass it to a const char* argument?