Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #define ARP_CACHE "/proc/net/arp"
- #define ARP_BUFFER_LEN 1024
- #define ARP_DELIM " "
- int readLine(int Fd, char *Buffer)
- {
- if (Fd < 0)
- {
- return -1;
- }
- char ch;
- size_t Read = 0;
- while (read(Fd, (Buffer + Read), 1))
- {
- ch = Buffer[Read];
- if (ch == 'n')
- {
- break;
- }
- Read++;
- }
- if (Read)
- {
- Buffer[Read] = 0;
- return 0;
- }
- return -1;
- }
- char * getField(char * Line_Arg, int Field)
- {
- char * Line = malloc(strlen(Line_Arg)), *ptr;
- memcpy(Line, Line_Arg, strlen(Line_Arg));
- ptr = Line;
- char * s;
- s = strtok(Line, ARP_DELIM);
- while (Field && s)
- {
- s = strtok(NULL, ARP_DELIM);
- Field--;
- };
- char * ret;
- if (s)
- {
- ret = (char*)malloc(strlen(s) + 1);
- memset(ret, 0, strlen(s) + 1);
- memcpy(ret, s, strlen(s));
- }
- free(ptr);
- return s ? ret : NULL;
- }
- int main()
- {
- int Fd = open(ARP_CACHE, O_RDONLY);
- if (Fd < 0)
- {
- fprintf(stdout, "Arp Cache: Failed to open file "%s"n", ARP_CACHE);
- return 1;
- }
- char Buffer[ARP_BUFFER_LEN];
- /* Ignore first line */
- int Ret = readLine(Fd, &Buffer[0]);
- Ret = readLine(Fd, &Buffer[0]);
- int count = 0;
- while (Ret == 0)
- {
- char * Line;
- Line = &Buffer[0];
- /* Get Ip, Mac, Interface */
- char * Ip = getField(Line, 0);
- char * Mac = getField(Line, 3);
- char * IfaceStr = getField(Line, 5);
- fprintf(stdout, "%03d: Mac Address of [%s] on [%s] is "%s"n",
- ++count, Ip, IfaceStr, Mac);
- free(Ip);
- free(Mac);
- free(IfaceStr);
- Ret = readLine(Fd, &Buffer[0]);
- }
- close(Fd);
- return Ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement