--- bind-translator.scm	(revision 28515)
+++ bind-translator.scm	(working copy)
@@ -556,8 +556,10 @@
 	      [('star . more)
 	       (loop2 (simplify-type `(c-pointer ,type) #f #t #f) more) ]
 	      [(('id name) . more)
-	       (set! fields (cons (list type (string->symbol name)) fields))
-	       (process-struct-member-def m sname name type (or mut? mutable-fields))
+	       (set! fields (cons (list (if (equal? type 'c-string)
+                                            'bind-string
+                                            type) (string->symbol name)) fields))
+	       (process-struct-member-def m sname name type (or mut? mutable-fields) "")
 	       (match more
 		 [('comma . more) (loop2 type more)]
 		 [() (loop (cdr ts))]
@@ -573,6 +575,14 @@
              [argfields (map (lambda (f) (if (struct-by-val? f)
                                         (wrap-in-pointer f)
                                         f)) fields)])
+        (emit
+         `(,(rename 'define-foreign-type)
+           bind-string c-pointer
+           (,(rename 'lambda) (a)
+            (,(rename 'if) (,(rename 'string?) a)
+                ((,(rename 'foreign-lambda*) c-pointer ((c-string a)) "C_return(strdup(a));") a)
+                a))
+           (,(rename 'foreign-lambda*) c-string ((c-pointer a)) "C_return(a);")))
 	(emit
 	 `(,(rename 'define) ,maker
 	   (,(rename 'foreign-lambda*) (c-pointer (,m ,sname)) ,argfields
@@ -1005,8 +1015,8 @@
      (_ (parsing-error "error in enum-def (internal)")))
    (reverse items) ) )
 
-(define (process-struct-member-def m sname name type mut?)
-  (let* ([getter (fix-name (string-append (->string sname) "-" (->string name)))] ; name of procedure
+(define (process-struct-member-def m sname name type mut? postfix)
+  (let* ([getter (fix-name (string-append (->string sname) "-" (->string name) postfix))] ; name of procedure
          [args `((c-pointer (,m ,sname)) s)] ; foreign-lambda*-style arguments
          ;; getter body
          [g  (if (struct-by-val? type)
@@ -1024,12 +1034,16 @@
                    ,(sprintf "return(s->~A);" name) )) ]
          ;; setter body
          [s  `(,(rename 'foreign-lambda*) void (,args (,type x) )
-               ,(sprintf "s->~A = x;" name) ) ])
+               ,(if (member type '(c-string c-string*))
+                    (sprintf "s->~A = strdup(x);" name)
+                    (sprintf "s->~A = x;" name))) ])
     (emit (if mut?
               (if (struct-by-val? type)
                   (error "mutable nested structs not supported" (conc type " " name " in struct " sname))
                   `(,(rename 'define) ,getter (,(rename 'getter-with-setter) ,g ,s)))
-              `(,(rename 'define) ,getter ,g) ) ) ) )
+              `(,(rename 'define) ,getter ,g) ) )
+    (when (member type '(c-string c-string*))
+     (process-struct-member-def m sname name 'c-pointer mut? "*")) ) )
 
 (define (process-class-def name cname basenames)
   (let ([destr (gensym)]
