shithub: catphone

ref: 489c503c2594f88d29d50b788915cf1ba74f66ac
dir: /dat.h/

View raw version
typedef enum {
	REGISTER,
	INVITE,
	ACK,
	BYE,
	CANCEL,
	OPTIONS,
	NOTIFY,
	SUBSCRIBE,
	INFO,
	MESSAGE,
	UPDATE,
	REFER
} SipMethod;

typedef enum {
	AMD5,
} SipAuthAlgo;

/* rfc3261 § 21 - Response Codes */
typedef enum {
	/* 1xx Provisional */
	Trying		= 100,
	Ringing		= 180,
	CallForwarded	= 181,
	Queued		= 182,
	SessionProgress	= 183,

	/* 2xx Successful */
	OK		= 200,

	/* 3xx Redirection */
	MultiChoice		= 300,
	MovedPerm		= 301,
	MovedTemp		= 302,
	UseProxy		= 305,
	AltService		= 380,

	/* 4xx Request Failure */
	BadRequest		= 400,
	Unauthorized		= 401,
	PaymentRequired		= 402,
	Forbidden		= 403,
	NotFound		= 404,
	MethodNotAllowed	= 405,
	RequestNotAcceptable	= 406,
	ProxyAuthRequired	= 407,
	RequestTimeout		= 408,
	Gone			= 410,
	EntityTooLarge		= 413,
	URITooLong		= 414,
	UnsupportedMedia	= 415,
	UnsupportedURIScheme	= 416,
	BadExtension		= 420,
	ExtensionRequired	= 421,
	IntervalTooBrief	= 423,
	TempUnavailable		= 480,
	CallDoesNotExist	= 481,
	LoopDetected		= 482,
	TooManyHops		= 483,
	AddressIncomplete	= 484,
	Ambiguous		= 485,
	BusyHere		= 486,
	RequestTerminated	= 487,
	NotAcceptableHere	= 488,
	RequestPending		= 491,
	Undecipherable		= 493,

	/* 5xx Server Failure */
	InternalError		= 500,
	NotImplemented		= 501,
	BadGateway		= 502,
	ServiceUnavailable	= 503,
	ServerTimeout		= 504,
	VersionNotSupported	= 505,
	MessageTooLarge		= 513,

	/* 6xx Global Failures */
	BusyEverywhere		= 600,
	Decline			= 603,
	DoesNotExistAnywhere	= 604,
	NotAcceptable		= 606,
	
} SipStatus;

typedef struct Hdr Hdr;
typedef struct Hdrtab Hdrtab;
typedef struct Sipmsg Sipmsg;
typedef struct Sip Sip;

struct Hdr
{
	char *name;
	char *value;
	Hdr *next;
};

struct Hdrtab
{
	Hdr *headers[13];
};

struct Sipmsg
{
	Hdrtab;

	struct {
		char *algo;
		char *realm;
		char *nonce;
		char *response;
	} auth;

	/* request */
	SipMethod method;
	char *uri;

	/* response */
	int code;
	char *reason;

	char *version;
	ulong len;
	char body[];
};

/* SIP UAC (see rfc3261 § 8.1, 12.1.2) */
struct Sip
{
	int version;

	NetConnInfo *nci;
	int fd;

	int (*reg)(Sip*, char*, char*);
};

#pragma varargck type "S" Sipmsg*

extern int debug;