/* Altough dev is already created, this function is safe! */ static int tap_dev_init(void) { tap = xmalloc(sizeof(*tap)); tap->fd = alloc_tap("tap0"); if (tap->fd < 0) goto free_tap; if (setpersist_tap(tap->fd) < 0) goto close_tap; /* set tap information */ set_tap(); getname_tap(tap->fd, tap->dev.net_name); getmtu_tap(tap->dev.net_name, &tap->dev.net_mtu); #ifndef CONFIG_TOP1 gethwaddr_tap(tap->fd, tap->dev.net_hwaddr); setipaddr_tap(tap->dev.net_name, FAKE_TAP_ADDR); getipaddr_tap(tap->dev.net_name, &tap->dev.net_ipaddr); setnetmask_tap(tap->dev.net_name, FAKE_TAP_NETMASK); setup_tap(tap->dev.net_name); #endif unset_tap(); /* Dont add tap device into local net device list */ list_init(&tap->dev.net_list); return 0; close_tap: close(tap->fd); free_tap: free(tap); return -1; }
/* * main() * * Main command-line routine. */ int main (int argc, char **argv) { int rc; char *error_buf; argv++, argc--; while (argc > 0) { rc = 0; if (strcmp(*argv, "-i") == 0) { rc = hip_install_service(); if (rc == 0) { printf("HIP has been successfully installed "); printf("as a service.\n"); } } else if (strcmp(*argv, "-r") == 0) { rc = hip_remove_service(); if (rc == 0) { printf("HIP has been successfully "); printf("uninstalled.\n"); } } else if (strcmp(*argv, "-setuptap") == 0) { rc = setup_tap(); } else if (strcmp(*argv, "-s") == 0) { rc = hip_start_service(); } else if (strcmp(*argv, "-e") == 0) { rc = hip_stop_service(); } else if (strcmp(*argv, "-X") == 0) { DWORD dw; TCHAR szBuf[80]; LPVOID lpMsgBuf; SERVICE_TABLE_ENTRY ent[] = { { SERVICE_NAME, ServiceMain }, { 0, 0 }, }; StartServiceCtrlDispatcher (ent); dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); wsprintf(szBuf, "Failed with error %d: %s", dw, lpMsgBuf); /* Insert errors that we don't care about here. */ if (dw != ERROR_IO_PENDING) { MessageBox(NULL, szBuf, "HIP Error", MB_OK); } LocalFree(lpMsgBuf); exit(0); /* Add new hipd option flags here: */ } else if (strstr("-a-d-conf-e-g-i3-m-nr-o-p-q-r1-t-u-v", *argv)) { argv--, argc++; goto start_hip; } else { print_hip_service_usage(); exit(0); } /* print error */ if (rc) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &error_buf, 0, NULL); printf("%s\n", error_buf); } return(0); } /* end while */ start_hip: init_hip(argc, argv); while (g_state == 0) { Sleep(1000); } WSACleanup(); hip_sadb_deinit(); printf("Returning from main(), g_state=%d\n", g_state); fflush(stdout); return(0); }
int main(int argc, char **argv) { int result, index; char *bptr, *tptr; char *app; int i, j, c; struct getap_state *gs; index = 0; app = argv[0]; i = j = 1; tptr = "tgtap%d"; bptr = "/proc/%d/hw/ioreg/ten_Gbe_v2"; gs = malloc(sizeof(struct getap_state)); if(gs == NULL){ fprintf(stderr, "%s: unable to allocate %d bytes\n", app, sizeof(struct getap_state)); return EX_USAGE; } gs->s_address_name[0] = '\0'; gs->s_gateway_name[0] = '\0'; gs->s_mac_name[0] = '\0'; gs->s_port = 0; gs->s_verbose = 1; gs->s_testing = 0; while (i < argc) { if (argv[i][0] == '-') { c = argv[i][j]; switch (c) { case 'h' : usage(app); return EX_OK; case 'v' : gs->s_verbose++; j++; break; case 'T' : gs->s_testing++; j++; break; case 'a' : case 'g' : case 'm' : case 'p' : case 'n' : case 't' : case 'b' : j++; if (argv[i][j] == '\0') { j = 0; i++; } if (i >= argc) { fprintf(stderr, "%s: -%c needs a parameter\n", app, c); return EX_USAGE; } switch(c){ case 'a' : strncpy(gs->s_address_name, argv[i] + j, IP_BUFFER - 1); gs->s_address_name[IP_BUFFER - 1] = '\0'; break; case 'g' : strncpy(gs->s_gateway_name, argv[i] + j, IP_BUFFER - 1); gs->s_gateway_name[IP_BUFFER - 1] = '\0'; break; case 'm' : strncpy(gs->s_mac_name, argv[i] + j, MAC_BUFFER - 1); gs->s_mac_name[MAC_BUFFER - 1] = '\0'; case 'p' : gs->s_port = atoi(argv[i] + j); break; case 'n' : index = atoi(argv[i] + j); break; case 't' : tptr = NULL; strncpy(gs->s_tap_name, argv[i] + j, NAME_BUFFER - 1); gs->s_tap_name[NAME_BUFFER - 1] = '\0'; break; case 'b' : bptr = NULL; strncpy(gs->s_borph_name, argv[i] + j, NAME_BUFFER - 1); gs->s_borph_name[NAME_BUFFER - 1] = '\0'; break; } i++; j = 1; break; case '\0': j = 1; i++; break; default: fprintf(stderr, "%s: unknown option -%c\n", app, argv[i][j]); return EX_USAGE; } } else { fprintf(stderr, "%s: bad argument %s\n", app, argv[i]); return EX_USAGE; } } if(tptr){ result = snprintf(gs->s_tap_name, NAME_BUFFER - 1, tptr, index); if((result < 0) || (result >= NAME_BUFFER)){ fprintf(stderr, "unable to expand %s: Value too long\n", tptr); return EX_USAGE; } } if(bptr){ result = snprintf(gs->s_borph_name, NAME_BUFFER - 1, bptr, getpid()); if((result < 0) || (result >= NAME_BUFFER)){ fprintf(stderr, "unable to expand %s: Value too long\n", bptr); return EX_USAGE; } } if(gs->s_address_name[0] == '\0'){ fprintf(stderr, "%s: need an ip address\n", app); return EX_OSERR; } if(gs->s_gateway_name[0] == '\0'){ /* risky, gateware may not like it */ strncpy(gs->s_gateway_name, gs->s_address_name, IP_BUFFER); } if(gs->s_mac_name[0] == '\0'){ make_mac(gs); } if(gs->s_verbose){ printf("%s: tap interface name: %s\n", app, gs->s_tap_name); printf("%s: borph file: %s\n", app, gs->s_borph_name); printf("%s: %s file interface \n", app, gs->s_testing ? "testing" : "borph"); printf("%s: ip address %s\n", app, gs->s_address_name); printf("%s: mac address %s\n", app, gs->s_mac_name); } gs->s_tfd = tap_open(gs->s_tap_name); if(gs->s_tfd < 0){ fprintf(stderr, "%s: unable to set up tap device %s: %s\n", app, gs->s_tap_name, strerror(errno)); return EX_OSERR; } if(setup_borph(gs) < 0){ fprintf(stderr, "%s: unable to initialise borph register file %s: %s\n", app, gs->s_borph_name, strerror(errno)); return EX_OSERR; } if(setup_tap(gs)){ fprintf(stderr, "%s: unable to configure tap device %s\n", app, gs->s_tap_name); return EX_OSERR; } printf("%s: my arp table index %d\n", app, gs->s_index); if(gs->s_verbose){ printf("%s: my network: 0x%08x\n", app, gs->s_network_binary); } run = 1; /* signal stuff */ mainloop(gs); tap_close(gs->s_tfd); close(gs->s_bfd); return EX_OK; }