+ /* can't modify a G-line that doesn't exist...
+ * (and if we are creating a new one, we need a reason and expiration)
+ */
+ if (!agline &&
+ (action == GLINE_MODIFY || action == GLINE_LOCAL_ACTIVATE ||
+ action == GLINE_LOCAL_DEACTIVATE || !reason || !expire))
+ return send_reply(sptr, ERR_NOSUCHGLINE, mask);
+
+ /* check for G-line permissions... */
+ if (action == GLINE_LOCAL_ACTIVATE || action == GLINE_LOCAL_DEACTIVATE) {
+ /* only need local privileges for locally-limited status changes */
+ if (!HasPriv(sptr, PRIV_LOCAL_GLINE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
+ } else { /* global privileges required */
+ if (!feature_bool(FEAT_CONFIG_OPERCMDS))
+ return send_reply(sptr, ERR_DISABLED, "GLINE");
+ else if (!HasPriv(sptr, PRIV_GLINE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
+ }
+
+ Debug((DEBUG_DEBUG, "I have a global G-line I am acting upon now; "
+ "target %s, mask %s, operforce %s, action %s, expire %Tu, "
+ "reason: %s; gline %s! (fields present: %s %s)", target,
+ mask, flags & GLINE_OPERFORCE ? "YES" : "NO",
+ action == GLINE_ACTIVATE ? "+" :
+ (action == GLINE_DEACTIVATE ? "-" :
+ (action == GLINE_LOCAL_ACTIVATE ? ">" :
+ (action == GLINE_LOCAL_DEACTIVATE ? "<" : "(MODIFY)"))),
+ expire, reason, agline ? "EXISTS" : "does not exist",
+ flags & GLINE_EXPIRE ? "expire" : "",
+ flags & GLINE_REASON ? "reason" : ""));
+
+ if (agline) /* modifying an existing G-line */
+ return gline_modify(cptr, sptr, agline, action, reason, expire,
+ TStime(), 0, flags);
+
+ assert(action != GLINE_LOCAL_ACTIVATE);
+ assert(action != GLINE_LOCAL_DEACTIVATE);
+ assert(action != GLINE_MODIFY);
+
+ /* create a new G-line */
+ return gline_add(cptr, sptr, mask, reason, expire, TStime(), 0,
+ flags | ((action == GLINE_ACTIVATE) ? GLINE_ACTIVE : 0));