int main(int argc, char const *argv[]) { unsigned destination = 0; unsigned flit_number = 0; unsigned flit; unsigned packet_counter = 0; setup_uart(CPU_SPEED, UART_BAUDRATE); uart_puts("UART TEST: If you can read this, then UART output works!\n"); while(1){ if ((ni_read_flags() & NI_READ_MASK) == 0) { flit = ni_read(); }else if((ni_read_flags() & NI_WRITE_MASK) == 0 && packet_counter < 100) { flit_number ++; if (flit_number == 1){ ni_write(build_header(destination, 3)); destination ++; if (destination == MY_ADDR){ destination ++; } if (destination == 4){ destination = 0; } }else if (flit_number == 3){ ni_write(0); flit_number = 0; packet_counter ++; }else{ ni_write(0b1111111111111111111111111111); } } if (packet_counter >= 100){ while ((ni_read_flags() & NI_READ_MASK) == 0){ flit = ni_read(); } uart_puts("finished sending packets!\n"); break; } } /* Run CPU test */ test_plasma_funcitons(); return 0; }
static ni_status ni_idlist2binding(void *ni, ni_idlist *idlist, krb5_config_section **ret) { int i; ni_status nis; krb5_config_section **next; for (i = 0; i < idlist->ni_idlist_len; i++) { ni_proplist pl; ni_id nid; ni_idlist children; krb5_config_binding *b; ni_index index; nid.nii_instance = 0; nid.nii_object = idlist->ni_idlist_val[i]; nis = ni_read(ni, &nid, &pl); if (nis != NI_OK) { return nis; } index = ni_proplist_match(pl, "name", NULL); b = malloc(sizeof(*b)); if (b == NULL) return NI_FAILED; if (i == 0) { *ret = b; } else { *next = b; } b->type = krb5_config_list; b->name = ni_name_dup(pl.nipl_val[index].nip_val.ninl_val[0]); b->next = NULL; b->u.list = NULL; /* get the child directories */ nis = ni_children(ni, &nid, &children); if (nis == NI_OK) { nis = ni_idlist2binding(ni, &children, &b->u.list); if (nis != NI_OK) { return nis; } } nis = ni_proplist2binding(&pl, b->u.list == NULL ? &b->u.list : &b->u.list->next); ni_proplist_free(&pl); if (nis != NI_OK) { return nis; } next = &b->next; } ni_idlist_free(idlist); return NI_OK; }
ni_status ni2_copydirtoparentdir(void *srcdomain, ni_id *srcdir, void*dstdomain, ni_id *dstdir , bool recursive) { ni_status ret; ni_idlist children; int i, len; ni_proplist p; ni_id dir, newdstdir; NI_INIT(&p); /* get proplist from src dir */ ret = ni_read(srcdomain, srcdir, &p); if (ret != NI_OK) { return ret; } /* create the destination dir */ ret = ni_create(dstdomain, dstdir, p, &newdstdir, NI_INDEX_NULL); if (ret != NI_OK) { ni_proplist_free(&p); return ret; } ni_proplist_free(&p); if (recursive) { NI_INIT(&children); /* get list of children */ ret = ni_children(srcdomain, srcdir, &children); if (ret != NI_OK) { return ret; } len = children.ni_idlist_len; for (i = 0; i < len; i++) { dir.nii_object = children.ni_idlist_val[i]; ret = ni_self(srcdomain, &dir); if (ret != NI_OK) { ni_idlist_free(&children); return ret; } ret = ni2_copydirtoparentdir(srcdomain,&dir,dstdomain, &newdstdir,recursive); } ni_idlist_free(&children); } return NI_OK; }
/* * Change a user's password in NetInfo. */ PAM_EXTERN int pam_sm_chauthtok(pam_handle_t * pamh, int flags, int argc, const char **argv) { char *oldHash, *newHash; char *oldPassword = NULL, *newPassword = NULL; void *d; int status, isroot, tries, maxTries; int options = 0; int amChangingExpiredPassword; ni_id dir; ni_proplist pl; ni_property p; ni_namelist nl; int ni_uid, uid, secure, minlen, lifetime; ni_index where; struct pam_conv *appconv; struct pam_message msg, *pmsg; struct pam_response *resp; const char *cmiscptr = NULL; char *uname; char salt[9]; int i; amChangingExpiredPassword = flags & PAM_CHANGE_EXPIRED_AUTHTOK; status = pam_get_item(pamh, PAM_CONV, (void **) &appconv); if (status != PAM_SUCCESS) return status; status = pam_get_item(pamh, PAM_USER, (void **) &uname); if (status != PAM_SUCCESS) return status; if (uname == NULL) return PAM_USER_UNKNOWN; status = pam_get_item(pamh, PAM_OLDAUTHTOK, (void **) &oldPassword); if (status != PAM_SUCCESS) { return status; } if (pam_test_option(&options, PAM_OPT_USE_FIRST_PASS, NULL) || pam_test_option(&options, PAM_OPT_TRY_FIRST_PASS, NULL)) { if (pam_get_item(pamh, PAM_AUTHTOK, (void **) &newPassword) != PAM_SUCCESS) newPassword = NULL; if (pam_test_option(&options, PAM_OPT_USE_FIRST_PASS, NULL) && newPassword == NULL) return PAM_AUTHTOK_RECOVER_ERR; } d = domain_for_user(uname, NULL, &dir); if (d == (void *) NULL) { syslog(LOG_ERR, "user %s not found in NetInfo", uname); return PAM_USER_UNKNOWN; } /* * These should be configurable in NetInfo. */ secure = secure_passwords(); maxTries = secure ? 3 : 5; minlen = secure ? 8 : 5; /* * Read the passwd and uid from NetInfo. */ status = ni_lookupprop(d, &dir, "passwd", &nl); if (status == NI_NOPROP) nl.ni_namelist_len = 0; else if (status != NI_OK) { ni_free(d); syslog(LOG_ERR, "NetInfo read failed: %s", ni_error(status)); return netinfo2PamStatus(status); } oldHash = NULL; if (nl.ni_namelist_len > 0) oldHash = nl.ni_namelist_val[0]; status = ni_lookupprop(d, &dir, "uid", &nl); if (status != NI_OK) { ni_free(d); syslog(LOG_ERR, "NetInfo read failed: %s", ni_error(status)); return netinfo2PamStatus(status); } ni_uid = -2; if (nl.ni_namelist_len > 0) ni_uid = atoi(nl.ni_namelist_val[0]); /* * See if I'm uid 0 on the master host for the user's NetInfo domain. */ isroot = is_root_on_master(d); uid = getuid(); if (isroot) { if (flags & PAM_PRELIM_CHECK) { /* Don't need old password. */ return PAM_SUCCESS; } } else if (uid != ni_uid) { ni_free(d); return PAM_PERM_DENIED; } if (flags & PAM_PRELIM_CHECK) { /* * If we are not root, we should verify the old * password. */ char *encrypted; if (oldPassword != NULL && (pam_test_option(&options, PAM_OPT_USE_FIRST_PASS, NULL) || pam_test_option(&options, PAM_OPT_TRY_FIRST_PASS, NULL))) { encrypted = crypt(oldPassword, oldHash); if (oldPassword[0] == '\0' && oldHash != '\0') encrypted = ":"; status = strcmp(encrypted, oldHash) == 0 ? PAM_SUCCESS : PAM_AUTH_ERR; if (status != PAM_SUCCESS) { if (pam_test_option(&options, PAM_OPT_USE_FIRST_PASS, NULL)) sendConversationMessage(appconv, "NetInfo password incorrect", PAM_ERROR_MSG, &options); else sendConversationMessage(appconv, "NetInfo password incorrect: try again", PAM_ERROR_MSG, &options); } else { ni_free(d); return PAM_SUCCESS; } } tries = 0; while (oldPassword == NULL && tries++ < maxTries) { pmsg = &msg; msg.msg_style = PAM_PROMPT_ECHO_OFF; msg.msg = OLD_PASSWORD_PROMPT; resp = NULL; status = appconv->conv(1, (struct pam_message **) & pmsg, &resp, appconv->appdata_ptr); if (status != PAM_SUCCESS) { ni_free(d); return status; } oldPassword = resp->resp; free(resp); encrypted = crypt(oldPassword, oldHash); if (oldPassword[0] == '\0' && oldHash != '\0') encrypted = ":"; status = strcmp(encrypted, oldHash) == 0 ? PAM_SUCCESS : PAM_AUTH_ERR; if (status != PAM_SUCCESS) { int abortMe = 0; if (oldPassword != NULL && oldPassword[0] == '\0') abortMe = 1; _pam_overwrite(oldPassword); _pam_drop(oldPassword); if (!amChangingExpiredPassword & abortMe) { sendConversationMessage(appconv, "Password change aborted", PAM_ERROR_MSG, &options); ni_free(d); return PAM_AUTHTOK_RECOVER_ERR; } else { sendConversationMessage(appconv, "NetInfo password incorrect: try again", PAM_ERROR_MSG, &options); } } } if (oldPassword == NULL) { status = PAM_MAXTRIES; } (void) pam_set_item(pamh, PAM_OLDAUTHTOK, oldPassword); ni_free(d); return status; } /* PAM_PRELIM_CHECK */ status = PAM_ABORT; tries = 0; while (newPassword == NULL && tries++ < maxTries) { pmsg = &msg; msg.msg_style = PAM_PROMPT_ECHO_OFF; msg.msg = NEW_PASSWORD_PROMPT; resp = NULL; status = appconv->conv(1, &pmsg, &resp, appconv->appdata_ptr); if (status != PAM_SUCCESS) { ni_free(d); return status; } newPassword = resp->resp; free(resp); if (newPassword[0] == '\0') { free(newPassword); newPassword = NULL; } if (newPassword != NULL) { if (isroot == 0) { if (oldPassword != NULL && !strcmp(oldPassword, newPassword)) { cmiscptr = "Passwords must differ"; newPassword = NULL; } else if (strlen(newPassword) < minlen) { cmiscptr = "Password too short"; newPassword = NULL; } } } else { ni_free(d); return PAM_AUTHTOK_RECOVER_ERR; } if (cmiscptr == NULL) { /* get password again */ char *miscptr; pmsg = &msg; msg.msg_style = PAM_PROMPT_ECHO_OFF; msg.msg = AGAIN_PASSWORD_PROMPT; resp = NULL; status = appconv->conv(1, &pmsg, &resp, appconv->appdata_ptr); if (status != PAM_SUCCESS) { ni_free(d); return status; } miscptr = resp->resp; free(resp); if (miscptr[0] == '\0') { free(miscptr); miscptr = NULL; } if (miscptr == NULL) { if (!amChangingExpiredPassword) { sendConversationMessage(appconv, "Password change aborted", PAM_ERROR_MSG, &options); ni_free(d); return PAM_AUTHTOK_RECOVER_ERR; } } else if (!strcmp(newPassword, miscptr)) { miscptr = NULL; break; } sendConversationMessage(appconv, "You must enter the same password", PAM_ERROR_MSG, &options); miscptr = NULL; newPassword = NULL; } else { sendConversationMessage(appconv, cmiscptr, PAM_ERROR_MSG, &options); cmiscptr = NULL; newPassword = NULL; } } if (cmiscptr != NULL || newPassword == NULL) { ni_free(d); return PAM_MAXTRIES; } /* * Lock onto the master server. */ ni_needwrite(d, 1); /* * Authenticate if necessary */ if (isroot == 0) { ni_setuser(d, uname); ni_setpassword(d, oldPassword); } /* * Create a random salt */ srandom((int) time((time_t *) NULL)); salt[0] = saltchars[random() % strlen(saltchars)]; salt[1] = saltchars[random() % strlen(saltchars)]; salt[2] = '\0'; newHash = crypt(newPassword, salt); /* * Change the password in NetInfo. */ status = ni_read(d, &dir, &pl); if (status != NI_OK) { ni_free(d); syslog(LOG_ERR, "NetInfo read failed: %s", ni_error(status)); return netinfo2PamStatus(status); } p.nip_name = "passwd"; p.nip_val.ni_namelist_len = 1; p.nip_val.ni_namelist_val = (ni_name *) malloc(sizeof(ni_name)); p.nip_val.ni_namelist_val[0] = newHash; where = ni_proplist_match(pl, p.nip_name, NULL); if (where == NI_INDEX_NULL) status = ni_createprop(d, &dir, p, NI_INDEX_NULL); else status = ni_writeprop(d, &dir, where, p.nip_val); if (status != NI_OK) { ni_free(d); syslog(LOG_ERR, "NetInfo write property \"passwd\" failed: %s", ni_error(status)); return netinfo2PamStatus(status); } /* * Now, update "change" property. If this fails, we've still * updated the password... perhaps the user should be alerted * of this. */ lifetime = password_lifetime(); if (lifetime > 0) { struct timeval tp; char change[64]; where = ni_proplist_match(pl, "change", NULL); gettimeofday(&tp, NULL); tp.tv_sec += lifetime; snprintf(change, sizeof(change), "%ld", tp.tv_sec); p.nip_name = "change"; p.nip_val.ni_namelist_len = 1; p.nip_val.ni_namelist_val[0] = change; if (where == NI_INDEX_NULL) status = ni_createprop(d, &dir, p, NI_INDEX_NULL); else status = ni_writeprop(d, &dir, where, p.nip_val); if (status != NI_OK) { ni_free(d); syslog(LOG_ERR, "NetInfo write property \"change\" failed: %s", ni_error(status)); return netinfo2PamStatus(status); } } free(p.nip_val.ni_namelist_val); ni_free(d); /* tell lookupd to invalidate its cache */ { int i, proc = -1; unit lookup_buf[MAX_INLINE_UNITS]; #ifdef __NeXT__ port_t port; #else mach_port_t port; #endif port = _lookupd_port(0); (void) _lookup_link(port, "_invalidatecache", &proc); (void) _lookup_one(port, proc, NULL, 0, lookup_buf, &i); } return PAM_SUCCESS; }
static int is_root_on_master(void *d) { int uid; char myhostname[MAXHOSTNAMELEN + 1]; char *p; ni_index where; ni_proplist pl; int status; ni_id dir; struct sockaddr_in addr; char *tag; uid = getuid(); if (uid != 0) return 0; gethostname(myhostname, MAXHOSTNAMELEN); p = strchr(myhostname, '.'); if (p != NULL) *p = '\0'; status = ni_root(d, &dir); if (status != NI_OK) return 0; status = ni_read(d, &dir, &pl); if (status != NI_OK) return 0; where = ni_proplist_match(pl, "master", NULL); if (where == NI_INDEX_NULL) { ni_proplist_free(&pl); return 0; } if (pl.ni_proplist_val[where].nip_val.ni_namelist_len == 0) { ni_proplist_free(&pl); fprintf(stderr, "No value for NetInfo master property\n"); return 0; } p = strchr(pl.ni_proplist_val[where].nip_val.ni_namelist_val[0], '/'); if (p != NULL) *p = '\0'; p = strchr(pl.ni_proplist_val[where].nip_val.ni_namelist_val[0], '.'); if (p != NULL) *p = '\0'; if (!strcmp(pl.ni_proplist_val[where].nip_val.ni_namelist_val[0], myhostname)) { ni_proplist_free(&pl); return 1; } if (!strcmp(pl.ni_proplist_val[where].nip_val.ni_namelist_val[0], "localhost")) { ni_proplist_free(&pl); ni_addrtag(d, &addr, &tag); if (sys_ismyaddress(addr.sin_addr.s_addr)) return 1; } ni_proplist_free(&pl); return 0; }
int main(int argc, char const *argv[]) { unsigned flit; unsigned flit_type; unsigned payload; unsigned packet_counter = 1; /* Test UART */ setup_uart(CPU_SPEED, UART_BAUDRATE); uart_puts("UART TEST: If you can read this, then UART output works!\n"); #if (UART_IN_TEST == 1) uart_puts("Please press letter 'b' on the UART terminal:\n"); char uart_in = uart_getch(); if (uart_in == 'b') { uart_puts("UART INPUT TEST PASSED!\n\n"); } else { uart_puts("UART INPUT TEST FAILED!\n"); uart_puts("Received following letter: {ASCII:HEX}\n"); uart_putchar(uart_in); uart_putchar(':'); uart_print_hex(uart_in); uart_puts("\n\n"); } #endif #if (GPIO_TEST == 1) /* Test GPIO */ unsigned gpio_in = memory_read(GPIOA_IN); memory_write(GPIO0_SET, gpio_in); #endif uart_puts("\n\nBeginning communication test\n\n"); ni_write(build_header(DST_ADDR, 3)); ni_write(0b1111111111111111111111111111); ni_write(0); while (packet_counter <= SEND_PACKET_COUNT) { if ((ni_read_flags() & NI_READ_MASK) == 0) { flit = ni_read(); flit_type = get_flit_type(flit); if (flit_type == FLIT_TYPE_HEADER) { uart_puts("Sending packet number "); uart_print_num(packet_counter, 10, 0); uart_putchar('\n'); ni_write(build_header(DST_ADDR, 3)); packet_counter++; } else { payload = get_flit_payload(flit); ni_write(payload); } } } /* Run CPU test */ test_plasma_funcitons(); return 0; }