[linux-programming] MAC Address
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
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
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
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