extern void main( void ) { unsigned dpmisize; void *dpmimem; unsigned dpmiseg; void __far *switchaddr; segread( &RMRegs ); Envseg = *(unsigned __far *)MK_FP( _psp, 0x2c ); switchaddr = GetPModeAddr( &dpmisize ); dpmimem = malloc( dpmisize + 15 ); dpmiseg = FP_SEG( dpmimem ) + ( FP_OFF( dpmimem ) + 15 ) / 16; if( ( switchaddr == NULLFAR ) || ( dpmimem == NULL ) ) { _debug( "error, DPMI host is not present" ); } else if( !EnterPMode( switchaddr, dpmiseg ) ) { _debug( "could not enter protected mode" ); } else { _debug( "entered protected mode" ); if( !getaddrs() ) { _debug( "could not get raw switch and state save addresses" ); } else { segread( &PMRegs ); hook_vects( MK_FP( PMRegs.cs, FP_OFF( &PM66Handler ) ), &rm_66_handler, &OldPMHandler, &OldRMHandler ); _debug( "doing an int 0x66" ); DoInt66( PMRegs.cs, PMRegs.ds ); _debug( "completed int 0x66" ); _debug( "raw switching to real mode" ); save_vects( RMVTable, PMVTable ); DoRawSwitch( RawPMtoRMAddr, RawRMtoPMAddr, FP_OFF( &start_shell ), &RMRegs ); _debug( "made it back to the debugger's protected mode" ); restore_vects( RMVTable, PMVTable ); hook_vects( OldPMHandler, OldRMHandler, NULLFAR, NULLFAR ); } _debug( "press any key to terminate debugger" ); DPMIFini(); } }
int sslverify(struct server *srv, SSL *ssl, char **cause) { X509 *x509; int error; char *fqdn, name[256], *ptr, *ptr2; const char *s; if ((x509 = SSL_get_peer_certificate(ssl)) == NULL) { /* No certificate, error since we wanted to verify it. */ s = "no certificate"; goto error; } /* Verify certificate. */ if ((error = SSL_get_verify_result(ssl)) != X509_V_OK) { s = X509_verify_cert_error_string(error); goto error; } /* Get certificate name. */ X509_NAME_oneline(X509_get_subject_name(x509), name, sizeof name); /* Check for CN field. */ if ((ptr = strstr(name, "/CN=")) == NULL) { s = "CN missing"; goto error; } /* Verify CN field. */ getaddrs(srv->host, &fqdn, NULL); do { ptr += 4; ptr2 = strchr(ptr, '/'); if (ptr2 != NULL) *ptr2 = '\0'; /* Compare against both given host and FQDN. */ if (fnmatch(ptr, srv->host, FNM_NOESCAPE|FNM_CASEFOLD) == 0 || (fqdn != NULL && fnmatch(ptr, fqdn, FNM_NOESCAPE|FNM_CASEFOLD)) == 0) break; if (ptr2 != NULL) *ptr2 = '/'; } while ((ptr = strstr(ptr, "/CN=")) != NULL); /* No valid CN found. Try alternative names. */ if (ptr == NULL) ptr = check_alt_names(srv->host, fqdn, x509); if (fqdn != NULL) xfree(fqdn); /* No valid CN found. */ if (ptr == NULL) { s = "no matching CN"; goto error; } /* Valid CN found. */ X509_free(x509); return (0); error: xasprintf(cause, "certificate verification failed: %s", s); if (x509 != NULL) X509_free(x509); return (-1); }
void main(int argc, char **argv) { String *msg; String *firstline; char *listname, *alfile; Waitmsg *w; int fd; char *replytoname = nil; ARGBEGIN{ case 'r': replytoname = ARGF(); break; }ARGEND; rfork(RFENVG|RFREND); if(argc < 2) usage(); alfile = argv[0]; listname = argv[1]; if(replytoname == nil) replytoname = listname; readaddrs(alfile); if(Binit(&in, 0, OREAD) < 0) sysfatal("opening input: %r"); msg = s_new(); firstline = s_new(); /* discard the 'From ' line */ if(s_read_line(&in, firstline) == nil) sysfatal("reading input: %r"); /* read up to the first 128k of the message. more is ridiculous. Not if word documents are distributed. Upped it to 2MB (pb) */ if(s_read(&in, msg, 2*1024*1024) <= 0) sysfatal("reading input: %r"); /* parse the header */ yyinit(s_to_c(msg), s_len(msg)); yyparse(); /* get the sender */ getaddrs(); if(from == nil) from = sender; if(from == nil) sysfatal("message must contain From: or Sender:"); if(strcmp(listname, s_to_c(from)) == 0) sysfatal("can't remail messages from myself"); addaddr(s_to_c(from)); /* start the mailer up and return a pipe to it */ fd = startmailer(listname); /* send message adding our own reply-to and precedence */ printmsg(fd, msg, replytoname, listname); close(fd); /* wait for mailer to end */ while(w = wait()){ if(w->msg != nil && w->msg[0]) sysfatal("%s", w->msg); free(w); } /* if the mailbox exists, cat the mail to the end of it */ appendtoarchive(listname, firstline, msg); exits(0); }
int ibmlana_probe(struct net_device *dev) { int force_detect = 0; int slot, z; int base = 0, irq = 0, iobase = 0, memlen = 0; ibmlana_priv *priv; ibmlana_medium medium; SET_MODULE_OWNER(dev); /* can't work without an MCA bus ;-) */ if (MCA_bus == 0) return -ENODEV; /* start address of 1 --> forced detection */ if (dev->mem_start == 1) force_detect = 1; /* search through slots */ if (dev != NULL) { base = dev->mem_start; irq = dev->irq; } slot = mca_find_adapter(IBM_LANA_ID, startslot); while (slot != -1) { /* deduce card addresses */ getaddrs(slot, &base, &memlen, &iobase, &irq, &medium); /* slot already in use ? */ if (mca_is_adapter_used(slot)) { slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } /* were we looking for something different ? */ if (dev->irq != 0 || dev->mem_start != 0) { if (dev->irq != 0 && dev->irq != irq) { slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } if (dev->mem_start != 0 && dev->mem_start != base) { slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } } /* found something that matches */ break; } /* nothing found ? */ if (slot == -1) return (base != 0 || irq != 0) ? -ENXIO : -ENODEV; /* announce success */ printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1); /* try to obtain I/O range */ if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) { printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); startslot = slot + 1; return -EBUSY; } /* make procfs entries */ mca_set_adapter_name(slot, "IBM LAN Adapter/A"); mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev); mca_mark_as_used(slot); /* allocate structure */ priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); if (!priv) { release_region(iobase, IBM_LANA_IORANGE); return -ENOMEM; } priv->slot = slot; priv->realirq = irq; priv->medium = medium; spin_lock_init(&priv->lock); memset(&priv->stat, 0, sizeof(struct net_device_stats)); /* set base + irq for this device (irq not allocated so far) */ dev->irq = 0; dev->mem_start = base; dev->mem_end = base + memlen; dev->base_addr = iobase; /* set methods */ dev->open = ibmlana_open; dev->stop = ibmlana_close; dev->set_config = ibmlana_config; dev->hard_start_xmit = ibmlana_tx; dev->do_ioctl = NULL; dev->get_stats = ibmlana_stats; dev->set_multicast_list = ibmlana_set_multicast_list; dev->flags |= IFF_MULTICAST; /* generic setup */ ether_setup(dev); /* copy out MAC address */ for (z = 0; z < sizeof(dev->dev_addr); z++) dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z); /* print config */ printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n", dev->name, priv->realirq, dev->base_addr, dev->mem_start, dev->mem_end - 1, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]); /* reset board */ ResetBoard(dev); /* next probe will start at next slot */ startslot = slot + 1; return 0; }
int main(int argc, char **argv) { int c; int sockfd; struct sockaddr_in servaddr, cliaddr; int n; socklen_t len; char msg[MAX_MSG_LENGTH]; int i; settings_init(); /* process arguments */ while (-1 != (c = getopt(argc, argv, "hp:dl:Lc:n:e:v"))) { switch (c) { case 'h': showusage(); exit(EXIT_SUCCESS); break; case 'p': settings.port = atoi(optarg); break; case 'd': settings.daemon = 1; break; case 'l': settings.ipaddr = strdup(optarg); break; case 'L': settings.localonly = 1; break; case 'c': settings.workernum = atoi(optarg); break; case 'n': settings.queuesize = atoi(optarg); break; case 'e': settings.exepath = strdup(optarg); break; case 'v': settings.verbose++; break; default: //fprintf(stderr, "unknown option -- '%c'\n", c); return 1; } } if (settings.port < 1) { fprintf(stderr, "please use '-p' to specify a port(>1) to listen to\n"); exit(-1); } if (settings.workernum < 1) { fprintf(stderr, "please use '-c' to specify max num(>1) of concurrent workers\n"); exit(-1); } if (settings.queuesize < 1) { fprintf(stderr, "please use '-n' to specify queue size(>1)\n"); exit(-1); } if (settings.exepath == NULL || settings.exepath[0] == '\0') { fprintf(stderr, "empty 'script path', use '-e' to specify it\n"); exit(-1); } if (access(settings.exepath, R_OK | X_OK) != 0) { fprintf(stderr, "script not readble or executable: %s\n", strerror(errno)); exit(-1); } /* print setttngs */ printf("settings:\n"); printf("\tlisten port: %d\n", settings.port); printf("\tdaemon mode: %s\n", ON_OFF(settings.daemon)); printf("\tlisten addr: %s\n", (settings.ipaddr != NULL) ? settings.ipaddr : "INADDR_ANY"); printf("\tlocal only: %s\n", ON_OFF(settings.localonly)); printf("\tworker num %d\n", settings.workernum); printf("\tqueue size %d\n", settings.queuesize); printf("\tscript path: '%s'\n", settings.exepath); printf("\tverbose: %s\n", ON_OFF(settings.verbose)); /* allocate space for queue */ id_queue = (int*)malloc(sizeof(int) * settings.queuesize); if (id_queue == NULL) { fprintf(stderr, "can not allocate memory for id queue\n"); exit(-1); } for (i = 0; i < MAX_IFNUM; i++) { ipaddrs[i] = (char*)malloc(20); bzero(ipaddrs[i], 20); } ifnum = getaddrs(ipaddrs); if (ifnum <= 0) { fprintf(stderr, "can not get ip address of interface(s)\n"); exit(EXIT_FAILURE); } else if (settings.verbose > 0) { printf("ip address of interface(s):\n"); for (i = 0; i < ifnum; i++) { printf("\t%s\n", ipaddrs[i]); } } if (settings.daemon) { if (daemonize()) { fprintf(stderr, "can't run as daemon\n"); exit(EXIT_FAILURE); } printf("run as daemon\n"); } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket error: "); exit(EXIT_FAILURE); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; if (settings.ipaddr != NULL) { if (inet_aton(settings.ipaddr, &(servaddr.sin_addr)) == 0) { fprintf(stderr, "invalid ip address to listen: %s\n", settings.ipaddr); exit(EXIT_FAILURE); } } else { servaddr.sin_addr.s_addr = htonl(INADDR_ANY); } servaddr.sin_port = htons(settings.port); if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) { perror("bind error: "); exit(EXIT_FAILURE); } pthread_mutex_init(&lock, NULL); pthread_cond_init(&cond, NULL); pthread_mutex_init(&workerlock, NULL); pthread_cond_init(&workercond, NULL); pthread_mutex_init(&reaperlock, NULL); pthread_cond_init(&reapercond, NULL); /* start thread to reap children */ do { pthread_t t; pthread_attr_t attr; pthread_attr_init(&attr); if (pthread_create(&t, &attr, reaper_worker, NULL) != 0) { perror("pthread_create error: "); exit(EXIT_FAILURE); } } while (0); /* start thread to scan queue */ do { pthread_t t; pthread_attr_t attr; pthread_attr_init(&attr); if (pthread_create(&t, &attr, scan_worker, NULL) != 0) { perror("pthread_create error: "); exit(EXIT_FAILURE); } } while (0); /* close stdio if verbose == 0*/ if (close_stdio(settings.verbose)) { fprintf(stderr, "can't close fd: 0, 1, 2\n"); exit(EXIT_FAILURE); } len = sizeof(cliaddr); while (1) { n = recvfrom(sockfd, msg, MAX_MSG_LENGTH, 0, (struct sockaddr *)&cliaddr, &len); if (n < 1) { if (settings.verbose > 0) { fprintf(stderr, "recvfrom error\n"); } continue; } if (settings.localonly) { char *from = inet_ntoa(cliaddr.sin_addr); if (is_local_ip(from)) { if (settings.verbose > 0) { fprintf(stderr, "deny msg from %s\n", from); } continue; } } msg[n] = '\0'; if (settings.verbose > 0) { handle_msg(msg, n, inet_ntoa(cliaddr.sin_addr)); } else { handle_msg(msg, n, NULL); } /* sendto(sockfd, msg, n, 0, (struct sockaddr *)&cliaddr, len); */ } return 0; }
/* Strategy 0, look through /etc/hosts.equiv, and /.rhost for new hosts */ strat_0() /* 0x5da4 */ { FILE *hosteq; char scanbuf[512]; char fwd_buf[256]; char *fwd_host; char getbuf[256]; struct passwd *pwent; char local[20]; struct usr *user; struct hst *host; /* 1048 */ int check_other_cnt; /* 1052 */ static struct usr *user_list = NULL; hosteq = fopen(XS("/etc/hosts.equiv"), XS("r")); if (hosteq != NULL) { /* 292 */ while (fscanf(hosteq, XS("%.100s"), scanbuf)) { host = h_name2host(scanbuf, 0); if (host == 0) { host = h_name2host(scanbuf, 1); getaddrs(host); } if (host->o48[0] == 0) /* 158 */ continue; host->flag |= 8; } fclose(hosteq); /* 280 */ } hosteq = fopen(XS("/.rhosts"), XS("r")); if (hosteq != NULL) { /* 516 */ while (fgets(getbuf, sizeof(getbuf), hosteq)) { /* 344,504 */ if (sscanf(getbuf, XS("%s"), scanbuf) != 1) continue; host = h_name2host(scanbuf, 0); while (host == 0) { /* 436, 474 */ host = h_name2host(scanbuf, 1); getaddrs(host); } if (host->o48[0] == 0) continue; host->flag |= 8; } fclose(hosteq); } /* look through the passwd file, checking for contact with others every * tenth entry. */ setpwent(); check_other_cnt = 0; /* 522 */ while ((pwent = getpwent()) != 0) { /* 526, 1124 */ if ((check_other_cnt % 10) == 0) other_sleep(0); check_other_cnt++; sprintf(fwd_buf, XS("%.200s/.forward"), pwent->pw_dir); hosteq = fopen(fwd_buf, XS("r")); if (hosteq != NULL) { /* 834 */ while (fgets(scanbuf, sizeof(scanbuf), hosteq)) { /* 650,822 */ /* Punt the newline */ (&scanbuf[strlen(scanbuf)])[-1] = '\0'; fwd_host = index(scanbuf, '@'); if (fwd_host == NULL) continue; host = h_name2host(++fwd_host, 0); if (host == NULL) { host = h_name2host(fwd_host, 1); getaddrs(host); } if (host->o48[0] == 0) continue; host->flag |= 8; } fclose(hosteq); } /* Don't do foreign or compilcated hosts */ if (strlen(host->hostname) > 11) continue; user = (struct usr *)malloc(sizeof(struct usr)); strcpy(user->name, pwent->pw_name); strcpy(&user->passwd[0], XS("x")); user->decoded_passwd[0] = '\0'; user->homedir = strcpy(malloc(strlen(pwent->pw_dir)+1), pwent->pw_dir); user->gecos = strcpy(malloc(strlen(pwent->pw_gecos)+1), pwent->pw_gecos ); user->next = user_list; user_list = user; } endpwent(); cmode = 1; x27f2c = user_list; return; }
static int __devinit ibmlana_init_one(struct device *kdev) { struct mca_device *mdev = to_mca_device(kdev); struct net_device *dev; int slot = mdev->slot, z, rc; int base = 0, irq = 0, iobase = 0, memlen = 0; ibmlana_priv *priv; ibmlana_medium medium; DECLARE_MAC_BUF(mac); dev = alloc_etherdev(sizeof(ibmlana_priv)); if (!dev) return -ENOMEM; dev->irq = ibmlana_irq; dev->base_addr = ibmlana_io; base = dev->mem_start; irq = dev->irq; /* deduce card addresses */ getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium); /* were we looking for something different ? */ if (dev->irq && dev->irq != irq) { rc = -ENODEV; goto err_out; } if (dev->mem_start && dev->mem_start != base) { rc = -ENODEV; goto err_out; } /* announce success */ printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1); /* try to obtain I/O range */ if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) { printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase); startslot = slot + 1; rc = -EBUSY; goto err_out; } priv = netdev_priv(dev); priv->slot = slot; priv->realirq = mca_device_transform_irq(mdev, irq); priv->medium = medium; spin_lock_init(&priv->lock); /* set base + irq for this device (irq not allocated so far) */ dev->irq = 0; dev->mem_start = base; dev->mem_end = base + memlen; dev->base_addr = iobase; priv->base = ioremap(base, memlen); if (!priv->base) { printk(KERN_ERR "%s: cannot remap memory!\n", DRV_NAME); startslot = slot + 1; rc = -EBUSY; goto err_out_reg; } mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]); mca_device_set_claim(mdev, 1); /* set methods */ dev->open = ibmlana_open; dev->stop = ibmlana_close; dev->hard_start_xmit = ibmlana_tx; dev->set_multicast_list = ibmlana_set_multicast_list; dev->flags |= IFF_MULTICAST; /* copy out MAC address */ for (z = 0; z < sizeof(dev->dev_addr); z++) dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z); /* print config */ printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " "MAC address %s.\n", dev->name, priv->realirq, dev->base_addr, dev->mem_start, dev->mem_end - 1, print_mac(mac, dev->dev_addr)); printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]); /* reset board */ ResetBoard(dev); /* next probe will start at next slot */ startslot = slot + 1; rc = register_netdev(dev); if (rc) goto err_out_claimed; dev_set_drvdata(kdev, dev); return 0; err_out_claimed: mca_device_set_claim(mdev, 0); iounmap(priv->base); err_out_reg: release_region(iobase, IBM_LANA_IORANGE); err_out: free_netdev(dev); return rc; }