summaryrefslogtreecommitdiff
path: root/src/login/lclif.h
blob: 2abcb84558f0c9b458e0a8b726a7ad96b7930a2f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
 * This file is part of Hercules.
 * http://herc.ws - http://github.com/HerculesWS/Hercules
 *
 * Copyright (C) 2016-2020 Hercules Dev Team
 *
 * Hercules is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef LOGIN_LCLIF_H
#define LOGIN_LCLIF_H

#include "common/hercules.h"

/** @file
 * Login Client Interface.
 **/

/* Forward Declarations */
struct login_session_data;
struct lclif_interface_private;

/* Enums */
/// Parse function return code
enum parsefunc_rcode {
	PACKET_VALID         =  1,
	PACKET_INCOMPLETE    =  0,
	PACKET_UNKNOWN       = -1,
	PACKET_INVALIDLENGTH = -2,
	PACKET_STOPPARSE     = -3,
	PACKET_SKIP          = -4, //internal parser will skip this packet and go parser another, meant for plugins. [hemagx]
};

/* Function Typedefs */
typedef enum parsefunc_rcode (LoginParseFunc)(int fd, struct login_session_data *sd);

/* Structs */

/// Login packet DB entry
struct login_packet_db {
	int16 len;              ///< Packet length
	LoginParseFunc **pFunc; ///< Packet parsing function
};

/// The login clif (client interface) interface.
struct lclif_interface {
	struct lclif_interface_private *p; ///< Private interface

	/// Interface initialization.
	void (*init)(void);

	/// Interface finalization.
	void (*final)(void);

	/**
	 * Reports a connection error to the client.
	 *
	 * @param fd    Client connection file descriptor.
	 * @param error Error code.
	 * @see #PACKET_SC_NOTIFY_BAN.
	 */
	void (*connection_error)(int fd, uint8 error);

	/**
	 * Sends the character server list to the client.
	 *
	 * @param sd The client to send to.
	 * @return Success status.
	 * @retval false in case of failure (no server available).
	 * @see #PACKET_AC_ACCEPT_LOGIN.
	 */
	bool (*server_list)(struct login_session_data *sd);

	/**
	 * Reports an authentication failure to the client.
	 *
	 * @param fd    The client connection file descriptor.
	 * @param ban   The ban duration (if error == 6).
	 * @param error The authentication error code.
	 * @see #HEADER_AC_REFUSE_LOGIN.
	 * @see #HEADER_AC_REFUSE_LOGIN_R2.
	 */
	void (*auth_failed)(int fd, time_t ban, uint32 error);

	/**
	 * Reports a login error to the client.
	 *
	 * @param fd    Client connection file descriptor.
	 * @param error Error code.
	 * @see #PACKET_AC_REFUSE_LOGIN.
	 */
	void (*login_error)(int fd, uint8 error);

	/**
	 * Sends an authentication challenge to the client.
	 *
	 * @param fd Client connection file descriptor.
	 * @param sd The client to send to.
	 * @see #PACKET_AC_ACK_HASH.
	 */
	void (*coding_key)(int fd, struct login_session_data *sd);

	/**
	 * Retrieves a packet's data from the packet db.
	 *
	 * @param packet_id The packet id.
	 * @return The packet data.
	 * @retval NULL if the packet doesn't exist.
	 */
	const struct login_packet_db *(*packet)(int16 packet_id);

	/**
	 * Parses a packet.
	 *
	 * @param lpd Packet database entry.
	 * @param fd  Client connection file descriptor.
	 * @param sd  Session data.
	 * @return Parse result error code.
	 */
	enum parsefunc_rcode (*parse_packet)(const struct login_packet_db *lpd, int fd, struct login_session_data *sd);

	/**
	 * Packet parser loop function.
	 *
	 * Parses packets received from a client.
	 *
	 * @param fd Client connection file descriptor.
	 * @return error code.
	 * @retval 0 in case of success.
	 */
	int (*parse)(int fd);
};

#ifdef HERCULES_CORE
void lclif_defaults(void);
#endif

HPShared struct lclif_interface *lclif;

#endif // LOGIN_LCLIF_H