Artifact [ea0b14db3c]

Artifact ea0b14db3caccd06b82c9049d18e2ddce844e33f0de7aefb7a4a74c3ad586fdf:


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
   100
   101
   102
   103
   104
   105
   106
   107
   108
   109
   110
   111
   112
   113
   114
   115
   116
   117
   118
   119
   120
   121
   122
   123
   124
   125
   126
   127
   128
   129
   130
   131
   132
   133
   134
   135
   136
   137
   138
   139
   140
   141
   142
   143
   144
   145
   146
   147
   148
   149
   150
   151
   152
   153
   154
   155
   156
   157
   158
   159
   160
   161
   162
   163
   164
   165
   166
   167
   168
   169
   170
   171
   172
   173
   174
   175
   176
   177
   178
/*
 * Copyright (c) 2015,2018 Stuart Cassoff <stwo@users.sourceforge.net>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/* Tcl / Jim interface to pledge(3). */


#ifdef __cplusplus
extern "C" {
#endif

#include <unistd.h>	/* pledge    */
#include <errno.h>	/* errno     */
#include <string.h>	/* strerror  */

#define EZT_NO_GETINT 1
#include "ezt_tj.h"	/* Tcl / Jim */

static EZT_CMD(TJPledge_LICENSE_Cmd);
static EZT_CMD(TJPledge_ABOUT_Cmd);

static EZT_CMD(TJPledge_Pledge_Cmd);

/***/

static
EZT_CMD(TJPledge_Pledge_Cmd) {
	const char *p, *proms[2] = {NULL, NULL};
	int i, len;

	if (objc < 2 || objc > 3) {
		Ezt_WrongNumArgs(interp, 1, objv, "promises ?execpromises?");
		return EZT_ERROR;
	}

	objc--; objv++;

	for (i = 0; i < objc; i++) {
		p = Ezt_GetString(objv[i], &len);
		if (len == 0) {
			proms[i] = "";
		} else if (len > 1 || *p != '.') {
			proms[i] = p;
		}
	}

	if (pledge(proms[0], proms[1]) == -1) {
		Ezt_SetResult(Ezt_NewStr(Ezt_PosixError()));
		return EZT_ERROR;
	}

	return EZT_OK;
}

/***/

static
EZT_CMD(TJPledge_LICENSE_Cmd) {
	Ezt_Obj *o;
	if (objc != 1) { Ezt_WrongNumArgs(interp, 1, objv, NULL); return EZT_ERROR; }
	o = Ezt_NewDict();
	Ezt_IncrRefCount(o);
	Ezt_DictPut(o, Ezt_NewStr("type"), Ezt_NewStr("ISC"));
	Ezt_DictPut(o, Ezt_NewStr("text"), Ezt_NewStr(
		"Copyright (c) 2015,2018 Stuart Cassoff <stwo@users.sourceforge.net>\n"
		"\n"
		"Permission to use, copy, modify, and distribute this software for any\n"
		"purpose with or without fee is hereby granted, provided that the above\n"
		"copyright notice and this permission notice appear in all copies.\n"
		"\n"
		"THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n"
		"WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n"
		"MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n"
		"ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n"
		"WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n"
		"ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n"
		"OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE."
	));
	Ezt_SetResult(o);
	Ezt_DecrRefCount(o);
	return EZT_OK;
}

EZT_CMD(TJPledge_ABOUT_Cmd) {
	Ezt_Obj *o;
	if (objc != 1) {
		Ezt_WrongNumArgs(interp, 1, objv,
#ifdef FOR_JIM
			""
#else
			NULL
#endif
		);
		return EZT_ERROR;
	}
	o = Ezt_NewDict();
	Ezt_IncrRefCount(o);
	Ezt_DictPut(o, Ezt_NewStr("name")    , Ezt_NewStr("pledge"));
	Ezt_DictPut(o, Ezt_NewStr("title")   , Ezt_NewStr("TJPledge"));
	Ezt_DictPut(o, Ezt_NewStr("descr")   , Ezt_NewStr("pledge(2) for " FOR_WHAT));
	Ezt_DictPut(o, Ezt_NewStr("author")  , Ezt_NewStr("Stuart Cassoff"));
	Ezt_DictPut(o, Ezt_NewStr("when")    , Ezt_NewStr("Spring 2018"));
	Ezt_DictPut(o, Ezt_NewStr("version") , Ezt_NewStr(PACKAGE_VERSION));
	Ezt_SetResult(o);
	Ezt_DecrRefCount(o);
	return EZT_OK;
}

/***/

#ifdef FOR_JIM
int
Jim_pledgeInit (Jim_Interp *interp) {
	if (Jim_CreateCommand(interp, "pledge", TJPledge_Pledge_Cmd, NULL, NULL)   != JIM_OK) { return JIM_ERR; }
	if (Jim_CreateCommand(interp, "{pledge LICENSE}", TJPledge_LICENSE_Cmd, NULL, NULL)   != JIM_OK) { return JIM_ERR; }
	if (Jim_CreateCommand(interp, "{pledge ABOUT}", TJPledge_ABOUT_Cmd, NULL, NULL)   != JIM_OK) { return JIM_ERR; }
	if (Jim_PackageProvide(interp, PACKAGE_NAME, PACKAGE_VERSION, JIM_ERRMSG) != JIM_OK) { return JIM_ERR; }
	return JIM_OK;
}
#else

#define MIN_TCL_VERSION "8.6"
#define TJPledge_NS "::pledge"
#define TJPledge_CMD "pledge"

static int
TJPledge_CommonInit (
	Tcl_Interp *interp
) {
	if (Tcl_InitStubs       (interp, MIN_TCL_VERSION, 0)        == NULL)   { return TCL_ERROR; }
	if (Tcl_PkgRequire      (interp, "Tcl", MIN_TCL_VERSION, 0) == NULL)   { return TCL_ERROR; }
	if (Tcl_CreateNamespace (interp, TJPledge_NS, NULL, NULL)       == NULL)   { return TCL_ERROR; }
	if (Tcl_PkgProvide      (interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) { return TCL_ERROR; }
	return TCL_OK;
}

EXTERN int
Pledge_Init (
	Tcl_Interp *interp
) {
	Tcl_Namespace *ns;

	if (TJPledge_CommonInit(interp) != TCL_OK) { return TCL_ERROR; }
	if ((ns = Tcl_FindNamespace(interp, TJPledge_NS, NULL, TCL_LEAVE_ERR_MSG)) == NULL) { return TCL_ERROR; }
	if (Tcl_CreateObjCommand(interp, TJPledge_NS "::" TJPledge_CMD, TJPledge_Pledge_Cmd, NULL, NULL) == NULL) { return TCL_ERROR; }
	if (Tcl_Export(interp, ns, TJPledge_CMD, 0) != TCL_OK) { return TCL_ERROR; }
	if (Tcl_CreateObjCommand(interp, TJPledge_NS "::" "LICENSE", TJPledge_LICENSE_Cmd, NULL, NULL) == NULL) { return TCL_ERROR; }
	if (Tcl_CreateObjCommand(interp, TJPledge_NS "::" "ABOUT", TJPledge_ABOUT_Cmd, NULL, NULL) == NULL) { return TCL_ERROR; }

	return TCL_OK;
}

EXTERN int
Pledge_SafeInit (
	Tcl_Interp *interp
) {
	return TJPledge_CommonInit(interp);
}
#endif /* FOR_JIM / FOR_TCL */

#ifdef __cplusplus
}
#endif

/* EOF */