+#include <newt.h> /* Fenster */
+#include <stdio.h> /* File IO */
+#include <stdlib.h> /* exit() */
+#include <string.h> /* 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 main(void)
+{
+ FILE *fp;
+ char temp_line[STRING_SIZE];
+ struct nic nics[20], *pnics;
+ struct knic knics[20];
+ pnics = nics;
+ 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(knics[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;
+ }
+}
+
+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;
+}