Go to the documentation of this file.
35 #include <arpa/inet.h>
36 #include <sys/types.h>
38 #include <netinet/in.h>
141 if (len <= 0 || !
buf) {
142 LOG(
llevDebug,
"IP '%s' sent bogus request_info_cmd information\n", ns->
host);
156 for (cp =
buf; *cp !=
'\0'; cp++)
162 if (!strcmp(
buf,
"image_info"))
164 else if (!strcmp(
buf,
"image_sums"))
166 else if (!strcmp(
buf,
"skill_info"))
168 else if (!strcmp(
buf,
"skill_extra"))
170 else if (!strcmp(
buf,
"spell_paths"))
172 else if (!strcmp(
buf,
"exp_table"))
174 else if (!strcmp(
buf,
"race_list"))
176 else if (!strcmp(
buf,
"race_info"))
178 else if (!strcmp(
buf,
"class_list"))
180 else if (!strcmp(
buf,
"class_info"))
182 else if (!strcmp(
buf,
"rules"))
184 else if (!strcmp(
buf,
"motd"))
186 else if (!strcmp(
buf,
"news"))
188 else if (!strcmp(
buf,
"newcharinfo"))
190 else if (!strcmp(
buf,
"startingmap"))
192 else if (!strcmp(
buf,
"knowledge_info"))
268 int command_count = 0;
269 while (command_count < 5 || (
pl && command_count < 25)) {
289 char *cmd = strtok_r((
char *)ns->
inbuf.
buf + 2,
" ", &
data);
300 if (got_player_cmd) {
335 static struct sockaddr_in insock;
338 struct protoent *protoent;
340 if ((protoent = getprotobyname(
"udp")) == NULL
341 || (fd = socket(PF_INET, SOCK_DGRAM, protoent->p_proto)) == -1) {
344 insock.sin_family = AF_INET;
345 insock.sin_port = htons((
unsigned short)13325);
346 insock.sin_addr.s_addr = inet_addr(
"127.0.0.1");
350 sendto(fd,
buf, strlen(
buf), 0, (
struct sockaddr *)&insock,
sizeof(insock));
358 struct timeval Timeout;
385 if (cycles%120000 == 0) {
391 if (cycles == 720000) {
396 Timeout.tv_usec = 50;
424 return fcntl(fd, F_GETFL) != -1 || errno != EBADF;
435 int newsocknum = -1, j;
436 #ifdef HAVE_GETNAMEINFO
437 struct sockaddr_storage addr;
439 struct sockaddr_in addr;
453 if (newsocknum == -1) {
469 if (newsocknum < 0) {
479 #ifndef HAVE_GETNAMEINFO
486 #ifdef HAVE_GETNAMEINFO
487 getnameinfo((
struct sockaddr *) &addr, addrlen,
buf,
sizeof(
buf), NULL, 0, NI_NUMERICHOST);
489 ip = ntohl(addr.sin_addr.s_addr);
490 snprintf(
buf,
sizeof(
buf),
"%ld.%ld.%ld.%ld", (
ip>>24)&255, (
ip>>16)&255, (
ip>>8)&255,
ip&255);
527 for (uint8_t
buf = 0;
buf <
pl->delayed_buffers_used;
buf++) {
530 pl->delayed_buffers_used = 0;
541 if (
pl->last_weight != -1 &&
pl->last_weight !=
WEIGHT(
pl->ob)) {
544 LOG(
llevError,
"esrv_update_item(UPD_WEIGHT) did not set player weight: is %lu, should be %lu\n", (
unsigned long)
pl->last_weight, (
unsigned long)
WEIGHT(
pl->ob));
550 if (
pl->socket->update_look)
552 if (
pl->socket->update_inventory) {
553 if (
pl->ob->container != NULL)
555 pl->socket->update_inventory = 0;
567 fd_set tmp_read, tmp_exceptions;
570 FD_ZERO(&tmp_exceptions);
574 LOG(
llevError,
"do_server: invalid waiting fd %d\n", i);
600 LOG(
llevError,
"do_server: invalid file descriptor for player %s [%s]: %d\n", (
pl->ob &&
pl->ob->name) ?
pl->ob->name :
"(unnamed player?)", (
pl->socket->host) ?
pl->socket->host :
"(unknown ip?)",
pl->socket->fd);
612 FD_SET((uint32_t)
pl->socket->fd, &tmp_read);
613 FD_SET((uint32_t)
pl->socket->fd, &tmp_exceptions);
622 if (sleep_time < 0) {
623 LOG(
llevInfo,
"skipping time (over by %ld ms)\n", -sleep_time/1000);
642 while (sleep_time > 0) {
648 if (errno != EINTR) {
652 }
else if (!pollret) {
681 if (FD_ISSET(
pl->socket->fd, &tmp_exceptions)) {
687 if (!keep_processing) {
688 FD_CLR(
pl->socket->fd, &tmp_read);
731 pl->socket->last_tick++;
738 if (
pl->socket->tick)
void request_info_cmd(char *buf, int len, socket_struct *ns)
void send_image_info(socket_struct *ns)
void send_image_sums(socket_struct *ns, char *params)
void reply_cmd(char *buf, int len, player *pl)
void tick_the_clock(void)
unsigned long total_ticktime
void init_connection(socket_struct *ns, const char *from_ip)
void LOG(LogLevel logLevel, const char *format,...)
socket_struct * init_sockets
static const struct client_cmd_mapping client_commands[]
void flush_old_maps(void)
void esrv_send_inventory(object *pl, object *op)
void SockList_AddString(SockList *sl, const char *data)
void mark_item_cmd(uint8_t *data, int len, player *pl)
static void send_updates(player *pl)
void send_new_char_info(socket_struct *ns)
void send_map_info(socket_struct *ns)
void send_exp_table(socket_struct *ns)
struct listen_info * listen
static int is_fd_valid(int fd)
void account_password(char *buf, int len, socket_struct *ns)
void send_skill_info(socket_struct *ns, char *params)
void account_login_cmd(char *buf, int len, socket_struct *ns)
void look_at_cmd(char *buf, int len, player *pl)
void knowledge_send_info(socket_struct *ns)
void final_free_player(player *pl)
void(* func_uint8_int_ns)(char *, int, socket_struct *)
void esrv_update_stats(player *pl)
void send_tick(player *pl)
void leave(player *pl, int draw_exit)
void ask_smooth_cmd(char *buf, int len, socket_struct *ns)
void account_add_player_cmd(char *buf, int len, socket_struct *ns)
void create_player_cmd(char *buf, int len, socket_struct *ns)
void new_player_cmd(uint8_t *buf, int len, player *pl)
long get_sleep_remaining()
void account_play_cmd(char *buf, int len, socket_struct *ns)
void SockList_Init(SockList *sl)
static void send_delayed_buffers(player *pl)
void move_cmd(char *buf, int len, player *pl)
void fatal(enum fatal_error err)
void send_class_info(socket_struct *ns, char *params)
int checkbanned(const char *login, const char *host)
void version_cmd(char *buf, int len, socket_struct *ns)
unsigned int tick_length(float seconds)
static void new_connection(int listen_fd)
void SockList_Term(SockList *sl)
void send_race_list(socket_struct *ns)
bool handle_client(socket_struct *ns, player *pl)
void free_newsocket(socket_struct *ns)
static void block_until_new_connection(void)
void inscribe_scroll_cmd(char *buf, int len, player *pl)
unsigned long max_ticktime
void send_class_list(socket_struct *ns)
#define FREE_AND_CLEAR(xyz)
void metaserver_update(void)
void esrv_update_item(int flags, object *pl, object *op)
void esrv_draw_look(object *pl)
void send_file(socket_struct *ns, const char *file)
void examine_cmd(char *buf, int len, player *pl)
static int handle_cmd(socket_struct *ns, player *pl, char *cmd, char *data, int len)
void SockList_ResetRead(SockList *sl)
void send_skill_extra(socket_struct *ns, char *params)
void send_spell_paths(socket_struct *ns)
void account_new_cmd(char *buf, int len, socket_struct *ns)
void lock_item_cmd(uint8_t *data, int len, player *pl)
int save_player(object *op, int flag)
static const struct player_cmd_mapping player_commands[]
unsigned long ticks_overtime
int SockList_ReadPacket(int fd, SockList *sl, int len)
void set_up_cmd(char *buf, int len, socket_struct *ns)
unsigned char buf[MAXSOCKBUF]
void send_race_info(socket_struct *ns, char *params)
const func_uint8_int_ns cmdproc
const func_uint8_int_pl cmdproc
void add_me_cmd(char *buf, int len, socket_struct *ns)
void draw_client_map(object *pl)
void Send_With_Handling(socket_struct *ns, SockList *sl)
void apply_cmd(char *buf, int len, player *pl)
void(* func_uint8_int_pl)(char *, int, player *)
void SockList_NullTerminate(SockList *sl)
void send_face_cmd(char *buff, int len, socket_struct *ns)
void init_listening_socket(socket_struct *ns)
bool connection_alive(const socket_struct *socket)