#include /* Fenster */ #include /* File IO */ #include /* exit() */ #include /* Strings */ #define STRING_SIZE 256 #define KNOWN_NICS "/var/ipfire/ethernet/known_nics" #define SCANNED_NICS "/tmp/scanned_nics" struct nic { char description[256]; char macaddr[20]; }; struct knic { char macaddr[20]; }; int write_configs_netudev(char *macaddr, char *colour) { #define UDEV_NET_CONF "/etc/udev/rules.d/30-persistent-network.rules" FILE *fp; char commandstring[STRING_SIZE]; if( (fp = fopen(KNOWN_NICS, "a")) == NULL ) { fprintf(stderr,"Couldn't open "KNOWN_NICS); return 1; } fprintf(fp,"%s;\n", macaddr); fclose(fp); // Make sure that there is no conflict snprintf(commandstring, STRING_SIZE, "/usr/bin/touch "UDEV_NET_CONF" >/dev/null 2>&1"); system(commandstring); snprintf(commandstring, STRING_SIZE, "/bin/cat "UDEV_NET_CONF"| /bin/grep -v \"%s\" > "UDEV_NET_CONF" 2>/dev/null", macaddr); system(commandstring); snprintf(commandstring, STRING_SIZE, "/bin/cat "UDEV_NET_CONF"| /bin/grep -v \"%s\" > "UDEV_NET_CONF" 2>/dev/null", colour); system(commandstring); if( (fp = fopen(UDEV_NET_CONF, "a")) == NULL ) { fprintf(stderr,"Couldn't open" UDEV_NET_CONF); return 1; } fprintf(fp,"ACTION==\"add\", SUBSYSTEM==\"net\", SYSFS{address}==\"%s\", NAME=\"%s0\"\n", macaddr, colour); fclose(fp); return 0; } int main(void) { FILE *fp; char temp_line[STRING_SIZE]; struct nic nics[20], *pnics; pnics = nics; struct knic knics[20], *pknics; pknics = knics; int rc, choise, count = 0, kcount = 0, i, found; char macaddr[STRING_SIZE], description[STRING_SIZE]; char message[STRING_SIZE]; char MenuInhalt[20][80]; char *pMenuInhalt[20]; newtComponent form; // Read the nics we already use if( (fp = fopen(KNOWN_NICS, "r")) == NULL ) { fprintf(stderr,"Couldn't open " KNOWN_NICS); return 1; } while ( fgets(temp_line, STRING_SIZE, fp) != NULL) { strcpy( knics[kcount].macaddr , strtok(temp_line,";") ); if (strlen(knics[kcount].macaddr) > 5 ) kcount++; } fclose(fp); // Read our scanned nics if( (fp = fopen(SCANNED_NICS, "r")) == NULL ) { fprintf(stderr,"Couldn't open "SCANNED_NICS); return 1; } while ( fgets(temp_line, STRING_SIZE, fp) != NULL) { strcpy(description, strtok(temp_line,";") ); strcpy(macaddr, strtok(NULL,";") ); found = 0; if (strlen(macaddr) > 5 ) { for (i=0; i < kcount; i++) { // Check if the nic is already in use if (strcmp(pknics[i].macaddr, macaddr) == NULL ) { found = 1; } } if (!found) { strcpy( pnics[count].description , description ); strcpy( pnics[count].macaddr , macaddr ); count++; } } } fclose(fp); // If new nics are found... if (count > 0) { newtInit(); newtCls(); char cMenuInhalt[STRING_SIZE]; for (i=0 ; i < count ; i++) { if ( strlen(nics[i].description) < 52 ) strncpy(MenuInhalt[i], nics[i].description + 1, strlen(nics[i].description)- 2); else { strncpy(cMenuInhalt, nics[i].description + 1, 50); strncpy(MenuInhalt[i], cMenuInhalt,(strrchr(cMenuInhalt,' ') - cMenuInhalt)); strcat (MenuInhalt[i], "..."); } while ( strlen(MenuInhalt[i]) < 50) // Fill with space. strcat( MenuInhalt[i], " "); strcat(MenuInhalt[i], " ("); strcat(MenuInhalt[i], nics[i].macaddr); strcat(MenuInhalt[i], ")"); pMenuInhalt[i] = MenuInhalt[i]; } form = newtForm(NULL, NULL, 0); sprintf(message, "Es wurde(n) %d Netzwerkkarte(n)\nin Ihrem System gefunden.\nBitte waehlen Sie eine aus:\n", count); rc = newtWinMenu("NetcardMenu", message, 50, 5, 5, 6, pMenuInhalt, &choise, "OK", "Cancel", NULL); newtFormDestroy(form); newtFinished(); if ( rc == 0 || rc == 1) { write_configs_netudev(pnics[choise].macaddr, "green"); } else { printf("BREAK\n"); return 1; } return 0; } else { printf("Es wurden keine ungenutzen Netzwerkschnittstellen gefunden.\n"); return 1; } }