/* * Ivy League * * IRDA Addresses, * * Copyright 2000 * Centre d'Etudes de la Navigation Aerienne (CENA) * * by Stephane Chatty * * $Id$ * */ #include "cplus_bugs.h" #include "IrdaAddress.h" #include "ivl/List.h" #include #include #include #include #ifndef AF_IRDA #define AF_IRDA 23 #endif /* AF_IRDA */ IvlIrdaAddress :: IvlIrdaAddress (const char* service) : IvlAddress () { Addr.sir_family = AF_IRDA; strncpy (Addr.sir_name, service ? service : "OBEX", 25); Addr.sir_lsap_sel = LSAP_ANY; Valid = true; } IvlIrdaAddress :: IvlIrdaAddress (lword addr, const char* service) : IvlAddress () { Addr.sir_family = AF_IRDA; strncpy (Addr.sir_name, service ? service : "OBEX", 25); Addr.sir_lsap_sel = LSAP_ANY; Addr.sir_addr = addr; Valid = true; } /*?nodoc?*/ IvlIrdaAddress :: ~IvlIrdaAddress () { } int IvlIrdaAddress :: Family () { return AF_IRDA; } int IvlIrdaAddress :: Length () { return sizeof (Addr); } SockAddr* IvlIrdaAddress :: GetSockAddr () { return (SockAddr*) &Addr; } char* IvlIrdaAddress :: StrRepr (char* buf) { if (! buf) buf = new char [ strlen (Addr.sir_name) + 1 + 5]; sprintf (buf, "IRDA:%s:0x%08x", Addr.sir_name, Addr.sir_addr); return buf; } int IvlIrdaAddress :: DiscoverPeers (int fd, IvlListOf & al) { al.Clear (); socklen_t len = 1024; byte buf[1024]; struct irda_device_list *l = (struct irda_device_list *) buf; getsockopt (fd, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, &len); if (len <= 0) { fprintf (stderr, "no device found\n"); return 0; } struct irda_device_info* d = l->dev; for (int i = 0; i < l->len ; ++i, ++d) { fprintf (stderr, "found %s at [0x%08x, 0x%08x]\n", d->info, d->saddr, d->daddr); al.Append (new IvlIrdaAddress (d->daddr)); } return l->len; }