start to implement pymscp.c

This commit is contained in:
Ryo Nakamura
2023-03-11 20:54:45 +09:00
parent d22c02b793
commit 7e7bc61ff2
3 changed files with 346 additions and 1 deletions

View File

@@ -257,7 +257,7 @@ void mscp_set_msg_fd(struct mscp *m, int fd);
*
* @return pointer to the message.
*/
const char *mscp_get_error();
const char *mscp_get_error(void);

14
setup.py Normal file
View File

@@ -0,0 +1,14 @@
from distutils.core import setup, Extension
setup(
name='pymscp',
ext_modules = [
Extension(
'pymscp',
['src/pymscp.c'],
library_dirs = ['build'],
libraries = ['mscp'],
include_dirs = ['include']
)
]
)

331
src/pymscp.c Normal file
View File

@@ -0,0 +1,331 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <mscp.h>
static PyObject *wrap_mscp_init(PyObject *sef, PyObject *args, PyObject *kw)
{
/*
* Initialize struct mscp with options. wrap_mscp_init
* receives all the arguments with keywords.
*/
char *remote;
char *keywords[] = {
/* mscp_opts */
"direction", /* int, MSCP_DIRECTION_L2R or MSCP_DIRECTION_R2L */
"nr_threads", /* int */
"nr_ahead", /* int */
"min_chunk_sz", /* unsigned long */
"max_chunk_sz", /* unsigned long */
"buf_sz", /* unsigned long */
"coremask", /* const char * */
"severity", /* int, MSCP_SERVERITY_* */
"msg_fd", /* int */
/* mscp_ssh_opts */
"login_name", /* const char * */
"port", /* const char * */
"identity", /* const char * */
"cipher", /* const char * */
"hmac", /* const char * */
"compress", /* const char * */
"password", /* const char * */
"passphrase", /* const char * */
"debug_level", /* int */
"no_hostkey_check", /* bool */
"enable_nagle", /* bool */
NULL,
};
const char *fmt = "siiikkkzii" "zzzzzzzzipp";
char *coremask;
char *login_name, *port, *identity, *cipher, *hmac, *compress;
char *password, *passphrase;
struct mscp_opts mo;
struct mscp_ssh_opts so;
struct mscp *m;
int ret;
memset(&mo, 0, sizeof(mo));
memset(&so, 0, sizeof(so));
ret = PyArg_ParseTupleAndKeywords(args, kw, fmt, keywords,
&remote,
&mo.direction,
&mo.nr_threads,
&mo.nr_ahead,
&mo.min_chunk_sz,
&mo.max_chunk_sz,
&mo.buf_sz,
&coremask,
&mo.severity,
&mo.msg_fd,
&login_name,
&port,
&identity,
&cipher,
&hmac,
&compress,
&password,
&passphrase,
&so.no_hostkey_check,
&so.enable_nagle);
if (!ret)
return NULL;
if (coremask)
strncpy(mo.coremask, coremask, MSCP_MAX_COREMASK_STR);
if (login_name)
strncpy(so.login_name, login_name, MSCP_SSH_MAX_LOGIN_NAME);
if (port)
strncpy(so.port, port, MSCP_SSH_MAX_PORT_STR);
if (identity)
strncpy(so.identity, identity, MSCP_SSH_MAX_IDENTITY_PATH);
if (cipher)
strncpy(so.cipher, cipher, MSCP_SSH_MAX_CIPHER_STR);
if (hmac)
strncpy(so.hmac, hmac, MSCP_SSH_MAX_HMAC_STR);
if (compress)
strncpy(so.compress, compress, MSCP_SSH_MAX_COMP_STR);
if (password)
strncpy(so.password, password, MSCP_SSH_MAX_PASSWORD);
if (passphrase)
strncpy(so.passphrase, passphrase, MSCP_SSH_MAX_PASSPHRASE);
m = mscp_init(remote, &mo, &so);
if (!m)
return NULL;
return Py_BuildValue("K", (unsigned long long)m);
}
static PyObject *wrap_mscp_connect(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
if (mscp_connect(m) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_add_src_path(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", "src_path", NULL };
unsigned long long maddr;
char *src_path;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "Ks", keywords, &maddr, &src_path))
return NULL;
m = (void *)maddr;
if (mscp_add_src_path(m, src_path) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_set_dst_path(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", "dst_path", NULL };
unsigned long long maddr;
char *dst_path;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "Ks", keywords, &maddr, &dst_path))
return NULL;
m = (void *)maddr;
if (mscp_set_dst_path(m, dst_path) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_prepare(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
if (mscp_prepare(m) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_start(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
if (mscp_start(m) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_stop(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
mscp_stop(m);
return Py_BuildValue("");
}
static PyObject *wrap_mscp_join(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
if (mscp_join(m) < 0) {
PyErr_Format(PyExc_RuntimeError, mscp_get_error());
return NULL;
}
return Py_BuildValue("");
}
static PyObject *wrap_mscp_get_stats(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp_stats s;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
mscp_get_stats(m, &s);
return Py_BuildValue("KKd", s.total, s.done, s.finished);
}
static PyObject *wrap_mscp_cleanup(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
mscp_cleanup(m);
return Py_BuildValue("");
}
static PyObject *wrap_mscp_free(PyObject *self, PyObject *args, PyObject *kw)
{
char *keywords[] = { "m", NULL };
unsigned long long maddr;
struct mscp *m;
if (!PyArg_ParseTupleAndKeywords(args, kw, "K", keywords, &maddr))
return NULL;
m = (void *)maddr;
mscp_free(m);
return Py_BuildValue("");
}
static PyMethodDef PyMscpMethods[] = {
{
"mscp_init", (PyCFunction)wrap_mscp_init,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_connect", (PyCFunction)wrap_mscp_connect,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_add_src_path", (PyCFunction)wrap_mscp_add_src_path,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_set_dst_path", (PyCFunction)wrap_mscp_set_dst_path,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_prepare", (PyCFunction)wrap_mscp_prepare,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_start", (PyCFunction)wrap_mscp_start,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_stop", (PyCFunction)wrap_mscp_stop,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_join", (PyCFunction)wrap_mscp_join,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_get_stats", (PyCFunction)wrap_mscp_get_stats,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_cleanup", (PyCFunction)wrap_mscp_cleanup,
METH_VARARGS | METH_KEYWORDS, NULL
},
{
"mscp_free", (PyCFunction)wrap_mscp_free,
METH_VARARGS | METH_KEYWORDS, NULL
},
{ NULL, NULL, 0, NULL },
};
static PyModuleDef PyMscpModule = {
PyModuleDef_HEAD_INIT, "PyMscp", NULL, -1, PyMscpMethods,
};
PyMODINIT_FUNC PyInit_PyMscp(void) {
return PyModule_Create(&PyMscpModule);
}