Esempio n. 1
0
static void
msg_unparse_macro(dbref player, dbref what, dbref perms, char *name, int argc, argv_typ argv, char *rest, int maxchars)
{
    const char   *ptr;
    char *ptr2;
    char    buf[BUFFER_LEN];
    char    buf2[BUFFER_LEN];
    dbref   obj;
    int     i, p = 0;

    strcpy(buf, rest);
    sprintf(buf2, "_msgmacs/%s", name);
    obj = what;
    ptr = get_mfunc(name);
    if (!ptr || !*ptr) ptr = safegetprop_strict(player, OWNER(obj), perms, buf2);
    if (!ptr || !*ptr) ptr = safegetprop_limited(player, obj, OWNER(obj), perms, buf2);
    if (!ptr || !*ptr) ptr = safegetprop_strict(player, 0, perms, buf2);
    while (ptr && *ptr && p < (maxchars - 1)) {
        if (*ptr == '\\') {
            if (*(ptr+1) == 'r') {
                rest[p++] = '\r';
		ptr++; ptr++;
            } else {
                rest[p++] = *(ptr++);
                rest[p++] = *(ptr++);
            }
        } else if (*ptr == MFUN_LEADCHAR) {
            if (*(ptr+1) == MFUN_ARGSTART && isdigit(*(ptr + 2)) &&
                    *(ptr + 3) == MFUN_ARGEND) {
                ptr++; ptr++;
                i = *(ptr++) - '1';
                ptr++;
                if (i >= argc || i < 0) {
                    ptr2 = NULL;
                } else {
                    ptr2 = argv[i];
                }
                while (ptr2 && *ptr2 && p < (maxchars - 1)) {
                    rest[p++] = *(ptr2++);
                }
            } else {
                rest[p++] = *(ptr++);
            }
        } else {
            rest[p++] = *(ptr++);
        }
    }
    ptr2 = buf;
    while (ptr2 && *ptr2 && p < (maxchars - 1)) {
        rest[p++] = *(ptr2++);
    }
    rest[p] = '\0';
}
Esempio n. 2
0
const char *
mfn_execbang(MFUNARGS)
{
	dbref trg = (dbref) 0, obj = what;
	const char *ptr, *pname;
	int blessed = 0;

	pname = argv[0];
	if (argc == 2) {
		obj = mesg_dbref(descr, player, what, perms, argv[1], mesgtyp);
	}
	if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME)
		ABORT_MPI("EXEC!", "Match failed.");
	if (obj == PERMDENIED)
		ABORT_MPI("EXEC!", "Permission denied.");
	while (*pname == PROPDIR_DELIMITER)
		pname++;
	ptr = safegetprop_strict(player, obj, perms, pname, mesgtyp, &blessed);
	if (!ptr)
		ABORT_MPI("EXEC!", "Failed read.");
	trg = what;
	if (blessed) {
		mesgtyp |= MPI_ISBLESSED;
	} else {
		mesgtyp &= ~MPI_ISBLESSED;
	}
	if (Prop_ReadOnly(pname) || Prop_Private(pname) || Prop_SeeOnly(pname) || Prop_Hidden(pname))
		trg = obj;
	ptr = mesg_parse(descr, player, obj, trg, ptr, buf, BUFFER_LEN, mesgtyp);
	CHECKRETURN(ptr, "EXEC!", "propval");
	return ptr;
}
Esempio n. 3
0
const char *
safegetprop_limited(dbref player, dbref what, dbref whom, dbref perms, const char *inbuf)
{
    const char *ptr;

    while (what != NOTHING) {
	if (OWNER(what) == whom || Wizard(what) ||
	    safegetprop_strict(player, what, perms, "~mpi_macros_ok")
	) {
	    ptr = safegetprop_strict(player, what, perms, inbuf);
	    if (!ptr || *ptr) return ptr;
	}
        what = getparent(what);
    }
    return "";
}
Esempio n. 4
0
const char *
mfn_showlist(MFUNARGS)
{
    dbref obj;
    const char *m = NULL;
    int lines=0;

    if(argc > 1) {
	obj = mesg_dbref_mage(player, what, perms, argv[1]);
	if (obj == AMBIGUOUS || obj == UNKNOWN || obj == NOTHING || obj == HOME)
	    ABORT_MPI("SHOWLIST","Match failed");
	if (obj == PERMDENIED)
	    ABORT_MPI("SHOWLIST",NOPERM_MESG);
    } else obj = what;

    if (Prop_Hidden(argv[0]) && (Permlevel(perms) < tp_hidden_prop_mlevel))
	ABORT_MPI("SHOWLIST",NOPERM_MESG);
    while ( (lines < MAX_MFUN_LIST_LEN) && (!lines || (m && *m)) ) {
	sprintf(buf, "%s#/%d", argv[0], ++lines);
	m = safegetprop_strict(player, obj, perms, buf);
	if( m && *m ) {
	    notify_nolisten(player, m, 1);
	}
    }
    buf[0] = '\0';
    return buf;
}
Esempio n. 5
0
int
msg_is_macro(dbref player, dbref what, dbref perms, const char *name)
{
    const char   *ptr;
    char    buf2[BUFFER_LEN];
    dbref   obj;

    if (!*name) return 0;
    sprintf(buf2, "_msgmacs/%s", name);
    obj = what;
    ptr = get_mfunc(name);
    if (!ptr || !*ptr) ptr = safegetprop_strict(player, OWNER(obj), perms, buf2);
    if (!ptr || !*ptr) ptr = safegetprop_limited(player, obj, OWNER(obj), perms, buf2);
    if (!ptr || !*ptr) ptr = safegetprop_strict(player, 0, perms, buf2);
    if (!ptr || !*ptr) return 0;
    return 1;
}
Esempio n. 6
0
const char *
safegetprop(dbref player, dbref what, dbref perms, const char *inbuf)
{
    const char *ptr;

    while (what != NOTHING) {
	ptr = safegetprop_strict(player, what, perms, inbuf);
        if (!ptr || *ptr) return ptr;
        what = getparent(what);
    }
    return "";
}
Esempio n. 7
0
const char *
safegetprop_limited(dbref player, dbref what, dbref whom, dbref perms, const char *inbuf, int mesgtyp, int* blessed)
{
	const char *ptr;

	while (what != NOTHING) {
		ptr = safegetprop_strict(player, what, perms, inbuf, mesgtyp, blessed);
		if (!ptr)
			return ptr;
		if (*ptr) {
			if (OWNER(what) == whom || *blessed) {
				return ptr;
			}
		}
		what = getparent(what);
	}
	return "";
}
Esempio n. 8
0
const char *
mfn_propbang(MFUNARGS)
{
	dbref obj = what;
	const char *ptr, *pname;
	int blessed = 0;

	pname = argv[0];
	if (argc == 2) {
		obj = mesg_dbref(descr, player, what, perms, argv[1], mesgtyp);
	}
	if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME)
		ABORT_MPI("PROP!", "Match failed.");
	if (obj == PERMDENIED)
		ABORT_MPI("PROP!", "Permission denied.");
	ptr = safegetprop_strict(player, obj, perms, pname, mesgtyp, &blessed);
	if (!ptr)
		ABORT_MPI("PROP!", "Failed read.");
	return ptr;
}
Esempio n. 9
0
const char *
mfn_select(MFUNARGS)
{
	char origprop[BUFFER_LEN];
	char propname[BUFFER_LEN];
	char bestname[BUFFER_LEN];
	dbref obj = what;
	dbref bestobj = 0;
	char *pname;
	const char *ptr;
	char *out, *in;
	int i, targval, bestval;
	int baselen;
	int limit;
	int blessed = 0;

	pname = argv[1];
	if (argc == 3) {
		obj = mesg_dbref(descr, player, what, perms, argv[2], mesgtyp);
	}
	if (obj == PERMDENIED)
		ABORT_MPI("SELECT", "Permission denied.");
	if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME)
		ABORT_MPI("SELECT", "Match failed.");

	/*
	 * Search contiguously for a bit, looking for a best match.
	 * This allows fast hits on LARGE lists.
	 */

	limit = 18;
	i = targval = atoi(argv[0]);
	do {
		ptr = get_list_item(player, obj, perms, (char *)pname, i--, mesgtyp, &blessed);
	} while (limit-->0 && i >= 0 && ptr && !*ptr);
	if (ptr == NULL)
		ABORT_MPI("SELECT", "Failed list read.");
	if (*ptr != '\0')
		return ptr;

	/*
	 * If we didn't find it before, search only existing props.
	 * This gets fast hits on very SPARSE lists.
	 */

	/* First, normalize the base propname */
	out = origprop;
	in = argv[1];
	while (*in != '\0') {
		*out++ = PROPDIR_DELIMITER;
		while (*in == PROPDIR_DELIMITER) in++;
		while (*in && *in != PROPDIR_DELIMITER) *out++ = *in++;
	}
	*out++ = '\0';

	i = targval;
	bestname[0] = '\0';
	bestval = 0;
	baselen = strlen(origprop);
	for (; obj != NOTHING; obj = getparent(obj)) {
		pname = next_prop_name(obj, propname, sizeof(propname), origprop);
		while (pname && string_prefix(pname, origprop)) {
			ptr = pname + baselen;
			if (*ptr == NUMBER_TOKEN) ptr++;
			if (!*ptr && is_propdir(obj, pname)) {
				char propname2[BUFFER_LEN];
				char *pname2;
				int sublen = strlen(pname);

				pname2 = strcpyn(propname2, sizeof(propname2), pname);
				propname2[sublen++] = PROPDIR_DELIMITER;
				propname2[sublen] = '\0';

				pname2 = next_prop_name(obj, propname2, sizeof(propname2), pname2);
				while (pname2) {
					ptr = pname2 + sublen;
					if (number(ptr)) {
						i = atoi(ptr);
						if (bestval < i && i <= targval) {
							bestval = i;
							bestobj = obj;
							strcpyn(bestname, sizeof(bestname), pname2);
						}
					}
					pname2 = next_prop_name(obj, propname2, sizeof(propname2), pname2);
				}
			}
			ptr = pname + baselen;
			if (number(ptr)) {
				i = atoi(ptr);
				if (bestval < i && i <= targval) {
					bestval = i;
					bestobj = obj;
					strcpyn(bestname, sizeof(bestname), pname);
				}
			}
			pname = next_prop_name(obj, propname, sizeof(propname), pname);
		}
	}
	
	if (*bestname) {
		ptr = safegetprop_strict(player, bestobj, perms, bestname, mesgtyp, &blessed);
		if (!ptr)
			ABORT_MPI("SELECT", "Failed property read.");
	} else {
		ptr = "";
	}
	return ptr;
}