This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "python/py_spoolss.h"
PyObject *kw)
{
WERROR werror;
- PyObject *result = Py_None, *creds = NULL;
+ PyObject *result = NULL, *creds = NULL;
PRINTER_DRIVER_CTR ctr;
int level = 1, i;
- uint32 needed, num_drivers;
- char *arch = "Windows NT x86", *server_name;
- static char *kwlist[] = {"server", "creds", "level", "arch", NULL};
+ uint32 num_drivers;
+ char *arch = "Windows NT x86", *server, *errstr;
+ static char *kwlist[] = {"server", "level", "creds", "arch", NULL};
struct cli_state *cli = NULL;
TALLOC_CTX *mem_ctx = NULL;
/* Parse parameters */
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|O!is", kwlist,
- &server_name, &PyDict_Type, &creds,
- &level, &arch))
+ if (!PyArg_ParseTupleAndKeywords(
+ args, kw, "s|iOs", kwlist, &server, &level, &creds,
+ &arch))
return NULL;
+ if (server[0] != '\\' || server[1] != '\\') {
+ PyErr_SetString(PyExc_ValueError, "UNC name required");
+ return NULL;
+ }
+
+ server += 2;
+
+ if (creds && creds != Py_None && !PyDict_Check(creds)) {
+ PyErr_SetString(PyExc_TypeError,
+ "credentials must be dictionary or None");
+ return NULL;
+ }
+
/* Call rpc function */
- if (!(cli = open_pipe_creds(
- server_name, creds, cli_spoolss_initialise))) {
- fprintf(stderr, "could not initialise cli state\n");
+ if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
+ PyErr_SetString(spoolss_error, errstr);
+ free(errstr);
goto done;
}
- if (!(mem_ctx = talloc_init())) {
- fprintf(stderr, "unable to initialise talloc context\n");
+ if (!(mem_ctx = talloc_init("spoolss_enumprinterdrivers"))) {
+ PyErr_SetString(
+ spoolss_error, "unable to init talloc context\n");
goto done;
}
- werror = cli_spoolss_enumprinterdrivers(
- cli, mem_ctx, 0, &needed, level, arch,
+ werror = rpccli_spoolss_enumprinterdrivers(
+ cli->pipe_list, mem_ctx, level, arch,
&num_drivers, &ctr);
- if (W_ERROR_V(werror) == ERRinsufficientbuffer)
- werror = cli_spoolss_enumprinterdrivers(
- cli, mem_ctx, needed, NULL, level, arch,
- &num_drivers, &ctr);
-
if (!W_ERROR_IS_OK(werror)) {
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
goto done;
}
/* Return value */
-
+
switch (level) {
case 1:
result = PyDict_New();
py_from_DRIVER_INFO_1(&value, &ctr.info1[i]);
- PyDict_SetItemString(
- value, "level", PyInt_FromLong(1));
-
PyDict_SetItemString(result, name, value);
}
py_from_DRIVER_INFO_2(&value, &ctr.info2[i]);
- PyDict_SetItemString(
- value, "level", PyInt_FromLong(2));
-
PyDict_SetItemString(result, name, value);
}
py_from_DRIVER_INFO_3(&value, &ctr.info3[i]);
- PyDict_SetItemString(
- value, "level", PyInt_FromLong(3));
-
PyDict_SetItemString(result, name, value);
}
py_from_DRIVER_INFO_6(&value, &ctr.info6[i]);
- PyDict_SetItemString(
- value, "level", PyInt_FromLong(6));
-
PyList_SetItem(result, i, value);
}
break;
default:
- PyErr_SetString(spoolss_error, "unknown info level returned");
- result = NULL;
- break;
+ PyErr_SetString(spoolss_error, "unknown info level");
+ goto done;
}
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
- Py_INCREF(result);
return result;
}
PyObject *result = Py_None;
PRINTER_DRIVER_CTR ctr;
int level = 1;
- uint32 needed;
char *arch = "Windows NT x86";
+ int version = 2;
static char *kwlist[] = {"level", "arch", NULL};
/* Parse parameters */
- if (!PyArg_ParseTupleAndKeywords(args, kw, "|is", kwlist,
- &level, &arch))
+ if (!PyArg_ParseTupleAndKeywords(
+ args, kw, "|is", kwlist, &level, &arch))
return NULL;
/* Call rpc function */
- werror = cli_spoolss_getprinterdriver(
- hnd->cli, hnd->mem_ctx, 0, &needed, &hnd->pol, level,
- arch, &ctr);
-
- if (W_ERROR_V(werror) == ERRinsufficientbuffer)
- werror = cli_spoolss_getprinterdriver(
- hnd->cli, hnd->mem_ctx, needed, NULL, &hnd->pol,
- level, arch, &ctr);
+ werror = rpccli_spoolss_getprinterdriver(
+ hnd->cli, hnd->mem_ctx, &hnd->pol, level, arch, version, &ctr);
if (!W_ERROR_IS_OK(werror)) {
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
case 2:
py_from_DRIVER_INFO_2(&result, ctr.info2);
break;
+ case 3:
+ py_from_DRIVER_INFO_3(&result, ctr.info3);
+ break;
case 6:
- py_from_DRIVER_INFO_6(&result, ctr.info6);
+ py_from_DRIVER_INFO_6(&result, ctr.info6);
break;
default:
- break;
+ PyErr_SetString(spoolss_error, "unsupported info level");
+ return NULL;
}
Py_INCREF(result);
PyObject *kw)
{
WERROR werror;
- PyObject *result = Py_None, *creds = NULL;
+ PyObject *result = NULL, *creds = NULL;
DRIVER_DIRECTORY_CTR ctr;
- uint32 needed, level;
- char *arch = "Windows NT x86", *server_name;
+ uint32 level = 1;
+ char *arch = "Windows NT x86", *server, *errstr;
static char *kwlist[] = {"server", "level", "arch", "creds", NULL};
struct cli_state *cli = NULL;
TALLOC_CTX *mem_ctx = NULL;
/* Parse parameters */
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|isO!", kwlist,
- &server_name, &level, &arch,
- &PyDict_Type, &creds))
+ if (!PyArg_ParseTupleAndKeywords(
+ args, kw, "s|isO", kwlist, &server, &level,
+ &arch, &creds))
return NULL;
+ if (server[0] != '\\' || server[1] != '\\') {
+ PyErr_SetString(PyExc_ValueError, "UNC name required");
+ return NULL;
+ }
+
+ server += 2;
+
+ if (creds && creds != Py_None && !PyDict_Check(creds)) {
+ PyErr_SetString(PyExc_TypeError,
+ "credentials must be dictionary or None");
+ return NULL;
+ }
+
/* Call rpc function */
- if (!(cli = open_pipe_creds(
- server_name, creds, cli_spoolss_initialise))) {
- fprintf(stderr, "could not initialise cli state\n");
+ if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
+ PyErr_SetString(spoolss_error, errstr);
+ free(errstr);
goto done;
}
- if (!(mem_ctx = talloc_init())) {
- fprintf(stderr, "unable to initialise talloc context\n");
+ if (!(mem_ctx = talloc_init("spoolss_getprinterdriverdir"))) {
+ PyErr_SetString(
+ spoolss_error, "unable to init talloc context\n");
goto done;
}
- werror = cli_spoolss_getprinterdriverdir(
- cli, mem_ctx, 0, &needed, level, arch, &ctr);
-
- if (W_ERROR_V(werror) == ERRinsufficientbuffer)
- werror = cli_spoolss_getprinterdriverdir(
- cli, mem_ctx, needed, NULL, level, arch, &ctr);
+ werror = rpccli_spoolss_getprinterdriverdir(
+ cli->pipe_list, mem_ctx, level, arch, &ctr);
if (!W_ERROR_IS_OK(werror)) {
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
- return NULL;
+ goto done;
}
/* Return value */
case 1:
py_from_DRIVER_DIRECTORY_1(&result, ctr.info1);
break;
+ default:
+ PyErr_SetString(spoolss_error, "unknown info level");
+ goto done;
}
done:
if (mem_ctx)
talloc_destroy(mem_ctx);
- Py_INCREF(result);
return result;
}
PyObject *kw)
{
static char *kwlist[] = { "server", "info", "creds", NULL };
- char *server;
+ char *server, *errstr;
uint32 level;
- PyObject *info, *result = NULL, *creds = NULL, *level_obj;
+ PyObject *info, *result = NULL, *creds = NULL;
WERROR werror;
- TALLOC_CTX *mem_ctx;
- struct cli_state *cli;
+ TALLOC_CTX *mem_ctx = NULL;
+ struct cli_state *cli = NULL;
PRINTER_DRIVER_CTR ctr;
union {
DRIVER_INFO_3 driver_3;
} dinfo;
if (!PyArg_ParseTupleAndKeywords(
- args, kw, "sO!|O!", kwlist, &server, &PyDict_Type,
- &info, &PyDict_Type, &creds))
+ args, kw, "sO!|O", kwlist, &server, &PyDict_Type,
+ &info, &creds))
return NULL;
- if (server[0] == '\\' && server[1] == '\\')
+ if (server[0] == '\\' || server[1] == '\\')
server += 2;
- mem_ctx = talloc_init();
-
- if (!(cli = open_pipe_creds(server, creds, cli_spoolss_initialise)))
- goto done;
-
- if ((level_obj = PyDict_GetItemString(info, "level"))) {
-
- if (!PyInt_Check(level_obj)) {
- PyErr_SetString(spoolss_error,
- "level not an integer");
- goto done;
- }
+ if (creds && creds != Py_None && !PyDict_Check(creds)) {
+ PyErr_SetString(PyExc_TypeError,
+ "credentials must be dictionary or None");
+ return NULL;
+ }
- level = PyInt_AsLong(level_obj);
+ if (!(mem_ctx = talloc_init("spoolss_addprinterdriver"))) {
+ PyErr_SetString(
+ spoolss_error, "unable to init talloc context\n");
+ return NULL;
+ }
- /* Only level 2, 3 supported by NT */
+ if (!(cli = open_pipe_creds(server, creds, PI_SPOOLSS, &errstr))) {
+ PyErr_SetString(spoolss_error, errstr);
+ free(errstr);
+ goto done;
+ }
- if (level != 3) {
- PyErr_SetString(spoolss_error,
- "unsupported info level");
- goto done;
- }
+ if (!get_level_value(info, &level)) {
+ PyErr_SetString(spoolss_error, "invalid info level");
+ goto done;
+ }
- } else {
- PyErr_SetString(spoolss_error, "no info level present");
+ if (level != 3) {
+ PyErr_SetString(spoolss_error, "unsupported info level");
goto done;
}
-
+
ZERO_STRUCT(ctr);
-
+ ZERO_STRUCT(dinfo);
+
switch(level) {
case 3:
ctr.info3 = &dinfo.driver_3;
- if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info)) {
+ if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info, mem_ctx)) {
PyErr_SetString(spoolss_error,
"error converting to driver info 3");
goto done;
goto done;
}
- werror = cli_spoolss_addprinterdriver(cli, mem_ctx, level, &ctr);
+ werror = rpccli_spoolss_addprinterdriver(cli->pipe_list, mem_ctx, level, &ctr);
if (!W_ERROR_IS_OK(werror)) {
PyErr_SetObject(spoolss_werror, py_werror_tuple(werror));
result = Py_None;
done:
- cli_shutdown(cli);
- talloc_destroy(mem_ctx);
+ if (cli)
+ cli_shutdown(cli);
+
+ if (mem_ctx)
+ talloc_destroy(mem_ctx);
return result;