/* tells the server who am i */ TEG_STATUS out_id() { if( ESTADO_MAYOR_IGUAL(PLAYER_STATUS_CONNECTED ) ) return TEG_STATUS_ERROR; strip_invalid(g_game.myname); net_printf( g_game.fd, TOKEN_PLAYERID"=%s,%d,%d\n", g_game.myname, !g_game.observer, g_game.human ); return TEG_STATUS_SUCCESS; }
/* find the internet address of a player */ TEG_STATUS aux_find_inaddr( PSPLAYER pJ ) { struct sockaddr *sa; socklen_t slen = 128; assert(pJ); strncpy(pJ->addr, _("Unknown"), sizeof(pJ->addr)-1); #ifdef WITH_GGZ if(g_server.with_ggz) { strncpy(pJ->addr, _("GGZ Client"), sizeof(pJ->addr)-1); return TEG_STATUS_SUCCESS; } #endif /* WITH_GGZ */ if( pJ->fd <= 0) return TEG_STATUS_ERROR; if( (sa=malloc(slen)) == NULL ) return TEG_STATUS_ERROR; if( getpeername( pJ->fd, sa, &slen ) == -1) { con_text_out(M_ERR,"Error in getpeername()\n"); pJ->addr[sizeof(pJ->addr)-1]=0; free(sa); return TEG_STATUS_ERROR; } switch(sa->sa_family) { case AF_INET: { struct sockaddr_in *sin = (struct sockaddr_in*) sa; my_inet_ntop( AF_INET, &sin->sin_addr,pJ->addr, sizeof(pJ->addr)-1); break; } case AF_INET6: { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) sa; my_inet_ntop( AF_INET6, &sin6->sin6_addr,pJ->addr, sizeof(pJ->addr)-1); break; } case AF_UNIX: strncpy(pJ->addr,"127.0.0.1",sizeof(pJ->addr)-1); break; #if 0 { struct sockaddr_un *unp = (struct sockaddr_un *) sa; if(unp->sun_path[0]==0) strncpy(pJ->addr,_("Unknown"),sizeof(pJ->addr)-1); else snprintf(pJ->addr, sizeof(pJ->addr)-1, "%s", unp->sun_path); break; } #endif default: break; } pJ->addr[sizeof(pJ->addr)-1]=0; strip_invalid(pJ->addr); free(sa); return TEG_STATUS_SUCCESS; }