Implemented to build empty php extension in Rust

This commit is contained in:
Jin Hu 2017-08-12 15:16:07 +08:00
commit b1a4a5fb8d
8 changed files with 204 additions and 0 deletions

19
src/info.rs Normal file
View file

@ -0,0 +1,19 @@
use libc::*;
#[link_args = "-Wl,-undefined,dynamic_lookup"]
extern {
pub fn php_info_print_table_row(num_cols: c_int, ...) -> c_void;
pub fn php_info_print_table_row_ex(num_cols: c_int, a: *const c_char, ...);
pub fn php_info_print_table_start();
pub fn php_info_print_table_end();
pub fn php_info_print_hr();
}
pub fn print_table_start() {
unsafe { php_info_print_table_start() }
}
pub fn print_table_end() {
unsafe { php_info_print_table_end() }
}

9
src/lib.rs Normal file
View file

@ -0,0 +1,9 @@
#![allow(dead_code)]
#![allow(unused_variables)]
#![feature(link_args)]
extern crate libc;
pub mod zend;
pub mod info;

3
src/zend/mod.rs Normal file
View file

@ -0,0 +1,3 @@
pub use self::module::*;
mod module;

94
src/zend/module.rs Normal file
View file

@ -0,0 +1,94 @@
use std;
use std::mem;
use libc::*;
type StartupFunc = extern fn (type_: c_int, module_number: c_int) -> c_int;
type ShutdownFunc = extern fn (type_: c_int, module_number: c_int) -> c_int;
type InfoFunc = extern fn () ;
type GlobalsCtorFunc = extern fn (global: *const c_void) -> c_void;
type GlobalsDtorFunc = extern fn (global: *const c_void) -> c_void;
type PostDeactivateFunc = extern fn () -> c_int;
macro_rules! c_str {
($s:expr) => { {
concat!($s, "\0").as_ptr() as *const c_char
} }
}
pub struct ModuleDep {}
pub struct Function {}
pub struct INI {}
#[repr(C)]
pub struct Module {
size: c_ushort,
zend_api: c_uint,
zend_debug: c_uchar,
zts: c_uchar,
ini_entry: *const INI,
deps: *const ModuleDep,
name: *const c_char,
functions: *const Function,
module_startup_func: Option<StartupFunc>,
module_shutdown_func: Option<ShutdownFunc>,
request_startup_func: Option<StartupFunc>,
request_shutdown_func: Option<ShutdownFunc>,
info_func: Option<InfoFunc>,
version: *const c_char,
globals_size: size_t,
globals_ptr: *const c_void,
globals_ctor: Option<GlobalsCtorFunc>,
globals_dtor: Option<GlobalsDtorFunc>,
post_deactivate_func: Option<PostDeactivateFunc>,
module_started: c_int,
type_: c_uchar,
handle: *const c_void,
module_number: c_int,
build_id: *const c_char,
}
impl Module {
pub fn new(name: *const c_char, version: *const c_char) -> Module {
Module {
size: mem::size_of::<Module>() as u16,
zend_api: 20151012,
zend_debug: 0,
zts: 0,
ini_entry: std::ptr::null(),
deps: std::ptr::null(),
name: name,
functions: std::ptr::null(),
module_startup_func: None,
module_shutdown_func: None,
request_startup_func: None,
request_shutdown_func: None,
info_func: None,
version: version,
globals_size: 0,
globals_ptr: std::ptr::null(),
globals_ctor: None,
globals_dtor: None,
post_deactivate_func: None,
module_started: 0,
type_: 0,
handle: std::ptr::null(),
module_number: 0,
build_id: c_str!("API20151012,NTS"),
}
}
pub fn set_startup_func(&mut self, func: StartupFunc) {
self.module_startup_func = Some(func);
}
pub fn set_shutdown_func(&mut self, func: ShutdownFunc) {
self.module_shutdown_func = Some(func);
}
pub fn set_info_func(&mut self, func: InfoFunc) {
self.info_func = Some(func);
}
}
unsafe impl Sync for Module {}