mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* io.c (rb_cloexec_dup): new function. (ruby_dup): use rb_cloexec_dup. * ext/pty/pty.c (pty_getpty): use rb_cloexec_dup. * ext/openssl/ossl_bio.c (ossl_obj2bio): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33553 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * $Id$
 | 
						|
 * 'OpenSSL for Ruby' team members
 | 
						|
 * Copyright (C) 2003
 | 
						|
 * All rights reserved.
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * This program is licenced under the same licence as Ruby.
 | 
						|
 * (See the file 'LICENCE'.)
 | 
						|
 */
 | 
						|
#include "ossl.h"
 | 
						|
#ifdef HAVE_UNISTD_H
 | 
						|
#include <unistd.h>
 | 
						|
#endif
 | 
						|
 | 
						|
BIO *
 | 
						|
ossl_obj2bio(VALUE obj)
 | 
						|
{
 | 
						|
    BIO *bio;
 | 
						|
 | 
						|
    if (TYPE(obj) == T_FILE) {
 | 
						|
	rb_io_t *fptr;
 | 
						|
	FILE *fp;
 | 
						|
	int fd;
 | 
						|
 | 
						|
	GetOpenFile(obj, fptr);
 | 
						|
	rb_io_check_readable(fptr);
 | 
						|
	if ((fd = rb_cloexec_dup(FPTR_TO_FD(fptr))) < 0){
 | 
						|
	    rb_sys_fail(0);
 | 
						|
	}
 | 
						|
        rb_update_max_fd(fd);
 | 
						|
	if (!(fp = fdopen(fd, "r"))){
 | 
						|
	    close(fd);
 | 
						|
	    rb_sys_fail(0);
 | 
						|
	}
 | 
						|
	if (!(bio = BIO_new_fp(fp, BIO_CLOSE))){
 | 
						|
	    fclose(fp);
 | 
						|
	    ossl_raise(eOSSLError, NULL);
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	StringValue(obj);
 | 
						|
	bio = BIO_new_mem_buf(RSTRING_PTR(obj), RSTRING_LENINT(obj));
 | 
						|
	if (!bio) ossl_raise(eOSSLError, NULL);
 | 
						|
    }
 | 
						|
 | 
						|
    return bio;
 | 
						|
}
 | 
						|
 | 
						|
BIO *
 | 
						|
ossl_protect_obj2bio(VALUE obj, int *status)
 | 
						|
{
 | 
						|
     BIO *ret = NULL;
 | 
						|
     ret = (BIO*)rb_protect((VALUE(*)_((VALUE)))ossl_obj2bio, obj, status);
 | 
						|
     return ret;
 | 
						|
}
 | 
						|
 | 
						|
VALUE
 | 
						|
ossl_membio2str0(BIO *bio)
 | 
						|
{
 | 
						|
    VALUE ret;
 | 
						|
    BUF_MEM *buf;
 | 
						|
 | 
						|
    BIO_get_mem_ptr(bio, &buf);
 | 
						|
    ret = rb_str_new(buf->data, buf->length);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
VALUE
 | 
						|
ossl_protect_membio2str(BIO *bio, int *status)
 | 
						|
{
 | 
						|
    return rb_protect((VALUE(*)_((VALUE)))ossl_membio2str0, (VALUE)bio, status);
 | 
						|
}
 | 
						|
 | 
						|
VALUE
 | 
						|
ossl_membio2str(BIO *bio)
 | 
						|
{
 | 
						|
    VALUE ret;
 | 
						|
    int status = 0;
 | 
						|
 | 
						|
    ret = ossl_protect_membio2str(bio, &status);
 | 
						|
    BIO_free(bio);
 | 
						|
    if(status) rb_jump_tag(status);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 |