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; ppa<10; ++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 addr[6]; stat = mac_addr_dlpi( addr); if (0 == stat) { printf( "MAC address = "); for (i=0; i<6; ++i) { printf("%2.2x", addr[i]); } printf( "\n"); } else { fprintf( stderr, "can't get MAC address\n"); exit( 1); } return 0; } /*#endif*/