void mac_cleanup_tmpf(void) { int i,err; HFileParam pb; char fname[256]; for (i = 0; i < MAXTMPF; ++i) if (tmpf[i].flags) { strcpy(fname,tmpf[i].path); pb.ioCompletion=nil; c2pstr(fname); pb.ioNamePtr=(uchar *)fname; pb.ioVRefNum=0; pb.ioFDirIndex=0; pb.ioFRefNum=0; pb.ioDirID=0; err=PBHGetFInfo((HParmBlkPtr)&pb,false); if (pb.ioFRefNum!=0){ strcpy(fname,tmpf[i].path); pb.ioCompletion=nil; c2pstr(fname); pb.ioNamePtr=(uchar *)fname; pb.ioVRefNum=0; pb.ioDirID=0; err=PBClose((ParmBlkPtr)&pb,false); } rmtemp(tmpf[i].path); } } /* mac_cleanup_tmpf */
/* * remove all temporary files and wipe them if necessary */ void cleanup_tmpf(void) { int i; for (i = 0; i < MAXTMPF; ++i) if (tmpf[i].flags) rmtemp(tmpf[i].path); } /* cleanup_tmpf */
void tdystak (char *x) /* try to bring stack back to x */ { while ((char *)stakbsy > x) { shfree(stakbsy); stakbsy = stakbsy->word; } staktop = stakbot = max(x, stakbas); rmtemp((struct ionod *)x); }
void done(void) { register STRING t; if (t = trapcom[0] ) { trapcom[0] = 0; /*should free but not long */ execexp(t, 0); ; } rmtemp(0); exit(exitval); }
int intip(char *ifname, int ifs, int argc, char **argv) { int set, alias, flags, argcmax; ip_t ip; struct in_addr destbcast; struct ifaliasreq addreq, ridreq; struct sockaddr_in *sin; char *msg, *cmdname; memset(&addreq, 0, sizeof(addreq)); memset(&ridreq, 0, sizeof(ridreq)); if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; /* * We use this function for ip and alias setup since they are * the same thing. */ if (isprefix(argv[0], "alias")) { alias = 1; cmdname = "alias"; } else if (isprefix(argv[0], "ip")) { alias = 0; cmdname = "ip"; } else { printf("%% intip: Internal error\n"); return 0; } argc--; argv++; flags = get_ifflags(ifname, ifs); if (flags & IFF_POINTOPOINT) { argcmax = 2; msg = "destination"; } else if (flags & IFF_BROADCAST) { argcmax = 2; msg = "broadcast"; } else { argcmax = 1; msg = NULL; } if (argc < 1 || argc > argcmax) { printf("%% %s <address>/<bits> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% %s <address>/<netmask> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% no %s <address>[/bits]\n", cmdname); printf("%% no %s <address>[/netmask]\n", cmdname); return(0); } /* ignore 'address' keyword, don't print error */ if (isprefix(argv[0], "address")) { argc--; argv++; } if (isprefix(argv[0], "dhcp")) { char *args[] = { PKILL, "dhclient", ifname, '\0' }; char leasefile[sizeof(LEASEPREFIX)+1+IFNAMSIZ]; if (set) cmdarg(DHCLIENT, ifname); else { cmdargs(PKILL, args); snprintf(leasefile, sizeof(leasefile), "%s.%s", LEASEPREFIX, ifname); rmtemp(leasefile); } return(0); } ip = parse_ip(argv[0], NO_NETMASK); if (ip.family == 0) /* bad IP specified */ return(0); if (ip.bitlen == -1) { printf("%% Netmask not specified\n"); return(0); } if (argc == 2) if (!inet_aton(argv[1], &destbcast)) { printf("%% Invalid %s address\n", msg); return(0); } strlcpy(addreq.ifra_name, ifname, sizeof(addreq.ifra_name)); strlcpy(ridreq.ifra_name, ifname, sizeof(ridreq.ifra_name)); if (!set) { sin = (struct sockaddr_in *)&ridreq.ifra_addr; sin->sin_len = sizeof(ridreq.ifra_addr); sin->sin_family = AF_INET; sin->sin_addr.s_addr = ip.addr.sin.s_addr; } if (!alias || !set) { /* * Here we remove the top IP on the interface before we * might add another one, or we delete the specified IP. */ if (ioctl(ifs, SIOCDIFADDR, &ridreq) < 0) if (!set) printf("%% intip: SIOCDIFADDR: %s\n", strerror(errno)); } if (set) { sin = (struct sockaddr_in *)&addreq.ifra_addr; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_addr); sin->sin_addr.s_addr = ip.addr.sin.s_addr; sin = (struct sockaddr_in *)&addreq.ifra_mask; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_mask); sin->sin_addr.s_addr = htonl(0xffffffff << (32 - ip.bitlen)); if (argc == 2) { sin = (struct sockaddr_in *)&addreq.ifra_dstaddr; sin->sin_family = AF_INET; sin->sin_len = sizeof(addreq.ifra_dstaddr); sin->sin_addr.s_addr = destbcast.s_addr; } if (ioctl(ifs, SIOCAIFADDR, &addreq) < 0) printf("%% intip: SIOCAIFADDR: %s\n", strerror(errno)); } return(0); }
int intip(char *ifname, int ifs, int argc, char **argv) { int s, set, flags, argcmax; char *msg, *cmdname; ip_t ip; /* ipv4 structures */ struct in_addr in4dest; struct ifaliasreq ip4req; /* ipv6 structures */ struct in6_addr in6dest; struct in6_aliasreq ip6req; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; /* * We use this function for ip and alias setup since they are * the same thing. */ if (isprefix(argv[0], "alias")) { cmdname = "alias"; } else if (isprefix(argv[0], "ip")) { cmdname = "ip"; } else { printf("%% intip: Internal error\n"); return 0; } argc--; argv++; flags = get_ifflags(ifname, ifs); if (flags & IFF_POINTOPOINT) { argcmax = 2; msg = "destination"; } else if (flags & IFF_BROADCAST) { argcmax = 2; msg = "broadcast"; } else { argcmax = 1; msg = NULL; } if (argc < 1 || argc > argcmax) { printf("%% %s <address>/<bits> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% %s <address>/<netmask> %s%s%s\n", cmdname, msg ? "[" : "", msg ? msg : "", msg ? "]" : ""); printf("%% no %s <address>[/bits]\n", cmdname); printf("%% no %s <address>[/netmask]\n", cmdname); return(0); } /* ignore 'address' keyword, don't print error */ if (isprefix(argv[0], "address")) { argc--; argv++; } if (isprefix(argv[0], "dhcp")) { char *args[] = { PKILL, "dhclient", ifname, '\0' }; char *args_set[] = { DHCLIENT, ifname, '\0' }; char leasefile[sizeof(LEASEPREFIX)+1+IFNAMSIZ]; if (set) cmdargs(DHCLIENT, args_set); else { cmdargs(PKILL, args); snprintf(leasefile, sizeof(leasefile), "%s.%s", LEASEPREFIX, ifname); rmtemp(leasefile); } return(0); } memset(&ip, 0, sizeof(ip)); parse_ip_pfx(argv[0], NO_NETMASK, &ip); if (ip.family == 0) /* bad IP specified */ return(0); if (set && !(flags & IFF_POINTOPOINT) && ip.bitlen == -1) { printf("%% Netmask not specified\n"); return(0); } if (ip.bitlen == -1) { /* * No netmask specified, set the field at 0. * The kernel mostly ignores netmask for PTP interfaces, * but won't allow anything less than a /128 for an IPv6 * PTP interface. */ if (!(flags & IFF_POINTOPOINT)) ip.bitlen = 0; else if (ip.family == AF_INET) ip.bitlen = 32; else if (ip.family == AF_INET6) ip.bitlen = 128; } switch(ip.family) { case AF_INET: memset(&in4dest, 0, sizeof(in4dest)); if (argc == 2 && !inet_pton(AF_INET, argv[1], &in4dest)) { printf("%% Invalid %s address\n", msg); return(0); } memset(&ip4req, 0, sizeof(ip4req)); pack_ifaliasreq(&ip4req, &ip, &in4dest, ifname); /* do it */ if (ioctl(ifs, set ? SIOCAIFADDR : SIOCDIFADDR, &ip4req) < 0) printf("%% intip: SIOC%sIFADDR: %s\n", set ? "A" : "D", strerror(errno)); break; case AF_INET6: memset(&in6dest, 0, sizeof(in6dest)); if (argc == 2 && parse_ipv6(argv[1], &in6dest) != 0) { printf("%% Invalid destination address %s\n", argv[1]); return(0); } memset(&ip6req, 0, sizeof(ip6req)); pack_in6aliasreq(&ip6req, &ip, &in6dest, ifname); /* get inet6 socket */ s = socket(PF_INET6, SOCK_DGRAM, 0); if (s < 0) { printf("%% socket failed: %s\n", strerror(errno)); return(0); } /* turn on inet6 */ addaf(ifname, AF_INET6, ifs); /* do it */ if (ioctl(s, set ? SIOCAIFADDR_IN6 : SIOCDIFADDR_IN6, &ip6req) < 0) { if (!set && errno == EADDRNOTAVAIL) printf("%% IP address not found on %s\n", ifname); else printf("%% intip: SIOC%sIFADDR_IN6: %s\n", set ? "A" : "D", strerror(errno)); } else { ipv6ll_db_store( (struct sockaddr_in6 *)&ip6req.ifra_addr, (struct sockaddr_in6 *)&ip6req.ifra_prefixmask, set ? DB_X_ENABLE : DB_X_REMOVE, ifname); } close(s); break; default: printf("%% unknown address family: %d\n", ip.family); break; } return(0); }
int main(int argc, char *argv[]) { int top, ch, iflag = 0, cflag = 0; char rc[PATH_MAX]; if(getuid() != 0) printf("%% Functionality limited without root privilege.\n"); pid = getpid(); while ((ch = getopt(argc, argv, "c:i:v")) != -1) switch (ch) { case 'c': cflag = 1; strlcpy(rc, optarg, PATH_MAX); break; case 'i': iflag = 1; strlcpy(rc, optarg, PATH_MAX); break; case 'v': verbose = 1; break; default: usage(); } argc -= optind; argv += optind; if (cflag && iflag) usage(); if (argc > 0) usage(); if (iflag) rmtemp(SQ3DBFILE); printf("%% NSH v%s\n", vers); /* create temporal tables (if they aren't already there) */ if (db_create_table_rtables() < 0) printf("%% database rtables creation failed\n"); if (db_create_table_flag_x("ctl") < 0) printf("%% database ctl creation failed\n"); if (db_create_table_flag_x("dhcrelay") < 0) printf("%% database dhcrelay creation failed\n"); if (db_create_table_flag_x("ipv6linklocal") < 0) printf("%% database ipv6linklocal creation failed\n"); if (db_create_table_flag_x("lladdr") < 0) printf("%% database lladdr creation failed\n"); if (db_create_table_flag_x("rtadvd") < 0) printf("%% database rtadvd creation failed\n"); if (db_create_table_flag_x("authkey") < 0) printf("%% database authkey creation failed\n"); if (db_create_table_flag_x("peerkey") < 0) printf("%% database peerkey creation failed\n"); if (iflag) { /* * Interpret config file and exit */ char *argv_demote[] = { "group", "carp", "carpdemote", "128" }; char *argv_restore[] = { "no", "group", "carp", "carpdemote", "128" }; priv = 1; /* * Set carp group carpdemote to 128 during initialization */ group(nitems(argv_demote), argv_demote); cmdrc(rc); /* * Initialization over */ group(nitems(argv_restore), argv_restore); exit(0); } if (cflag) { /* * Interpret command file and exit */ priv = 1; cmdrc(rc); exit(0); } top = setjmp(toplevel) == 0; if (top) { (void)signal(SIGWINCH, setwinsize); (void)signal(SIGINT, (sig_t)intr); (void)setwinsize(0); } else putchar('\n'); for (;;) { command(); top = 1; } /* NOTREACHED */ return 0; }