1851. [doc] Doxygen comment markup. [RT #11398]
This commit is contained in:
@@ -16,11 +16,13 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: alist.h,v 1.3 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: alist.h,v 1.4 2005/04/27 04:57:26 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_ALIST_H
|
||||
#define ISCCC_ALIST_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <isc/lang.h>
|
||||
|
||||
@@ -16,11 +16,13 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: base64.h,v 1.3 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: base64.h,v 1.4 2005/04/27 04:57:26 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_BASE64_H
|
||||
#define ISCCC_BASE64_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/lang.h>
|
||||
#include <isccc/types.h>
|
||||
|
||||
@@ -33,36 +35,36 @@ ISC_LANG_BEGINDECLS
|
||||
isc_result_t
|
||||
isccc_base64_encode(isccc_region_t *source, int wordlength,
|
||||
const char *wordbreak, isccc_region_t *target);
|
||||
/*
|
||||
/*%<
|
||||
* Convert data into base64 encoded text.
|
||||
*
|
||||
* Notes:
|
||||
* The base64 encoded text in 'target' will be divided into
|
||||
*\li The base64 encoded text in 'target' will be divided into
|
||||
* words of at most 'wordlength' characters, separated by
|
||||
* the 'wordbreak' string. No parentheses will surround
|
||||
* the text.
|
||||
*
|
||||
* Requires:
|
||||
* 'source' is a region containing binary data.
|
||||
* 'target' is a text region containing available space.
|
||||
* 'wordbreak' points to a null-terminated string of
|
||||
*\li 'source' is a region containing binary data.
|
||||
*\li 'target' is a text region containing available space.
|
||||
*\li 'wordbreak' points to a null-terminated string of
|
||||
* zero or more whitespace characters.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
isccc_base64_decode(const char *cstr, isccc_region_t *target);
|
||||
/*
|
||||
/*%<
|
||||
* Decode a null-terminated base64 string.
|
||||
*
|
||||
* Requires:
|
||||
* 'cstr' is non-null.
|
||||
* 'target' is a valid region.
|
||||
*\li 'cstr' is non-null.
|
||||
*\li 'target' is a valid region.
|
||||
*
|
||||
* Returns:
|
||||
* ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
|
||||
*\li #ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
|
||||
* fit in 'target'.
|
||||
* ISC_R_BADBASE64 -- 'cstr' is not a valid base64 encoding.
|
||||
* ISC_R_NOSPACE -- 'target' is not big enough.
|
||||
*\li #ISC_R_BADBASE64 -- 'cstr' is not a valid base64 encoding.
|
||||
*\li #ISC_R_NOSPACE -- 'target' is not big enough.
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
@@ -16,69 +16,90 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: cc.h,v 1.4 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: cc.h,v 1.5 2005/04/27 04:57:26 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_CC_H
|
||||
#define ISCCC_CC_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/lang.h>
|
||||
#include <isccc/types.h>
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
/*% Maximum Datagram Package */
|
||||
#define ISCCC_CC_MAXDGRAMPACKET 4096
|
||||
|
||||
/*% Message Type String */
|
||||
#define ISCCC_CCMSGTYPE_STRING 0x00
|
||||
/*% Message Type Binary Data */
|
||||
#define ISCCC_CCMSGTYPE_BINARYDATA 0x01
|
||||
/*% Message Type Table */
|
||||
#define ISCCC_CCMSGTYPE_TABLE 0x02
|
||||
/*% Message Type List */
|
||||
#define ISCCC_CCMSGTYPE_LIST 0x03
|
||||
|
||||
/*% Send to Wire */
|
||||
isc_result_t
|
||||
isccc_cc_towire(isccc_sexpr_t *alist, isccc_region_t *target,
|
||||
isccc_region_t *secret);
|
||||
|
||||
/*% Get From Wire */
|
||||
isc_result_t
|
||||
isccc_cc_fromwire(isccc_region_t *source, isccc_sexpr_t **alistp,
|
||||
isccc_region_t *secret);
|
||||
|
||||
/*% Create Message */
|
||||
isc_result_t
|
||||
isccc_cc_createmessage(isc_uint32_t version, const char *from, const char *to,
|
||||
isc_uint32_t serial, isccc_time_t now,
|
||||
isccc_time_t expires, isccc_sexpr_t **alistp);
|
||||
|
||||
/*% Create Acknowledgment */
|
||||
isc_result_t
|
||||
isccc_cc_createack(isccc_sexpr_t *message, isc_boolean_t ok,
|
||||
isccc_sexpr_t **ackp);
|
||||
|
||||
/*% Is Ack? */
|
||||
isc_boolean_t
|
||||
isccc_cc_isack(isccc_sexpr_t *message);
|
||||
|
||||
/*% Is Reply? */
|
||||
isc_boolean_t
|
||||
isccc_cc_isreply(isccc_sexpr_t *message);
|
||||
|
||||
/*% Create Response */
|
||||
isc_result_t
|
||||
isccc_cc_createresponse(isccc_sexpr_t *message, isccc_time_t now,
|
||||
isccc_time_t expires, isccc_sexpr_t **alistp);
|
||||
|
||||
/*% Define String */
|
||||
isccc_sexpr_t *
|
||||
isccc_cc_definestring(isccc_sexpr_t *alist, const char *key, const char *str);
|
||||
|
||||
/*% Define uint 32 */
|
||||
isccc_sexpr_t *
|
||||
isccc_cc_defineuint32(isccc_sexpr_t *alist, const char *key, isc_uint32_t i);
|
||||
|
||||
/*% Lookup String */
|
||||
isc_result_t
|
||||
isccc_cc_lookupstring(isccc_sexpr_t *alist, const char *key, char **strp);
|
||||
|
||||
/*% Lookup uint 32 */
|
||||
isc_result_t
|
||||
isccc_cc_lookupuint32(isccc_sexpr_t *alist, const char *key,
|
||||
isc_uint32_t *uintp);
|
||||
|
||||
/*% Create Symbol Table */
|
||||
isc_result_t
|
||||
isccc_cc_createsymtab(isccc_symtab_t **symtabp);
|
||||
|
||||
/*% Clean up Symbol Table */
|
||||
void
|
||||
isccc_cc_cleansymtab(isccc_symtab_t *symtab, isccc_time_t now);
|
||||
|
||||
/*% Check for Duplicates */
|
||||
isc_result_t
|
||||
isccc_cc_checkdup(isccc_symtab_t *symtab, isccc_sexpr_t *message,
|
||||
isccc_time_t now);
|
||||
|
||||
@@ -16,15 +16,18 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: ccmsg.h,v 1.4 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: ccmsg.h,v 1.5 2005/04/27 04:57:26 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_CCMSG_H
|
||||
#define ISCCC_CCMSG_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/lang.h>
|
||||
#include <isc/socket.h>
|
||||
|
||||
/*% ISCCC Message Structure */
|
||||
typedef struct isccc_ccmsg {
|
||||
/* private (don't touch!) */
|
||||
unsigned int magic;
|
||||
@@ -46,56 +49,56 @@ ISC_LANG_BEGINDECLS
|
||||
|
||||
void
|
||||
isccc_ccmsg_init(isc_mem_t *mctx, isc_socket_t *sock, isccc_ccmsg_t *ccmsg);
|
||||
/*
|
||||
/*%
|
||||
* Associate a cc message state with a given memory context and
|
||||
* TCP socket.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* "mctx" and "sock" be non-NULL and valid types.
|
||||
*\li "mctx" and "sock" be non-NULL and valid types.
|
||||
*
|
||||
* "sock" be a read/write TCP socket.
|
||||
*\li "sock" be a read/write TCP socket.
|
||||
*
|
||||
* "ccmsg" be non-NULL and an uninitialized or invalidated structure.
|
||||
*\li "ccmsg" be non-NULL and an uninitialized or invalidated structure.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
* "ccmsg" is a valid structure.
|
||||
*\li "ccmsg" is a valid structure.
|
||||
*/
|
||||
|
||||
void
|
||||
isccc_ccmsg_setmaxsize(isccc_ccmsg_t *ccmsg, unsigned int maxsize);
|
||||
/*
|
||||
/*%
|
||||
* Set the maximum packet size to "maxsize"
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* "ccmsg" be valid.
|
||||
*\li "ccmsg" be valid.
|
||||
*
|
||||
* 512 <= "maxsize" <= 4294967296
|
||||
*\li 512 <= "maxsize" <= 4294967296
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
isccc_ccmsg_readmessage(isccc_ccmsg_t *ccmsg,
|
||||
isc_task_t *task, isc_taskaction_t action, void *arg);
|
||||
/*
|
||||
/*%
|
||||
* Schedule an event to be delivered when a command channel message is
|
||||
* readable, or when an error occurs on the socket.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* "ccmsg" be valid.
|
||||
*\li "ccmsg" be valid.
|
||||
*
|
||||
* "task", "taskaction", and "arg" be valid.
|
||||
*\li "task", "taskaction", and "arg" be valid.
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* ISC_R_SUCCESS -- no error
|
||||
* Anything that the isc_socket_recv() call can return. XXXMLG
|
||||
*\li #ISC_R_SUCCESS -- no error
|
||||
*\li Anything that the isc_socket_recv() call can return. XXXMLG
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* The event delivered is a fully generic event. It will contain no
|
||||
*\li The event delivered is a fully generic event. It will contain no
|
||||
* actual data. The sender will be a pointer to the isccc_ccmsg_t.
|
||||
* The result code inside that structure should be checked to see
|
||||
* what the final result was.
|
||||
@@ -103,27 +106,27 @@ isccc_ccmsg_readmessage(isccc_ccmsg_t *ccmsg,
|
||||
|
||||
void
|
||||
isccc_ccmsg_cancelread(isccc_ccmsg_t *ccmsg);
|
||||
/*
|
||||
/*%
|
||||
* Cancel a readmessage() call. The event will still be posted with a
|
||||
* CANCELED result code.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* "ccmsg" be valid.
|
||||
*\li "ccmsg" be valid.
|
||||
*/
|
||||
|
||||
void
|
||||
isccc_ccmsg_invalidate(isccc_ccmsg_t *ccmsg);
|
||||
/*
|
||||
/*%
|
||||
* Clean up all allocated state, and invalidate the structure.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
* "ccmsg" be valid.
|
||||
*\li "ccmsg" be valid.
|
||||
*
|
||||
* Ensures:
|
||||
*
|
||||
* "ccmsg" is invalidated and disassociated with all memory contexts,
|
||||
*\li "ccmsg" is invalidated and disassociated with all memory contexts,
|
||||
* sockets, etc.
|
||||
*/
|
||||
|
||||
|
||||
@@ -16,14 +16,16 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: events.h,v 1.3 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: events.h,v 1.4 2005/04/27 04:57:26 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_EVENTS_H
|
||||
#define ISCCC_EVENTS_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/eventclass.h>
|
||||
|
||||
/*
|
||||
/*%
|
||||
* Registry of ISCCC event numbers.
|
||||
*/
|
||||
|
||||
|
||||
@@ -16,11 +16,13 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: lib.h,v 1.4 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: lib.h,v 1.5 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_LIB_H
|
||||
#define ISCCC_LIB_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/types.h>
|
||||
#include <isc/lang.h>
|
||||
|
||||
@@ -30,7 +32,7 @@ LIBISCCC_EXTERNAL_DATA extern isc_msgcat_t *isccc_msgcat;
|
||||
|
||||
void
|
||||
isccc_lib_initmsgcat(void);
|
||||
/*
|
||||
/*%
|
||||
* Initialize the ISCCC library's message catalog, isccc_msgcat, if it
|
||||
* has not already been initialized.
|
||||
*/
|
||||
|
||||
@@ -16,31 +16,39 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: result.h,v 1.5 2004/03/05 05:12:15 marka Exp $ */
|
||||
/* $Id: result.h,v 1.6 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_RESULT_H
|
||||
#define ISCCC_RESULT_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/lang.h>
|
||||
#include <isc/resultclass.h>
|
||||
#include <isc/result.h>
|
||||
|
||||
#include <isccc/types.h>
|
||||
|
||||
/*% Unknown Version */
|
||||
#define ISCCC_R_UNKNOWNVERSION (ISC_RESULTCLASS_ISCCC + 0)
|
||||
/*% Syntax Error */
|
||||
#define ISCCC_R_SYNTAX (ISC_RESULTCLASS_ISCCC + 1)
|
||||
/*% Bad Authorization */
|
||||
#define ISCCC_R_BADAUTH (ISC_RESULTCLASS_ISCCC + 2)
|
||||
/*% Expired */
|
||||
#define ISCCC_R_EXPIRED (ISC_RESULTCLASS_ISCCC + 3)
|
||||
/*% Clock Skew */
|
||||
#define ISCCC_R_CLOCKSKEW (ISC_RESULTCLASS_ISCCC + 4)
|
||||
/*% Duplicate */
|
||||
#define ISCCC_R_DUPLICATE (ISC_RESULTCLASS_ISCCC + 5)
|
||||
|
||||
#define ISCCC_R_NRESULTS 6 /* Number of results */
|
||||
#define ISCCC_R_NRESULTS 6 /*%< Number of results */
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
const char *
|
||||
isccc_result_totext(isc_result_t result);
|
||||
/*
|
||||
/*%
|
||||
* Convert a isccc_result_t into a string message describing the result.
|
||||
*/
|
||||
|
||||
|
||||
@@ -16,11 +16,13 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: sexpr.h,v 1.4 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: sexpr.h,v 1.5 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_SEXPR_H
|
||||
#define ISCCC_SEXPR_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <isc/lang.h>
|
||||
@@ -28,11 +30,13 @@
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
/*% dotted pair structure */
|
||||
struct isccc_dottedpair {
|
||||
isccc_sexpr_t *car;
|
||||
isccc_sexpr_t *cdr;
|
||||
};
|
||||
|
||||
/*% iscc_sexpr structure */
|
||||
struct isccc_sexpr {
|
||||
unsigned int type;
|
||||
union {
|
||||
@@ -42,7 +46,7 @@ struct isccc_sexpr {
|
||||
} value;
|
||||
};
|
||||
|
||||
#define ISCCC_SEXPRTYPE_NONE 0x00 /* Illegal. */
|
||||
#define ISCCC_SEXPRTYPE_NONE 0x00 /*%< Illegal. */
|
||||
#define ISCCC_SEXPRTYPE_T 0x01
|
||||
#define ISCCC_SEXPRTYPE_STRING 0x02
|
||||
#define ISCCC_SEXPRTYPE_DOTTEDPAIR 0x03
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: symtab.h,v 1.3 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: symtab.h,v 1.4 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_SYMTAB_H
|
||||
#define ISCCC_SYMTAB_H 1
|
||||
@@ -25,9 +25,8 @@
|
||||
***** Module Info
|
||||
*****/
|
||||
|
||||
/*
|
||||
* Symbol Table
|
||||
*
|
||||
/*! \file
|
||||
* \brief
|
||||
* Provides a simple memory-based symbol table.
|
||||
*
|
||||
* Keys are C strings. A type may be specified when looking up,
|
||||
@@ -39,11 +38,11 @@
|
||||
* exists in the table. What to do in this case is specified by the
|
||||
* client. Possible policies are:
|
||||
*
|
||||
* isccc_symexists_reject Disallow the define, returning ISC_R_EXISTS
|
||||
* isccc_symexists_replace Replace the old value with the new. The
|
||||
*\li isccc_symexists_reject Disallow the define, returning #ISC_R_EXISTS
|
||||
*\li isccc_symexists_replace Replace the old value with the new. The
|
||||
* undefine action (if provided) will be called
|
||||
* with the old <key, type, value> tuple.
|
||||
* isccc_symexists_add Add the new tuple, leaving the old tuple in
|
||||
*\li isccc_symexists_add Add the new tuple, leaving the old tuple in
|
||||
* the table. Subsequent lookups will retrieve
|
||||
* the most-recently-defined tuple.
|
||||
*
|
||||
|
||||
@@ -16,11 +16,13 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: symtype.h,v 1.3 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: symtype.h,v 1.4 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_SYMTYPE_H
|
||||
#define ISCCC_SYMTYPE_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#define ISCCC_SYMTYPE_ZONESTATS 0x0001
|
||||
#define ISCCC_SYMTYPE_CCDUP 0x0002
|
||||
#define ISCCC_SYMTYPE_TELLSERVICE 0x0003
|
||||
|
||||
@@ -16,20 +16,28 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: types.h,v 1.3 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: types.h,v 1.4 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_TYPES_H
|
||||
#define ISCCC_TYPES_H 1
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/boolean.h>
|
||||
#include <isc/int.h>
|
||||
#include <isc/result.h>
|
||||
|
||||
/*% isccc_time_t typedef */
|
||||
typedef isc_uint32_t isccc_time_t;
|
||||
|
||||
/*% isccc_sexpr_t typedef */
|
||||
typedef struct isccc_sexpr isccc_sexpr_t;
|
||||
/*% isccc_dottedpair_t typedef */
|
||||
typedef struct isccc_dottedpair isccc_dottedpair_t;
|
||||
/*% isccc_symtab_t typedef */
|
||||
typedef struct isccc_symtab isccc_symtab_t;
|
||||
|
||||
/*% iscc region structure */
|
||||
typedef struct isccc_region {
|
||||
unsigned char * rstart;
|
||||
unsigned char * rend;
|
||||
|
||||
@@ -16,17 +16,18 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: util.h,v 1.4 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: util.h,v 1.5 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
#ifndef ISCCC_UTIL_H
|
||||
#define ISCCC_UTIL_H 1
|
||||
|
||||
#include <isc/util.h>
|
||||
|
||||
/*
|
||||
/*! \file
|
||||
* \brief
|
||||
* Macros for dealing with unaligned numbers.
|
||||
*
|
||||
* Note: no side effects are allowed when invoking these macros!
|
||||
* \note no side effects are allowed when invoking these macros!
|
||||
*/
|
||||
|
||||
#define GET8(v, w) \
|
||||
@@ -193,7 +194,7 @@
|
||||
(r).rend = (r).rstart + strlen(s); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
/*%
|
||||
* Use this to remove the const qualifier of a variable to assign it to
|
||||
* a non-const variable or pass it as a non-const function argument ...
|
||||
* but only when you are sure it won't then be changed!
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: version.h,v 1.3 2004/03/05 05:12:16 marka Exp $ */
|
||||
/* $Id: version.h,v 1.4 2005/04/27 04:57:27 sra Exp $ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/platform.h>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user