1
/* Copyright (C) 2001,2002 Red Hat, Inc.
3
* This is free software; you can redistribute it and/or modify it under
4
* the terms of the GNU Library General Public License as published by
5
* the Free Software Foundation; either version 2 of the License, or
6
* (at your option) any later version.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
* General Public License for more details.
13
* You should have received a copy of the GNU Library General Public
14
* License along with this program; if not, write to the Free Software
15
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
#ident "$Id: misc.c,v 1.21 2005/09/12 21:52:02 mitr Exp $"
29
#include "../lib/user.h"
30
#include "../lib/user_private.h"
33
static PyTypeObject PromptType;
34
#define Prompt_Check(__x) ((__x)->ob_type == &PromptType)
36
static struct libuser_prompt *libuser_prompt_new(void);
39
libuser_admin_python_prompter(struct lu_prompt *prompts, int count,
40
gpointer callback_data,
41
struct lu_error **error)
43
PyObject *list = NULL, *tuple = NULL, *ret;
44
PyObject **prompt_data = (PyObject **) callback_data;
49
if (!PyCallable_Check(prompt_data[0])) {
50
lu_error_new(error, lu_error_generic, NULL);
51
PyErr_SetString(PyExc_RuntimeError,
52
"prompter is not callable");
57
for (i = 0; i < count; i++) {
58
struct libuser_prompt *prompt;
60
prompt = libuser_prompt_new();
61
prompt->prompt.key = g_strdup(prompts[i].key);
62
prompt->prompt.prompt = g_strdup(prompts[i].prompt);
63
prompt->prompt.domain = g_strdup(prompts[i].domain);
64
prompt->prompt.visible = prompts[i].visible;
65
prompt->prompt.default_value
66
= g_strdup(prompts[i].default_value);
67
prompt->prompt.value = g_strdup(prompts[i].value);
68
prompt->prompt.free_value = g_free;
69
PyList_Append(list, (PyObject *) prompt);
72
tuple = PyTuple_New(PyTuple_Check(prompt_data[1]) ?
73
PyTuple_Size(prompt_data[1]) + 1 : 1);
74
PyTuple_SetItem(tuple, 0, list);
75
if (PyTuple_Check(prompt_data[1])) {
76
for (i = 0; i < PyTuple_Size(prompt_data[1]); i++) {
79
obj = PyTuple_GetItem(prompt_data[1], i);
81
PyTuple_SetItem(tuple, i + 1, obj);
84
ret = PyObject_CallObject(prompt_data[0], tuple);
85
if (PyErr_Occurred()) {
89
lu_error_new(error, lu_error_generic,
91
("error while prompting for necessary information"));
94
for (i = 0; i < count; i++) {
95
struct libuser_prompt *prompt;
97
(struct libuser_prompt *) PyList_GetItem(list,
99
prompts[i].value = g_strdup(prompt->prompt.value);
100
prompts[i].free_value = g_free;
111
libuser_admin_prompt(struct libuser_admin *self, PyObject * args,
112
PyObject * kwargs, lu_prompt_fn * prompter)
115
PyObject *list = NULL, *item = NULL, *moreargs = NULL;
116
struct lu_prompt *prompts = NULL;
117
struct lu_error *error = NULL;
118
gboolean success = FALSE;
119
char *keywords[] = { "prompt_list", "more_args", NULL };
121
g_return_val_if_fail(self != NULL, NULL);
124
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O", keywords,
131
count = PyList_Size(list);
133
for (i = 0; i < count; i++) {
134
item = PyList_GetItem(list, i);
136
if (!Prompt_Check(item)) {
137
PyErr_SetString(PyExc_TypeError,
138
"expected list of Prompt objects");
145
count = PyList_Size(list);
147
prompts = g_malloc0(count * sizeof(struct lu_prompt));
150
for (i = 0; i < count; i++) {
151
struct libuser_prompt *obj;
152
obj = (struct libuser_prompt *) PyList_GetItem(list, i);
154
prompts[i].key = g_strdup(obj->prompt.key ? : "");
155
prompts[i].domain = g_strdup(obj->prompt.domain ? : "");
156
prompts[i].prompt = g_strdup(obj->prompt.prompt ? : "");
157
prompts[i].default_value =
158
obj->prompt.default_value ? g_strdup(obj->prompt.default_value) :
160
prompts[i].visible = obj->prompt.visible;
161
/* FIXME: free the values sometime? */
164
fprintf(stderr, "Prompter function promptConsole is at <%p>.\n",
167
"Prompter function promptConsoleQuiet is at <%p>.\n",
168
lu_prompt_console_quiet);
169
fprintf(stderr, "Calling prompter function at <%p>.\n", prompter);
171
success = prompter(prompts, count, self->prompt_data, &error);
173
for (i = 0; i < count; i++) {
174
struct libuser_prompt *obj;
175
obj = (struct libuser_prompt *) PyList_GetItem(list, i);
176
obj->prompt.value = g_strdup(prompts[i].value ? : "");
177
obj->prompt.free_value = (typeof(obj->prompt.free_value)) g_free;
178
if (prompts[i].value && prompts[i].free_value) {
179
prompts[i].free_value(prompts[i].value);
180
prompts[i].value = NULL;
181
prompts[i].free_value = NULL;
186
return Py_BuildValue("");
188
for (i = 0; i < count; i++) {
191
obj = PyList_GetItem(list, i);
194
PyErr_SetString(PyExc_RuntimeError,
195
"error prompting the user for information");
202
libuser_admin_prompt_console(PyObject * self, PyObject * args,
206
return libuser_admin_prompt((struct libuser_admin *) self, args,
207
kwargs, lu_prompt_console);
211
libuser_admin_prompt_console_quiet(PyObject * self, PyObject * args,
215
return libuser_admin_prompt((struct libuser_admin *) self, args,
216
kwargs, lu_prompt_console_quiet);
220
libuser_prompt_destroy(struct libuser_prompt *self)
223
if (self->prompt.value && self->prompt.free_value)
224
self->prompt.free_value(self->prompt.value);
225
g_free((void *)self->prompt.key);
226
g_free((void *)self->prompt.prompt);
227
g_free((void *)self->prompt.domain);
228
g_free((void *)self->prompt.default_value);
229
memset(&self->prompt, 0, sizeof(self->prompt));
235
libuser_prompt_getattr(struct libuser_prompt *self, char *attr)
238
if (strcmp(attr, "key") == 0) {
240
return PyString_FromString(self->prompt.key);
242
if (strcmp(attr, "prompt") == 0) {
244
return PyString_FromString(self->prompt.prompt);
246
if (strcmp(attr, "domain") == 0) {
248
return PyString_FromString(self->prompt.domain ?: "");
250
if (strcmp(attr, "visible") == 0) {
252
return PyInt_FromLong(self->prompt.visible);
254
if ((strcmp(attr, "default_value") == 0) ||
255
(strcmp(attr, "defaultValue") == 0)) {
258
default_value ? PyString_FromString(self->prompt.
262
if (strcmp(attr, "value") == 0) {
264
return self->prompt.value ? PyString_FromString(self->
270
return Py_FindMethod(NULL, (PyObject *) self, attr);
274
libuser_prompt_setattr(struct libuser_prompt *self, const char *attr,
278
if (strcmp(attr, "prompt") == 0) {
279
if (!PyString_Check(args)) {
280
PyErr_SetString(PyExc_TypeError,
281
"prompt must be a string");
285
g_free((char *) self->prompt.prompt);
286
self->prompt.prompt = g_strdup(PyString_AsString(args));
290
if (strcmp(attr, "domain") == 0) {
291
if (!PyString_Check(args)) {
292
PyErr_SetString(PyExc_TypeError,
293
"domain must be a string");
297
g_free((char *) self->prompt.domain);
298
self->prompt.domain = g_strdup(PyString_AsString(args));
302
if (strcmp(attr, "key") == 0) {
303
if (!PyString_Check(args)) {
304
PyErr_SetString(PyExc_TypeError,
305
"key must be a string");
309
g_free((char *) self->prompt.key);
310
self->prompt.key = g_strdup(PyString_AsString(args));
314
if (strcmp(attr, "visible") == 0) {
315
self->prompt.visible = PyObject_IsTrue(args);
319
if ((strcmp(attr, "default_value") == 0) ||
320
(strcmp(attr, "defaultValue") == 0)) {
321
if (!PyString_Check(args)) {
322
PyErr_SetString(PyExc_TypeError,
323
"default value must be a string");
327
g_free((char *) self->prompt.default_value);
328
self->prompt.default_value =
331
g_strdup(PyString_AsString(args));
335
if (strcmp(attr, "value") == 0) {
336
if (!PyString_Check(args)) {
337
PyErr_SetString(PyExc_TypeError,
338
"value must be a string");
342
if (self->prompt.value && self->prompt.free_value)
343
self->prompt.free_value(self->prompt.value);
344
self->prompt.value = g_strdup(PyString_AsString(args));
345
self->prompt.free_value =
346
(typeof(self->prompt.free_value)) g_free;
351
PyErr_SetString(PyExc_AttributeError, "invalid attribute");
356
libuser_prompt_print(struct libuser_prompt *self, FILE * fp, int flags)
360
"(key = \"%s\", prompt = \"%s\", domain = \"%s\", visible = %s, default_value = \"%s\", value = \"%s\")",
361
self->prompt.key ? : "",
362
self->prompt.prompt ? : "",
363
self->prompt.domain ? : "",
364
self->prompt.visible ? "true" : "false",
365
self->prompt.default_value ? : "",
366
self->prompt.value ? : "");
370
static struct libuser_prompt *
371
libuser_prompt_new(void)
373
struct libuser_prompt *ret = NULL;
375
ret = PyObject_NEW(struct libuser_prompt, &PromptType);
377
memset(&ret->prompt, 0, sizeof(ret->prompt));
383
static PyTypeObject PromptType = {
384
PyObject_HEAD_INIT(&PyType_Type)
387
sizeof(struct libuser_prompt),
390
(destructor) libuser_prompt_destroy,
391
(printfunc) libuser_prompt_print,
392
(getattrfunc) libuser_prompt_getattr,
393
(setattrfunc) libuser_prompt_setattr,
397
(PyNumberMethods *) NULL,
398
(PySequenceMethods *) NULL,
399
(PyMappingMethods *) NULL,