/*
   Unix SMB/CIFS implementation.
   Samba utility functions
   Copyright (C) Matthieu Patou <mat@matws.net> 2010

   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 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   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, see <http://www.gnu.org/licenses/>.
*/

#include <Python.h>

#ifndef Py_RETURN_NONE
#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
#endif

static void PyType_AddMethods(PyTypeObject *type, PyMethodDef *methods)
{
        PyObject *dict;
        int i;
        if (type->tp_dict == NULL)
                type->tp_dict = PyDict_New();
        dict = type->tp_dict;
        for (i = 0; methods[i].ml_name; i++) {
                PyObject *descr;
                if (methods[i].ml_flags & METH_CLASS)
                        descr = PyCFunction_New(&methods[i], (PyObject *)type);
                else
                        descr = PyDescr_NewMethod(type, &methods[i]);
                PyDict_SetItemString(dict, methods[i].ml_name,
                                     descr);
        }
}

static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);

static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
{
        va_list ap;
        char *s = NULL;
        int i;

        va_start(ap, format);
        vasprintf(&s, format, ap);
        va_end(ap);

        for (i=0;i<ndr->depth;i++) {
                printf("    ");
        }

        printf("%s\n", s);
        free(s);
}

static PyObject *py_ntacl_print(PyObject *self, PyObject *args)
{
	struct xattr_NTACL *ntacl = py_talloc_get_ptr(self);
	struct ndr_print *pr;
	TALLOC_CTX *mem_ctx;

	mem_ctx = talloc_new(NULL);

	pr = talloc_zero(mem_ctx, struct ndr_print);
	if (!pr) {
		PyErr_NoMemory();
		talloc_free(mem_ctx);
		return NULL;
	}
	pr->print = ntacl_print_debug_helper;
	ndr_print_xattr_NTACL(pr, "file", ntacl);

	talloc_free(mem_ctx);

	Py_RETURN_NONE;
}

static PyMethodDef py_ntacl_extra_methods[] = {
	{ "dump", (PyCFunction)py_ntacl_print, METH_NOARGS,
		NULL },
	{ NULL }
};

static void py_xattr_NTACL_patch(PyTypeObject *type)
{
	PyType_AddMethods(type, py_ntacl_extra_methods);
}

#define PY_NTACL_PATCH py_xattr_NTACL_patch