/* * set_allowed_addrs() - set the list of allowed addresses. */ static void set_allowed_addrs(int unit, struct wordlist *addrs) { if (addresses[unit] != NULL) { free_wordlist(addresses[unit]); } addresses[unit] = addrs; #if 0 /* * If there's only one authorized address we might as well * ask our peer for that one right away */ if (addrs != NULL && addrs->next == NULL) { char *p = addrs->word; struct ipcp_options *wo = &ipcp_wantoptions[unit]; u32_t a; struct hostent *hp; if (wo->hisaddr == 0 && *p != '!' && *p != '-' && strchr(p, '/') == NULL) { hp = gethostbyname(p); if (hp != NULL && hp->h_addrtype == AF_INET) { a = *(u32_t *)hp->h_addr; } else { a = inet_addr(p); } if (a != (u32_t) -1) { wo->hisaddr = a; } } } #endif }
static void wl_finalize(SEXP ptr) { if (NULL == R_ExternalPtrAddr(ptr)) return; wordlist_t *wl = (wordlist_t *) R_ExternalPtrAddr(ptr); free_wordlist(wl); R_ClearExternalPtr(ptr); }
int main(void) { char line[MAX_LINE_LEN]; size_t lineno = 0; while (fgets(line, sizeof(line), stdin) != 0) { LineControl ctrl; init_linectrl(&ctrl); lineno++; if (debug) printf("Line %zu: (%zu) [[%s]]\n", lineno, strlen(line), line); int extra = 0; while (parse_fragment(line, &ctrl) != 0 && fgets(line, sizeof(line), stdin) != 0) { if (debug) printf("Extra %d for line %zu: (%zu) [[%s]]\n", ++extra, lineno, strlen(line), line); } WordList *list = &ctrl.list; printf("Line %zu: length %zu, words = %zu\n", lineno, ctrl.line_length, list->num_words); size_t num_words = list->num_words; if (num_words > MAX_WORD_CNT) num_words = MAX_WORD_CNT; for (size_t i = 0; i < num_words; i++) { printf(" %zu: (%zu) %s\n", i + 1, list->words[i].length, list->words[i].word); } putchar('\n'); free_wordlist(&ctrl.list); } return 0; }
int simple_example() { const char *str = "A A A B A B B A"; const int n = 2; wordlist_t *wl; ngram_t *ng; int ngsize; int i; wl = lex(str, strlen(str)); ng = process(wl, n, &ngsize); if(ng == NULL) printf("No ngrams\n"); else { for(i=0; i<ngsize; i++) print_ngram(ng+i); } free_wordlist(wl); return 0; }
/* * check_passwd - Check the user name and passwd against the PAP secrets * file. If requested, also check against the system password database, * and login the user if OK. * * returns: * UPAP_AUTHNAK: Authentication failed. * UPAP_AUTHACK: Authentication succeeded. * In either case, msg points to an appropriate message. */ int check_passwd( int unit, char *auser, int userlen, char *apasswd, int passwdlen, char **msg, int *msglen) { #if 1 LWIP_UNUSED_ARG(unit); LWIP_UNUSED_ARG(auser); LWIP_UNUSED_ARG(userlen); LWIP_UNUSED_ARG(apasswd); LWIP_UNUSED_ARG(passwdlen); LWIP_UNUSED_ARG(msglen); *msg = (char *) 0; return UPAP_AUTHACK; /* XXX Assume all entries OK. */ #else int ret = 0; struct wordlist *addrs = NULL; char passwd[256], user[256]; char secret[MAXWORDLEN]; static u_short attempts = 0; /* * Make copies of apasswd and auser, then null-terminate them. */ BCOPY(apasswd, passwd, passwdlen); passwd[passwdlen] = '\0'; BCOPY(auser, user, userlen); user[userlen] = '\0'; *msg = (char *) 0; /* XXX Validate user name and password. */ ret = UPAP_AUTHACK; /* XXX Assume all entries OK. */ if (ret == UPAP_AUTHNAK) { if (*msg == (char *) 0) { *msg = "Login incorrect"; } *msglen = strlen(*msg); /* * Frustrate passwd stealer programs. * Allow 10 tries, but start backing off after 3 (stolen from login). * On 10'th, drop the connection. */ if (attempts++ >= 10) { AUTHDEBUG((LOG_WARNING, "%d LOGIN FAILURES BY %s\n", attempts, user)); /*ppp_panic("Excess Bad Logins");*/ } if (attempts > 3) { sys_msleep((attempts - 3) * 5); } if (addrs != NULL) { free_wordlist(addrs); } } else { attempts = 0; /* Reset count */ if (*msg == (char *) 0) { *msg = "Login ok"; } *msglen = strlen(*msg); set_allowed_addrs(unit, addrs); } BZERO(passwd, sizeof(passwd)); BZERO(secret, sizeof(secret)); return ret; #endif }
/* * check_passwd - Check the user name and passwd against the PAP secrets * file. If requested, also check against the system password database, * and login the user if OK. * * returns: * UPAP_AUTHNAK: Authentication failed. * UPAP_AUTHACK: Authentication succeeded. * In either case, msg points to an appropriate message. */ int check_passwd(int unit, char *auser, int userlen, char *apasswd, int passwdlen, char **msg, int *msglen) { int ret; char *filename; FILE *f; struct wordlist *addrs; u_int32_t remote; ipcp_options *ipwo = &ipcp_wantoptions[unit]; char passwd[256], user[256]; char secret[MAXWORDLEN]; static int attempts = 0; int len; /* * Make copies of apasswd and auser, then null-terminate them. */ len = MIN(passwdlen, sizeof(passwd) - 1); BCOPY(apasswd, passwd, len); passwd[len] = '\0'; len = MIN(userlen, sizeof(user) - 1); BCOPY(auser, user, len); user[len] = '\0'; *msg = NULL; /* * Open the file of pap secrets and scan for a suitable secret * for authenticating this user. */ filename = _PATH_UPAPFILE; addrs = NULL; ret = UPAP_AUTHACK; f = fopen(filename, "r"); if (f == NULL) { syslog(LOG_ERR, "Can't open PAP password file %s: %m", filename); ret = UPAP_AUTHNAK; } else { check_access(f, filename); remote = ipwo->accept_remote? 0: ipwo->hisaddr; if (scan_authfile(f, user, our_name, remote, secret, &addrs, filename) < 0) { warn("no PAP secret found for %s", user); } else { if (secret[0] != 0) { /* password given in pap-secrets - must match */ if ((cryptpap || strcmp(passwd, secret) != 0) && strcmp(crypt(passwd, secret), secret) != 0) { ret = UPAP_AUTHNAK; warn("PAP authentication failure for %s", user); } } } fclose(f); } if (uselogin && ret == UPAP_AUTHACK) { ret = plogin(user, passwd, msg, msglen); if (ret == UPAP_AUTHNAK) { syslog(LOG_WARNING, "PAP login failure for %s", user); } } if (ret == UPAP_AUTHNAK) { if (*msg == NULL) *msg = "Login incorrect"; *msglen = strlen(*msg); /* * Frustrate passwd stealer programs. * Allow 10 tries, but start backing off after 3 (stolen from login). * On 10'th, drop the connection. */ if (attempts++ >= 10) { syslog(LOG_WARNING, "%d LOGIN FAILURES ON %s, %s", attempts, devnam, user); quit(); } if (attempts > 3) sleep((u_int) (attempts - 3) * 5); if (addrs != NULL) free_wordlist(addrs); } else { attempts = 0; /* Reset count */ if (*msg == NULL) *msg = "Login ok"; *msglen = strlen(*msg); set_allowed_addrs(unit, addrs); } BZERO(passwd, sizeof(passwd)); BZERO(secret, sizeof(secret)); return ret; }
/* * scan_authfile - Scan an authorization file for a secret suitable * for authenticating `client' on `server'. The return value is -1 * if no secret is found, otherwise >= 0. The return value has * NONWILD_CLIENT set if the secret didn't have "*" for the client, and * NONWILD_SERVER set if the secret didn't have "*" for the server. * Any following words on the line (i.e. address authorization * info) are placed in a wordlist and returned in *addrs. */ static int scan_authfile(FILE *f, char *client, char *server, u_int32_t ipaddr, char *secret, struct wordlist **addrs, char *filename) { int newline, xxx; int got_flag, best_flag; FILE *sf; struct wordlist *ap, *addr_list, *alist, *alast; char word[MAXWORDLEN]; char atfile[MAXWORDLEN]; char lsecret[MAXWORDLEN]; if (addrs != NULL) *addrs = NULL; addr_list = NULL; if (!getword(f, word, &newline, filename)) return -1; /* file is empty??? */ newline = 1; best_flag = -1; for (;;) { /* * Skip until we find a word at the start of a line. */ while (!newline && getword(f, word, &newline, filename)) ; if (!newline) break; /* got to end of file */ /* * Got a client - check if it's a match or a wildcard. */ got_flag = 0; if (client != NULL && strcmp(word, client) != 0 && !ISWILD(word)) { newline = 0; continue; } if (!ISWILD(word)) got_flag = NONWILD_CLIENT; /* * Now get a server and check if it matches. */ if (!getword(f, word, &newline, filename)) break; if (newline) continue; if (server != NULL && strcmp(word, server) != 0 && !ISWILD(word)) continue; if (!ISWILD(word)) got_flag |= NONWILD_SERVER; /* * Got some sort of a match - see if it's better than what * we have already. */ if (got_flag <= best_flag) continue; /* * Get the secret. */ if (!getword(f, word, &newline, filename)) break; if (newline) continue; /* * Special syntax: @filename means read secret from file. */ if (word[0] == '@') { strcpy(atfile, word+1); if ((sf = fopen(atfile, "r")) == NULL) { syslog(LOG_WARNING, "can't open indirect secret file %s", atfile); continue; } check_access(sf, atfile); if (!getword(sf, word, &xxx, atfile)) { syslog(LOG_WARNING, "no secret in indirect secret file %s", atfile); fclose(sf); continue; } fclose(sf); } if (secret != NULL) strcpy(lsecret, word); /* * Now read address authorization info and make a wordlist. */ alist = alast = NULL; for (;;) { if (!getword(f, word, &newline, filename) || newline) break; ap = (struct wordlist *) malloc(sizeof(struct wordlist) + strlen(word)); if (ap == NULL) novm("authorized addresses"); ap->next = NULL; strcpy(ap->word, word); if (alist == NULL) alist = ap; else alast->next = ap; alast = ap; } /* * Check if the given IP address is allowed by the wordlist. */ if (ipaddr != 0 && !ip_addr_check(ipaddr, alist)) { free_wordlist(alist); continue; } /* * This is the best so far; remember it. */ best_flag = got_flag; if (addr_list) free_wordlist(addr_list); addr_list = alist; if (secret != NULL) strcpy(secret, lsecret); if (!newline) break; } if (addrs != NULL) *addrs = addr_list; else if (addr_list != NULL) free_wordlist(addr_list); non_wildclient = (best_flag & NONWILD_CLIENT) && client != NULL && *client != '\0'; return best_flag; }
int main(int argc, char **argv) { // test shell config struct stat shelltest; struct wordnode* commands; //head for list of possible paths to commands int rv = stat("shell-config", &shelltest); if (rv < 0) { printf("shell-config DNE. Please enter full path"); } else { int num_words = 0; commands = load_commands("shell-config",&num_words); //commands = "/bin/"; } char prompt[] = "prompt> "; printf("%s",prompt); fflush(stdout); int m=0; //keep track of mode char buffer[1024]; while (fgets(buffer, 1024, stdin) != NULL) { //handles comments, but only at the end of command int i=0; while (buffer[i]!='\0') { if (buffer[i]=='#') { buffer[i] = '\0'; i--; } i++; } // int size = size_of_array(buffer); char** argv = (char**) malloc(sizeof(char*)*(size+1)); make_array(buffer,argv,size); //print_array(argv,size); //printf("%d\n", size); if (m==0) { m = run_sequential(argv,size,commands); } else if (m==1) { m = run_par(argv,size); //pid_t pid; //int num; /*while ((pid = waitpid(-1, &stat, WNOHANG))>0) { printf("child process finished /n"); }*/ } printf("%s",prompt); } // end shell while loop free(argv); free_wordlist(commands); return 0; }