[linux-programming] MAC Address

2007-11-19 Terurut Topik Ayen Yang
Dear Experts,

Sorry kalo pertanyaan saya pernah dibahas atau 'silly'.
Bagaimana sih cara mendapatkan MAC address dari C/C++ di Linux/Win?

Thanks,
Ayen

-- 
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis



Re: [linux-programming] MAC Address

2007-11-19 Terurut Topik Yohanes Nugroho
http://adywicaksono.wordpress.com/2007/11/08/detecting-mac-address-using-c-application/

On Nov 20, 2007 6:32 AM, Ayen Yang [EMAIL PROTECTED] wrote:
 Dear Experts,

 Sorry kalo pertanyaan saya pernah dibahas atau 'silly'.
 Bagaimana sih cara mendapatkan MAC address dari C/C++ di Linux/Win?

 Thanks,
 Ayen

 --
 Berhenti langganan: [EMAIL PROTECTED]
 Arsip dan info: http://linux.or.id/milis





-- 
Regards
Yohanes
http://tinyhack.com/freewarelist/s603rd/

-- 
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis



[linux-programming] mac address sun

2003-07-31 Terurut Topik Uno Tursadi
Halo ada yang pernah tau cara mendapatkan mac address untuk SunOS 5.8 dengan 
menggunakan gcc.

Saya sudah mencoba dengan menggunakan code berikut tapi tidak berhasil.

/*
 * mac_addr_dlpi.c
 *
 * Return the MAC (ie, ethernet hardware) address by using the dlpi api.
 *
 * compile with: gcc -c -D OS mac_addr_dlpi.c
 * with OS is one of AIX, SunOS, HPUX 
 */

/***/
/* this section defines a list of the dlpi capable devices
 * this depends on the operating system
 */

#undef DLPI_DEV

#ifdef HPUX
static char *dlpi_dev[] = {/dev/dlpi, };
#define DLPI_DEV
#endif

#ifdef AIX
static char *dlpi_dev[] = {/dev/dlpi/et, /dev/dlpi/en, /dev/dlpi/tr, 
/dev/dlpi/fddi, };
#define DLPI_DEV
/* AIX: remember to set up /etc/pse.conf or /etc/dlpi.conf */
#endif

#ifdef SunOS
static char *dlpi_dev[] = {/dev/hme, /dev/ie, /dev/le, };
#define DLPI_DEV
#endif

#ifndef DLPI_DEV
static char *dlpi_dev[] = {/dev/dlpi, };
/* unknown OS - hope that this will work ??? */
#define DLPI_DEV
#endif

/***/
/* 
 * implementation 
 */

#define INSAP 22 
#define OUTSAP 24 

#include sys/types.h
#include fcntl.h
#include errno.h
#include stdio.h
#include string.h
#include signal.h
#include ctype.h
#include sys/stropts.h
#include sys/poll.h
#include sys/dlpi.h

#define bcopy(source, destination, length) memcpy(destination, source, length)

#define AREA_SZ 5000 /*­=­* buffer length in bytes *­=­*/ 
static u_long ctl_area[AREA_SZ];
static u_long dat_area[AREA_SZ];
static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area};
static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area};
#define GOT_CTRL 1 
#define GOT_DATA 2 
#define GOT_BOTH 3 
#define GOT_INTR 4 
#define GOT_ERR 128 

/*­=­* get a message from a stream; return type of message *­=­*/
static int get_msg(int fd)
{
int flags = 0;
int res, ret;
ctl_area[0] = 0;
dat_area[0] = 0;
ret = 0;
res = getmsg(fd, ctl, dat, flags);
if(res  0) {
if(errno == EINTR) {
return(GOT_INTR);
} else {
return(GOT_ERR);
}
}
if(ctl.len  0) {
ret |= GOT_CTRL;
}
if(dat.len  0) {
ret |= GOT_DATA;
}
return(ret);
}

/*­=­* verify that dl_primitive in ctl_area = prim *­=­*/
static int check_ctrl(int prim)
{
dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area;
if(err_ack-dl_primitive != prim) {
return GOT_ERR;
}
return 0;
}

/*­=­* put a control message on a stream *­=­*/
static int put_ctrl(int fd, int len, int pri)
{
ctl.len = len;
if(putmsg(fd, ctl, 0, pri)  0) {
return GOT_ERR;
}
return  0;
}

/*­=­* put a control + data message on a stream *­=­*/
static int put_both(int fd, int clen, int dlen, int pri)
{
ctl.len = clen;
dat.len = dlen;
if(putmsg(fd, ctl, dat, pri)  0) {
return GOT_ERR;
}
return  0;
}

/*­=­* open file descriptor and attach *­=­*/
static int dl_open(const char *dev, int ppa, int *fd)
{
dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area;
if((*fd = open(dev, O_RDWR)) == -1) {
return GOT_ERR;
}
attach_req-dl_primitive = DL_ATTACH_REQ;
attach_req-dl_ppa = ppa;
put_ctrl(*fd, sizeof(dl_attach_req_t), 0);
get_msg(*fd);
return check_ctrl(DL_OK_ACK);
}

/*­=­* send DL_BIND_REQ *­=­*/
static int dl_bind(int fd, int sap, u_char *addr)
{
dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area;
dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area;
bind_req-dl_primitive = DL_BIND_REQ;
bind_req-dl_sap = sap;
bind_req-dl_max_conind = 1;
bind_req-dl_service_mode = DL_CLDLS;
bind_req-dl_conn_mgmt = 0;
bind_req-dl_xidtest_flg = 0;
put_ctrl(fd, sizeof(dl_bind_req_t), 0);
get_msg(fd);
if (GOT_ERR == check_ctrl(DL_BIND_ACK)) {
return GOT_ERR;
}
bcopy((u_char *)bind_ack + bind_ack-dl_addr_offset, addr,
bind_ack-dl_addr_length);
return 0;
}

/***/
/*
 * interface:
 * function mac_addr_dlpi - get the mac address of the first interface
 *
 * parameter: addr: an array of six bytes, has to be allocated by the caller
 *
 * return: 0 if OK, -1 if the address could not be determined
 *
 */

long mac_addr_dlpi ( u_char  *addr)
{
int fd;
int ppa;
u_char mac_addr[25];
int i;

char **dev;

for (dev = dlpi_dev; **dev != '\0'; ++dev) {
for (ppa=0; ppa10; ++ppa) {
if (GOT_ERR != dl_open(*dev, ppa, fd)) {
if (GOT_ERR != dl_bind(fd, INSAP, mac_addr)) {
bcopy( mac_addr, addr, 6);
return 0;
}
}
close(fd);
}
}
return -1;
}


/***/
/*
 * Main (only for testing)
 */
/*#ifdef MAIN*/
int main( int argc, char **argv)
{
long stat;
int i;
u_char 

Re: [linux-programming] mac address sun

2003-07-31 Terurut Topik Uno Tursadi
Sekedar informasi, saya sudah berhasil mendapatkan mac address untuk SunOS
5.8
Berikut adalah perubahan listing code-nya:

#ifdef SunOS
static char *dlpi_dev[] = {/dev/hme, /dev/ie, /dev/le, };
#define DLPI_DEV
#endif

DIUBAH MENJADI
#ifdef SunOS
static char *dlpi_dev[] = {/dev/eri, /dev/hme, /dev/ie, /dev/le,
};
#define DLPI_DEV
#endif

Sekian dan terima kasih
Semoga bermanfaat

uno

- Original Message -
From: Uno Tursadi [EMAIL PROTECTED]
To: [EMAIL PROTECTED]
Sent: Thursday, July 31, 2003 2:57 PM
Subject: [linux-programming] mac address sun


Halo ada yang pernah tau cara mendapatkan mac address untuk SunOS 5.8 dengan
menggunakan gcc.

Saya sudah mencoba dengan menggunakan code berikut tapi tidak berhasil.

/*
 * mac_addr_dlpi.c
 *
 * Return the MAC (ie, ethernet hardware) address by using the dlpi api.
 *
 * compile with: gcc -c -D OS mac_addr_dlpi.c
 * with OS is one of AIX, SunOS, HPUX
 */

/***/
/* this section defines a list of the dlpi capable devices
 * this depends on the operating system
 */

#undef DLPI_DEV

#ifdef HPUX
static char *dlpi_dev[] = {/dev/dlpi, };
#define DLPI_DEV
#endif

#ifdef AIX
static char *dlpi_dev[] = {/dev/dlpi/et, /dev/dlpi/en, /dev/dlpi/tr,
/dev/dlpi/fddi, };
#define DLPI_DEV
/* AIX: remember to set up /etc/pse.conf or /etc/dlpi.conf */
#endif

#ifdef SunOS
static char *dlpi_dev[] = {/dev/hme, /dev/ie, /dev/le, };
#define DLPI_DEV
#endif

#ifndef DLPI_DEV
static char *dlpi_dev[] = {/dev/dlpi, };
/* unknown OS - hope that this will work ??? */
#define DLPI_DEV
#endif

/***/
/*
 * implementation
 */

#define INSAP 22
#define OUTSAP 24

#include sys/types.h
#include fcntl.h
#include errno.h
#include stdio.h
#include string.h
#include signal.h
#include ctype.h
#include sys/stropts.h
#include sys/poll.h
#include sys/dlpi.h

#define bcopy(source, destination, length) memcpy(destination, source,
length)

#define AREA_SZ 5000 /*­=­* buffer length in bytes *­=­*/
static u_long ctl_area[AREA_SZ];
static u_long dat_area[AREA_SZ];
static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area};
static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area};
#define GOT_CTRL 1
#define GOT_DATA 2
#define GOT_BOTH 3
#define GOT_INTR 4
#define GOT_ERR 128

/*­=­* get a message from a stream; return type of message *­=­*/
static int get_msg(int fd)
{
int flags = 0;
int res, ret;
ctl_area[0] = 0;
dat_area[0] = 0;
ret = 0;
res = getmsg(fd, ctl, dat, flags);
if(res  0) {
if(errno == EINTR) {
return(GOT_INTR);
} else {
return(GOT_ERR);
}
}
if(ctl.len  0) {
ret |= GOT_CTRL;
}
if(dat.len  0) {
ret |= GOT_DATA;
}
return(ret);
}

/*­=­* verify that dl_primitive in ctl_area = prim *­=­*/
static int check_ctrl(int prim)
{
dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area;
if(err_ack-dl_primitive != prim) {
return GOT_ERR;
}
return 0;
}

/*­=­* put a control message on a stream *­=­*/
static int put_ctrl(int fd, int len, int pri)
{
ctl.len = len;
if(putmsg(fd, ctl, 0, pri)  0) {
return GOT_ERR;
}
return  0;
}

/*­=­* put a control + data message on a stream *­=­*/
static int put_both(int fd, int clen, int dlen, int pri)
{
ctl.len = clen;
dat.len = dlen;
if(putmsg(fd, ctl, dat, pri)  0) {
return GOT_ERR;
}
return  0;
}

/*­=­* open file descriptor and attach *­=­*/
static int dl_open(const char *dev, int ppa, int *fd)
{
dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area;
if((*fd = open(dev, O_RDWR)) == -1) {
return GOT_ERR;
}
attach_req-dl_primitive = DL_ATTACH_REQ;
attach_req-dl_ppa = ppa;
put_ctrl(*fd, sizeof(dl_attach_req_t), 0);
get_msg(*fd);
return check_ctrl(DL_OK_ACK);
}

/*­=­* send DL_BIND_REQ *­=­*/
static int dl_bind(int fd, int sap, u_char *addr)
{
dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area;
dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area;
bind_req-dl_primitive = DL_BIND_REQ;
bind_req-dl_sap = sap;
bind_req-dl_max_conind = 1;
bind_req-dl_service_mode = DL_CLDLS;
bind_req-dl_conn_mgmt = 0;
bind_req-dl_xidtest_flg = 0;
put_ctrl(fd, sizeof(dl_bind_req_t), 0);
get_msg(fd);
if (GOT_ERR == check_ctrl(DL_BIND_ACK)) {
return GOT_ERR;
}
bcopy((u_char *)bind_ack + bind_ack-dl_addr_offset, addr,
bind_ack-dl_addr_length);
return 0;
}

/***/
/*
 * interface:
 * function mac_addr_dlpi - get the mac address of the first interface
 *
 * parameter: addr: an array of six bytes, has to be allocated by the caller
 *
 * return: 0 if OK, -1 if the address could not be determined
 *
 */

long mac_addr_dlpi ( u_char  *addr)
{
int fd;
int ppa;
u_char mac_addr[25];
int i;

char **dev;

for (dev