const char * mfn_rand(MFUNARGS) { int num = 0; dbref trg = (dbref) 0, obj = what; const char *pname, *ptr; int blessed = 0; pname = argv[0]; if (argc == 2) { obj = mesg_dbref(descr, player, what, perms, argv[1], mesgtyp); } if (obj == PERMDENIED) ABORT_MPI("RAND", "Permission denied."); if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME) ABORT_MPI("RAND", "Match failed."); num = get_list_count(what, obj, perms, (char *)pname, mesgtyp, &blessed); if (!num) ABORT_MPI("RAND", "Failed list read."); ptr = get_list_item(what, obj, perms, (char *)pname, (((RANDOM() / 256) % num) + 1), mesgtyp, &blessed); if (!ptr) ABORT_MPI("RAND", "Failed list read."); trg = what; if (blessed) { mesgtyp |= MPI_ISBLESSED; } else { mesgtyp &= ~MPI_ISBLESSED; } if (Prop_ReadOnly(ptr) || Prop_Private(ptr) || Prop_SeeOnly(ptr) || Prop_Hidden(ptr)) trg = obj; ptr = mesg_parse(descr, player, obj, trg, ptr, buf, BUFFER_LEN, mesgtyp); CHECKRETURN(ptr, "RAND", "listval"); return ptr; }
int prop_write_perms(dbref player, dbref obj, const char *name, int mlev) { if (Prop_System(name)) return 0; if (mlev < 3) { if (!permissions(player, obj)) { if (Prop_Private(name)) return 0; if (Prop_ReadOnly(name)) return 0; if (!string_compare(name, "sex")) return 0; } if (string_prefix(name, "_msgmacs/")) return 0; } if (mlev < 4) { if (Prop_SeeOnly(name)) return 0; if (Prop_Hidden(name)) return 0; } return 1; }
const char * mfn_lexec(MFUNARGS) { dbref trg = (dbref) 0, obj = what; char *pname; const char *ptr; int blessed = 0; pname = argv[0]; if (argc == 2) { obj = mesg_dbref(descr, player, what, perms, argv[1], mesgtyp); } if (obj == PERMDENIED) ABORT_MPI("LEXEC", "Permission denied."); if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME) ABORT_MPI("LEXEC", "Match failed."); while (*pname == PROPDIR_DELIMITER) pname++; ptr = get_concat_list(player, what, perms, obj, (char *)pname, buf, BUFFER_LEN, 2, mesgtyp, &blessed); if (!ptr) ptr = ""; 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, "LEXEC", "listval"); return ptr; }
const char * safegetprop_strict(dbref player, dbref what, dbref perms, const char *inbuf) { const char *ptr; char bbuf[BUFFER_LEN]; static char vl[32]; if (!inbuf) { notify_nolisten(player, "PropFetch: Propname required.", 1); return NULL; } while (*inbuf == PROPDIR_DELIMITER) inbuf++; if (!*inbuf) { notify_nolisten(player, "PropFetch: Propname required.", 1); return NULL; } strcpy(bbuf, inbuf); ptr = get_property_class(what, bbuf); if (!ptr) { int i; i = get_property_value(what, bbuf); if (!i) { dbref dd; dd = get_property_dbref(what, bbuf); if (dd == NOTHING) { *vl = '\0'; ptr = vl; return ptr; } else { sprintf(vl, "#%d", dd); ptr = vl; } } else { sprintf(vl, "%d", i); ptr = vl; } } #ifdef COMPRESS ptr = uncompress(ptr); #endif if (!Wizperms(perms)) { if (Prop_Hidden(bbuf)) { notify_nolisten(player, "PropFetch: Permission denied.", 1); return NULL; } // if (Prop_Private(bbuf) && OWNER(perms) != OWNER(what)) { if (Prop_Private(bbuf) && !controls_nowizperm(OWNER(perms), what)) { notify_nolisten(player, "PropFetch: Permission denied.", 1); return NULL; } } return ptr; }
int prop_read_perms(dbref player, dbref obj, const char *name, int mlev) { if (Prop_System(name)) return 0; if ((mlev < 3) && Prop_Private(name) && !permissions(player, obj)) return 0; if ((mlev < 4) && Prop_Hidden(name)) return 0; return 1; }
const char * mfn_timesub(MFUNARGS) { int num = 0; dbref trg = (dbref) 0, obj = what; const char *pname, *ptr; int period = 0, offset = 0; int blessed = 0; period = atoi(argv[0]); offset = atoi(argv[1]); pname = argv[2]; if (argc == 4) { obj = mesg_dbref(descr, player, what, perms, argv[3], mesgtyp); } if (obj == PERMDENIED) ABORT_MPI("TIMESUB", "Permission denied."); if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME) ABORT_MPI("TIMESUB", "Match failed."); num = get_list_count(what, obj, perms, (char *)pname, mesgtyp, &blessed); if (!num) ABORT_MPI("TIMESUB", "Failed list read."); if (period < 1) ABORT_MPI("TIMESUB", "Time period too short."); offset = (int)((((long) time(NULL) + offset) % period) * num) / period; if (offset < 0) offset = -offset; ptr = get_list_item(what, obj, perms, (char *)pname, offset + 1, mesgtyp, &blessed); if (!ptr) ABORT_MPI("TIMESUB", "Failed list read."); trg = what; if (blessed) { mesgtyp |= MPI_ISBLESSED; } else { mesgtyp &= ~MPI_ISBLESSED; } if (Prop_ReadOnly(ptr) || Prop_Private(ptr) || Prop_SeeOnly(ptr) || Prop_Hidden(ptr)) trg = obj; ptr = mesg_parse(descr, player, obj, trg, ptr, buf, BUFFER_LEN, mesgtyp); CHECKRETURN(ptr, "TIMESUB", "listval"); return ptr; }
const char * mfn_indexbang(MFUNARGS) { dbref trg = (dbref) 0, obj = what; dbref tmpobj = (dbref) 0; const char *pname, *ptr; 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("INDEX!", "Match failed."); if (obj == PERMDENIED) ABORT_MPI("INDEX!", "Permission denied."); tmpobj = obj; ptr = safegetprop_strict(player, obj, perms, pname, mesgtyp, &blessed); if (!ptr) ABORT_MPI("INDEX!", "Failed read."); if (!*ptr) return ""; obj = tmpobj; ptr = safegetprop_strict(player, obj, perms, ptr, mesgtyp, &blessed); if (!ptr) ABORT_MPI("INDEX!", "Failed read."); trg = what; if (blessed) { mesgtyp |= MPI_ISBLESSED; } else { mesgtyp &= ~MPI_ISBLESSED; } if (Prop_ReadOnly(ptr) || Prop_Private(ptr) || Prop_SeeOnly(ptr) || Prop_Hidden(ptr)) trg = obj; ptr = mesg_parse(descr, player, obj, trg, ptr, buf, BUFFER_LEN, mesgtyp); CHECKRETURN(ptr, "INDEX!", "listval"); return ptr; }
const char * mfn_listprops(MFUNARGS) { dbref obj = what; char *ptr, *pname; char *endbuf, *pattern; char tmpbuf[BUFFER_LEN]; char patbuf[BUFFER_LEN]; char pnamebuf[BUFFER_LEN]; int flag; strcpyn(pnamebuf, sizeof(pnamebuf), argv[0]); pname = pnamebuf; if (argc > 1) { obj = mesg_dbref(descr, player, what, perms, argv[1], mesgtyp); } if (obj == UNKNOWN || obj == AMBIGUOUS || obj == NOTHING || obj == HOME) ABORT_MPI("LISTPROPS", "Match failed."); if (obj == PERMDENIED) ABORT_MPI("LISTPROPS", "Permission denied."); if (argc > 2) { pattern = argv[2]; } else { pattern = NULL; } endbuf = pname + strlen(pname); if (endbuf != pname) { endbuf--; } if (*endbuf != PROPDIR_DELIMITER && (endbuf - pname) < (BUFFER_LEN - 2)) { if (*endbuf != '\0') endbuf++; *endbuf++ = PROPDIR_DELIMITER; *endbuf++ = '\0'; } *buf = '\0'; endbuf = buf; do { ptr = next_prop_name(obj, tmpbuf, (int) sizeof(tmpbuf), pname); if (ptr && *ptr) { flag = 1; if (Prop_System(ptr)) { flag = 0; } else if (!(mesgtyp & MPI_ISBLESSED)) { if (Prop_Hidden(ptr)) { flag = 0; } if (Prop_Private(ptr) && OWNER(what) != OWNER(obj)) { flag = 0; } if (obj != player && OWNER(obj) != OWNER(what)) { flag = 0; } } if ((flag != 0) && (pattern != NULL)) { char *nptr; nptr = rindex(ptr, PROPDIR_DELIMITER); if (nptr && *nptr) { strcpyn(patbuf, sizeof(patbuf), ++nptr); if (!equalstr(pattern, patbuf)) { flag = 0; } } } if (flag) { int entrylen = strlen(ptr); if ((endbuf - buf) + entrylen + 2 < BUFFER_LEN) { if (*buf != '\0') { *endbuf++ = '\r'; } strcpyn(endbuf, BUFFER_LEN - (endbuf - buf), ptr); endbuf += entrylen; } } } pname = ptr; } while (ptr && *ptr); return buf; }
const char * safegetprop_strict(dbref player, dbref what, dbref perms, const char *inbuf, int mesgtyp, int* blessed) { const char *ptr; char bbuf[BUFFER_LEN]; static char vl[32]; *blessed = 0; if (!inbuf) { notify_nolisten(player, "PropFetch: Propname required.", 1); return NULL; } while (*inbuf == PROPDIR_DELIMITER) inbuf++; if (!*inbuf) { notify_nolisten(player, "PropFetch: Propname required.", 1); return NULL; } strcpyn(bbuf, sizeof(bbuf), inbuf); if (Prop_System(bbuf)) { notify_nolisten(player, "PropFetch: Permission denied.", 1); return NULL; } if (!(mesgtyp & MPI_ISBLESSED)) { if (Prop_Hidden(bbuf)) { notify_nolisten(player, "PropFetch: Permission denied.", 1); return NULL; } if (Prop_Private(bbuf) && OWNER(perms) != OWNER(what)) { notify_nolisten(player, "PropFetch: Permission denied.", 1); return NULL; } } ptr = get_property_class(what, bbuf); if (!ptr) { int i; i = get_property_value(what, bbuf); if (!i) { dbref dd; dd = get_property_dbref(what, bbuf); if (dd == NOTHING) { *vl = '\0'; ptr = vl; return ptr; } else { snprintf(vl, sizeof(vl), "#%d", dd); ptr = vl; } } else { snprintf(vl, sizeof(vl), "%d", i); ptr = vl; } } if (ptr) { if (Prop_Blessed(what, bbuf)) { *blessed = 1; } } return ptr; }