int Usage (char *rtn) { extern DN dn, savename; int i; dn_free (dn); dn = savename; savename = NULLDN; if (print_arg_error (OPT) == OK) return; for (i = 0; help_info[i].command != 0; i++) if (strcmp (help_info[i].command, rtn) == 0) { if (help_info[i].serv) { ps_printf (OPT, "Usage %s [-help] [<object>] %s \n", rtn, help_info[i].args); print_other(OPT, help_info[i].other); ps_printf (OPT, "\n[<service controls>]\n"); } else ps_printf (OPT, "Usage %s [-help] %s\n", rtn, help_info[i].args); return; } ps_print (OPT, "Usage...\n"); }
int help_arg (char *rtn) { int i; for (i = 0; help_info[i].command != 0; i++) if (strcmp (help_info[i].command, rtn) == 0) { if (help_info[i].serv) { ps_printf (RPS, "%-10s - %s\n[<object>] %s ", rtn, help_info[i].use,help_info[i].args); print_other(RPS,help_info[i].other); ps_print (RPS,"\n"); print_service(); } else ps_printf (RPS, "%-10s - %s\n%s\n", rtn, help_info[i].use,help_info[i].args); return; } ps_print (OPT,"Sorry - No help available\n"); }
uint64_t syscall_ps() { ps_print(curr_task->proc.pid,curr_task->proc.name); //printf("PID:[%d] Process:[%s]\n", curr_task->proc.pid, // curr_task->proc.name); struct process_queue *iter = pqueue; while (iter) { //printf("PID:[%d] Process:[%s]\n", iter->proc.pid, // iter->proc.name); ps_print(iter->proc.pid,iter->proc.name); iter = iter->next; } iter = wqueue; while (iter) { //printf("PID:[%d] Process:[%s]\n", iter->proc.pid, // iter->proc.name); ps_print(iter->proc.pid,iter->proc.name); iter = iter->next; } //printf("PID:[%d] Process:[%s]\n", idle_task->proc.pid, // idle_task->proc.name); ps_print(idle_task->proc.pid,idle_task->proc.name); return 0; }
main() { struct passwd *pw_entry ; struct passwd *getpwuid() ; struct stat buf ; int i = 1 ; int uid ; int um ; char pass1[LINESIZE] ; char pass2[LINESIZE] ; char Read_in_Stuff[LINESIZE] ; char **vecptr ; char *tmpdraft ; char home_dir[LINESIZE] ; char *p, *part1, *part2 ; char quipurc_file[100] ; char tailor_file[100] ; char user_name[9] ; char *localptr = Local ; char print_format = EDBOUT ; EntryInfo *ptr ; static CommonArgs ca = default_common_args; vecptr = (char **) malloc(100) ; vecptr[0] = malloc (LINESIZE) ; (void) strcpy(vecptr[0], "showentry") ; (void) strcpy(pass1, "x") ; (void) strcpy(pass2, "y") ; tmpdraft = malloc (LINESIZE) ; (void) strcpy(tmpdraft, "/tmp/dish-") ; if ((opt = ps_alloc (std_open)) == NULLPS) fatal (-62, "ps_alloc failed"); if (std_setup (opt, stderr) == NOTOK) fatal (-63, "std_setup failed"); if ((rps = ps_alloc (std_open)) == NULLPS) fatal (-64, "ps_alloc 2 failed"); if (std_setup (rps, stdout) == NOTOK) fatal (-65, "std_setup 2 failed"); (void) strcpy(filterstring, "userid=") ; /* Sort out files, userids etc. */ uid=getuid() ; if ((pw_entry=getpwuid(uid)) == 0) { ps_printf(rps, "Who are you? (no name for your uid number)\n") ; exit(1) ; } (void) strcpy(user_name, pw_entry->pw_name) ; (void) strcat(tmpdraft, user_name) ; if (getenv("HOME") == 0) { ps_printf(rps, "No home directory?!!") ; (void) strcpy(home_dir, pw_entry->pw_dir) ; } else { (void) strcpy(home_dir, getenv("HOME")) ; } (void) strcpy(quipurc_file, home_dir) ; (void) strcat(quipurc_file, "/.quipurc") ; (void) strcpy(tailor_file, isodefile ("dishinit", 1)); Manager[0] = 0; Password[0] = 0; Local[0] = 0; (void) stat(tailor_file, &buf) ; (void) seteuid(buf.st_uid) ; /* set effective to enable */ /* us to read protected file */ if ((fp_tailor = fopen(tailor_file, "r")) == 0) { ps_print(rps, "Can't open Tailor File. Abort.\n") ; exit(1) ; } while (fgets (Read_in_Stuff, LINESIZE, fp_tailor) != 0) { if (!strcmp(Read_in_Stuff, "##Anything after this line is copied into the users ~/.quipurc file\n")) { break ; } p = SkipSpace (Read_in_Stuff); if (( *p == '#') || (*p == '\0')) continue; /* ignore comments and blanks */ part1 = p; if ((part2 = index (p,':')) == NULLCP) { ps_printf (opt,"Seperator missing '%s'. Ignoring..\n",p); } *part2++ = '\0'; part2 = TidyString (part2); if (lexequ(part1, "manager") == 0) { (void) strcpy(Manager, part2) ; } else if (lexequ(part1, "password") == 0) { (void) strcpy(Password, part2) ; } else if (lexequ(part1, "local") == 0) { (void) strcpy(Local, part2) ; } else { ps_printf(rps, "Error in tailor. What's a %s?\n", part1) ; } } (void) setuid(uid) ; /* Restore Userid to original user. */ /* create ~/.quipurc file. NB this does eradicate anything in there. * (Theoretically nothing.) */ if (Manager[0] == 0) { ps_print(rps, "Can't find out the managers name\n") ; exit(1) ; } if (Password[0] == 0) { ps_print(rps, "Can't find out the managers password\n") ; exit(1) ; } if (Local[0] == 0) { ps_print(rps, "Can't find out where to search\n") ; exit(1) ; } um = umask(0177) ; if ((fp_quipurc = fopen(quipurc_file, "w")) == 0) { ps_printf(rps, "Can't open ~/.quipurc. Aborting..\n") ; exit(1) ; } (void) umask(um) ; if ((fileps = ps_alloc(std_open)) == NULLPS) { fatal (-66, "ps_alloc 2 failed"); } if (std_setup (fileps, fp_quipurc) == NOTOK) { fatal (-67, "std_setup 2 failed"); } /* Sorting out the bind section */ quipu_syntaxes() ; /* set up the needed function pointers */ dsap_init(&i, &vecptr) ; (void) strcpy(bindarg.dba_passwd, Password) ; bindarg.dba_version = DBA_VERSION_V1988; bindarg.dba_passwd_len = strlen(bindarg.dba_passwd) ; if ((bindarg.dba_dn = str2dn (Manager)) == NULLDN) { ps_printf (opt,"Invalid Manager name %s (???!)\n",Manager) ; exit(1) ; } if (ds_bind (&bindarg, &binderr, &bindresult) != OK) { ps_printf(rps, "Can't bind as the manager.\n") ; exit(1); } /* Hopefully, should be successfully bound */ /* * We now call the search stuff with the right bits, to see if we can get a * match of uid='user_name'. Once there, we echo lots of information from * their entry out to the .quipurc file. * Hopefully there should only be one match. This assumes that ALL dir info * up to date, and that SG do not allow multiple users with the same login. */ /* set up the appropriate structures and defaults. */ search_arg.sra_common = ca; /* struct copy */ search_arg.sra_common.ca_servicecontrol.svc_sizelimit = 2 ; search_arg.sra_eis.eis_allattributes = FALSE ; search_arg.sra_searchaliases = FALSE; search_arg.sra_subset = SRA_ONELEVEL; search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES ; search_arg.sra_eis.eis_select = NULLATTR ; search_arg.sra_eis.eis_allattributes = TRUE ; search_arg.sra_filter = filter_alloc() ; /* Default filter. */ search_arg.sra_filter->flt_next = NULLFILTER; search_arg.sra_filter->flt_type = FILTER_ITEM; search_arg.sra_filter->FUFILT = NULLFILTER; if (*localptr == '@') { localptr++; } if ((search_arg.sra_baseobject = str2dn(localptr)) == NULLDN) { ps_printf (opt,"Invalid sequence in username %s.\n", localptr); exit(1) ; } (void) strcat(filterstring, user_name) ; search_arg.sra_filter->flt_un.flt_un_item.fi_type = FILTERITEM_EQUALITY ; if ((search_arg.sra_filter->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type = AttrT_new ("userid")) == NULLAttrT) { ps_printf(rps, "Oops, userid is not a valid attr type. ABORT!!\n") ; exit(1) ; } if ((search_arg.sra_filter->flt_un.flt_un_item.fi_un.fi_un_ava.ava_value = str2AttrV (user_name, search_arg.sra_filter->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type->oa_syntax)) == NULLAttrV) { ps_printf(rps, "%s is not a valid attribute value.\n", user_name) ; } /* call search */ /* We now ought to be in the right place, and with the search stuff set, * ready to call search, and receive one (or no) entry back, which then * gets processed accordingly. */ if (ds_search (&search_arg, &search_error, &search_result) != DS_OK) { ps_printf(rps, "Search failed...\n") ; exit (1) ; /* This is not the same as coming back with */ /* message "search failed to find anything. */ } /* If the user does not exist in the DIT, print out the limited .quipurc * and the warning message, and allow the user to play DISH. */ if (search_result.CSR_entries == NULLENTRYINFO) { ps_printf(opt, "Unfortunately, you seem to have no entry in\n") ; ps_printf(opt, "the directory. Contact '%s' who should be able to help.\n", Manager) ; ps_printf(opt, "In the mean time, you can read, but not write.\n") ; } else { ptr = search_result.CSR_entries ; dn = dn_cpy(ptr->ent_dn) ; /* Essence of move user_name. */ /* collect the info and put it into current_entry */ /* Set up the desired attribute type to be read*/ /* from read.c */ if ((at = AttrT_new ("userPassword")) != NULLAttrT) { as_flag = as_merge (as_flag, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); } else { ps_printf(rps, "Oops, Serious error. unknown attribute type 'userPassword'.\n") ; exit(1) ; } if ((current_entry = local_find_entry (dn, FALSE)) == NULLENTRY) { read_arg.rda_common = ca; /* struct copy */ read_arg.rda_object = dn; read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; read_arg.rda_eis.eis_allattributes = TRUE ; read_arg.rda_eis.eis_select = NULLATTR ; if (ds_read (&read_arg, &read_error, &read_result) != DS_OK) { ps_printf(rps, "We even seem to be having problems reading\n" ) ; ps_printf(rps, "an entry we searched and found!! HELP!!\n") ; exit(1) ; } if (read_result.rdr_entry.ent_attr == NULLATTR) { ps_printf(rps, "No attributes present. Even though\n") ; ps_printf(rps, "we found you by userid attribute!!! HELP!!\n") ; exit (1) ; } cache_entry (&(read_result.rdr_entry), read_arg.rda_eis.eis_allattributes, TRUE) ; } if ((current_entry = local_find_entry (dn, FALSE)) == NULLENTRY) { ps_printf(rps, "We still have nothing.Even after reading? Abort.\n") ; exit(1) ; } ps_printf(fileps, "username: "******"\n") ; ps_printf(fileps, "me: ") ; dn_print(fileps, dn, EDBOUT) ; ps_printf(fileps, "\n") ; /* now showattribute -nokey to display it. */ ps_printf(fileps, "password: "******"You need a password...\n") ; (void) strcpy(pass1, getpassword("Enter Password: "******"Re-enter password: "******"\nMismatch - Try again.\n") ; } } ps_printf(fileps, "%s\n", pass1) ; um = umask(0177) ; if ((fp_draft = fopen(tmpdraft, "w")) == 0) { ps_print(rps, "Can't open draft file... Abort.\n") ; exit(1) ; } (void) umask(um) ; (void) fprintf(fp_draft, "UserPassword = %s\n", pass1) ; (void) fprintf(fp_draft, "acl = self # write # attributes # acl $ userPassword\n") ; (void) fprintf(fp_draft, "acl = others # compare # attributes # acl $ userPassword\n\n") ; (void) fclose(fp_draft) ; if ((fp_draft = fopen (tmpdraft, "r")) == NULL) { ps_printf (opt, "Can't open draft entry %s\n", tmpdraft); exit(1) ; } entry_ptr = get_default_entry (NULLENTRY); #ifdef TURBO_DISK entry_ptr->e_attributes = fget_attributes (fp_draft); #else entry_ptr->e_attributes = get_attributes (fp_draft); #endif (void) fclose (fp_draft); mod_arg.mea_common = ca; /* struct copy */ mod_arg.mea_object = dn; for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent) ; entry_ptr->e_name = rdn_cpy (moddn->dn_rdn); /* add rdn as attribute */ avst = avs_comp_new (AttrV_cpy (&entry_ptr->e_name->rdn_av)); temp = as_comp_new (AttrT_cpy (entry_ptr->e_name->rdn_at), avst, NULLACL_INFO); entry_ptr->e_attributes = as_merge (entry_ptr->e_attributes, temp); for (as = entry_ptr->e_attributes; as != NULLATTR; as = as->attr_link) { emnew = NULLMOD; trail = as->attr_link; as->attr_link = NULLATTR; temp = current_entry->e_attributes; for (; temp != NULLATTR; temp = temp->attr_link) if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) { /* found it - does it need changing ? */ if (avs_cmp (as->attr_value, temp->attr_value) != 0) emnew = modify_avs (as->attr_value, temp->attr_value,as->attr_type); break; } if (temp == NULLATTR) { emnew = em_alloc (); emnew->em_type = EM_ADDATTRIBUTE; emnew->em_what = as_cpy(as); emnew->em_next = NULLMOD; } if (emnew != NULLMOD) { mod_arg.mea_changes = ems_append (mod_arg.mea_changes,emnew); } as->attr_link = trail; } while (ds_modifyentry (&mod_arg, &mod_error) != DS_OK) { if (dish_error (opt, &mod_error) == 0) { ps_printf(rps,"We have a dish error. Bye.\n") ; entry_free (entry_ptr); exit(1) ; } mod_arg.mea_object = mod_error.ERR_REFERRAL.DSE_ref_candidates->cr_name; } ps_print (rps, "Modified "); dn_print (rps, dn, EDBOUT); ps_print (rps, "\n"); delete_cache (dn); /* re-cache when next read */ entry_free (entry_ptr); ems_part_free (mod_arg.mea_changes); } } while(fgets(Read_in_Stuff, LINESIZE, fp_tailor) != 0) { fputs(Read_in_Stuff, fp_quipurc) ; } (void) fclose(fp_quipurc) ; (void) fclose(fp_tailor) ; /* (void) fprintf(fp_quipurc, "dsap: local_dit \"%s\"\n", Local) ; (void) fprintf(fp_quipurc, "notype: acl\n") ; (void) fprintf(fp_quipurc, "notype: treestructure\n") ; (void) fprintf(fp_quipurc, "notype: masterdsa\n") ; (void) fprintf(fp_quipurc, "notype: slavedsa\n") ; (void) fprintf(fp_quipurc, "notype: objectclass\n") ; (void) fprintf(fp_quipurc, "cache_time: 30\n") ; (void) fprintf(fp_quipurc, "connect_time: 2\n") ; */ (void) ds_unbind() ; (void) unlink(tmpdraft) ; }
int call_moveto (int argc, char **argv) { char pwd_flag = FALSE; char check_move = TRUE; int x; if (argc == 1) { Usage (argv[0]); return; } move_flag = FALSE; for (x = 1; x < argc; x++) { if (test_arg (argv[x],"-pwd",1)) pwd_flag = TRUE; else if (test_arg (argv[x],"-nopwd",3)) pwd_flag = FALSE; else if (test_arg (argv[x],"-check",1)) check_move = TRUE; else if (test_arg (argv[x],"-nocheck",3)) check_move = FALSE; else if (test_arg (argv[x], "-sequence",3)) { if (x + 1 == argc) { ps_printf (OPT, "We need a sequence name.\n"); return; } else { shuffle_up (argc--, argv, x); set_sequence (argv[x]); } } else if (move (argv[x]) == OK) { if (move_flag == TRUE) { ps_print (RPS,"Too many parameters !\n"); Usage (argv[0]); return; } move_flag = TRUE; } else { move_flag = FALSE; if (*argv[x] != '-') ps_printf (OPT,"Unknown entity '%s'\n",argv[x]); else Usage (argv[0]); return; } } if (check_move) if (test_move_dn() != TRUE) { move_flag = FALSE; return; } if (move_flag == TRUE) consolidate_move (); if (pwd_flag) { dn_print (RPS, fixed_pos, EDBOUT); ps_print (RPS, "\n"); } }
int move (char *arg) { extern int print_parse_errors; DN user_down (); DN str2dn_aux (); DN sequence_dn(); DN tmpdn; char * ptr; char alias = FALSE; int len; print_parse_errors = FALSE; if (*arg == '-') { print_parse_errors = TRUE; return (NOTOK); /* can't be a move if it starts with a minus */ } if (*arg == '+') arg++; /* old style call */ ptr = arg; while (*ptr != 0) { if (! isdigit (*ptr)) break; ptr++; } if (*ptr == 0) { /* sequence move */ dn_free (dn); dn = dn_cpy (sequence_dn(atoi(arg))); print_parse_errors = TRUE; if (dn == NULLDN) { ps_printf (OPT,"Invalid sequence number %s\n",arg); return (NOTOK); } else return (OK); } len = strlen(arg); if ((arg[0] == '<') && ( arg[len-1] == '>')) { dn_free(dn); dn = str2dn(arg); return (OK); } if ((ptr = index (arg,'@')) != NULLCP) { *ptr = 0; if (*arg == 0) { /* from root */ dn_free (dn); dn = NULLDN; *ptr ='@'; arg = ++ptr; if (*arg == 0) { print_parse_errors = TRUE; return (OK); /* @ -> move to root */ } if ((ptr = index (arg,'@')) != NULLCP) *ptr = 0; } } else { dn_free (dn); dn = dn_cpy (fixed_pos); } if (strcmp (arg,"..") == 0) { do { DN dnptr; DN trail; if (dn == NULLDN) { print_parse_errors = TRUE; ps_print (OPT, "Can't go back past root\n"); return (NOTOK); } if (dn->dn_parent == NULLDN) { dn_free (dn); dn = NULLDN; } else { for (dnptr = dn; dnptr->dn_parent != NULLDN; dnptr = dnptr->dn_parent) trail = dnptr; dn_comp_free (dnptr); trail->dn_parent = NULLDN; } if (ptr == NULLCP) { print_parse_errors = TRUE; return (OK); } arg = ++ptr; if ((ptr = index (arg,'@')) != NULLCP) *ptr = 0; } while (strcmp (arg,"..") == 0); } if (ptr != NULL) *ptr = '@'; if ((tmpdn = str2dn_aux (arg,&alias)) != NULLDN) { if (dn == NULLDN) dn = tmpdn; else { if (alias) { dn_free (dn); dn = tmpdn; } else dn_append (dn,tmpdn); } print_parse_errors = TRUE; return (OK); } else { print_parse_errors = TRUE; return (NOTOK); } }
int call_showentry (int argc, char **argv) { Attr_Sequence eptr; char *vect[2]; int x; extern char name_flag; extern char all_flag; extern Attr_Sequence as_flag; extern char flag_show; char full_edb_flag; char *temp_file_name; extern int mod_template(); vect[0] = "showentry"; move_flag = FALSE; fred_flag = FALSE; fred_expand = FALSE; fred_list = FALSE; fred_long = 2; fred_phone = FALSE; fred_photo = FALSE; fred_sequence = TRUE; fred_subdisplay = FALSE; name_flag = FALSE; full_edb_flag = FALSE; for (x=1; x<argc; x++) { if (test_arg (argv[x], "-move",2)) move_flag = TRUE; else if (test_arg (argv[x], "-nomove",3)) move_flag = FALSE; else if (test_arg (argv[x], "-fred",4)) fred_flag = TRUE; else if (test_arg (argv[x], "-expand",4)) fred_expand = TRUE; else if (test_arg (argv[x], "-fredlist",8)) fred_list = TRUE; else if (test_arg (argv[x], "-full",4)) fred_long = TRUE; else if (test_arg (argv[x], "-summary",7)) fred_long = FALSE; else if (test_arg (argv[x], "-phone",5)) fred_phone = TRUE; else if (test_arg (argv[x], "-fredphoto",9)) fred_photo = dad_flag; else if (test_arg (argv[x], "-nofredseq",9)) fred_sequence = FALSE; else if (test_arg (argv[x], "-subdisplay",10)) fred_subdisplay = TRUE; else if (test_arg (argv[x], "-fedb",4)) { if (x + 1 == argc) { ps_printf (opt, "We need a filename for the full edb entry.\n"); return; } else { shuffle_up (argc, argv, x); argc--; if (*(temp_file_name = argv[x]) != '/') { ps_printf (opt, "We need a real file spec for the file name.\n"); return; } } full_edb_flag = TRUE; } else continue; shuffle_up (argc--,argv,x--); } if ((argc = read_cache (argc, argv)) < 0) return; if (argc != 1) { ps_printf (OPT,"Unknown option %s\n",argv[1]); Usage (argv[0]); return; } if (current_entry == NULLENTRY) { ps_print (OPT,"Specify an entry \n"); /* this CAN happen - when the entry is not cache, but -noread */ return; } if (full_edb_flag) { mod_template(temp_file_name,0); return; } if (fred_flag) { if (fred_long == 2) if ((fred_subdisplay && fred_expand) || (!fred_subdisplay && !fred_expand)) fred_long = TRUE; else fred_long = fred_expand; if (fred_expand) fred_long = fred_subdisplay = TRUE; if (fred_list && frompipe && rps -> ps_byteno == 0 && opt -> ps_byteno == 0) { DN new_dn = dn_cpy (current_dn); showfredDNs (new_dn, fred_long); dn_free (new_dn); } showfred (current_dn, fred_long, fred_subdisplay); } else { if (name_flag) { dn_print (RPS,dn,EDBOUT); ps_print (RPS,"\n"); } if (all_flag) eptr = current_entry->e_attributes; else eptr = as_flag; if (flag_show) for (; eptr != NULLATTR; eptr = eptr->attr_link) showattribute (eptr->attr_type); } consolidate_move(); }
int call_modify (int argc, char **argv) { struct ds_modifyentry_arg mod_arg; struct DSError error; struct entrymod *emnew, *ems_append(), *modify_avs(); Attr_Sequence as, #ifdef TURBO_DISK fget_attributes (), #else get_attributes (), #endif temp, trail = NULLATTR; AV_Sequence avst = NULLAV; extern AttributeType at_objectclass; extern int parse_status; Entry entry_ptr; FILE *fd; char draft_flag = FALSE; char noedit_flag = FALSE; int x; DN moddn; char *home; RDN new_rdn; struct list_element *start = 0 ; struct list_element *last ; struct list_element *l_temp ; /* char add = FALSE ; char rem = FALSE ; */ if ((argc = service_control (OPT, argc, argv, &mod_arg.mea_common)) == -1) return; mod_arg.mea_changes = NULLMOD; new_draft = FALSE; if (home = getenv ("DISHDRAFT")) strcpy (fname, home); else if (dad_flag) { strcpy (fname, "/tmp/dishXXXXXX"); unlink (mktemp (fname)); } else if (home = getenv ("HOME")) sprintf (fname, "%s/.dishdraft", home); else strcpy (fname, "./.dishdraft"); for (x=1; x<argc; x++) { if (test_arg (argv[x], "-draft",1)) { draft_flag = 1; shuffle_up (argc--,argv,x); if (x == argc) { ps_printf (OPT, "Draft file name missing\n"); Usage (argv[0]); return; } strcpy (fname, argv[x]); shuffle_up (argc--,argv,x--); } else if (test_arg (argv[x], "-newdraft",2)) { new_draft = TRUE; shuffle_up (argc--,argv,x--); } else if (test_arg (argv[x], "-noedit",3)) { noedit_flag = TRUE; shuffle_up (argc--,argv,x--); } else if (move (argv[x]) == OK) shuffle_up (argc--,argv,x--); else if (test_arg(argv[x], "-remove", 3)) { shuffle_up (argc--, argv, x); if (x == argc) { ps_printf(OPT, "Attribute to remove missing\n") ; Usage(argv[0]) ; return ; } l_temp = (struct list_element *) malloc (sizeof(struct list_element)) ; l_temp->mod = (char *) malloc ((unsigned)(strlen(argv[x]) + 1)); strcpy (l_temp->mod, argv[x]) ; l_temp->add = 0 ; l_temp->next = 0 ; if (start == 0) { start = last = l_temp ; } else { last->next = l_temp ; last = l_temp ; } shuffle_up (argc--,argv,x--); } else if (test_arg(argv[x], "-add", 2)) { shuffle_up (argc--, argv, x); if (x == argc) { ps_printf(OPT, "Attribute to insert missing\n") ; Usage(argv[0]) ; return ; } l_temp = (struct list_element *) malloc (sizeof(struct list_element)) ; l_temp->mod = (char *) malloc ((unsigned)(strlen(argv[x]) + 1)); strcpy (l_temp->mod, argv[x]) ; l_temp->add = 1 ; l_temp->next = 0 ; if (start == 0) { start = last = l_temp ; } else { last->next = l_temp ; last = l_temp ; } shuffle_up (argc--,argv,x--); } } if (dad_flag && (draft_flag || noedit_flag)) { ps_printf (OPT, "operation not allowed when using directory assistance server!\n"); return; } /* read attributes we want to modify */ if ((argc = read_cache_aux (argc, argv, FALSE, &mod_arg.mea_common)) <0 ) return; if (argc != 1) { ps_printf (OPT,"Unknown option %s\n",argv[1]); Usage (argv[0]); return; } if (start != 0) { if (build_modify(start, &mod_arg) == NOTOK) { return ; } while (ds_modifyentry (&mod_arg, &error) != DS_OK) { if (dish_error (OPT, &error) == 0) { return ; } mod_arg.mea_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name ; } ps_print (RPS, "Modified "); dn_print (RPS, dn, EDBOUT); ps_print (RPS, "\n"); delete_cache (dn); /* re-cache when next read */ return ; } if (!draft_flag) { if (mod_template (fname,noedit_flag) != OK) return; noedit_flag = FALSE; } else { new_draft = TRUE; /* Ugh ! */ mod_template ("/dev/null",TRUE); } if (! noedit_flag) if (editentry (1, argv) != OK) { make_old (fname,draft_flag); return; } /* now parse the files */ if ((fd = fopen (fname, "r")) == (FILE *) NULL) { ps_printf (OPT, "Can't open draft entry %s\n", fname); return; } entry_ptr = get_default_entry (NULLENTRY); #ifdef TURBO_DISK entry_ptr->e_attributes = fget_attributes (fd); #else entry_ptr->e_attributes = get_attributes (fd); #endif fclose (fd); if (parse_status != 0) return; mod_arg.mea_object = dn; for (moddn = dn ; moddn->dn_parent != NULLDN; moddn=moddn->dn_parent) ; entry_ptr->e_name = rdn_cpy (moddn->dn_rdn); /* add rdn as attribute */ for (new_rdn = entry_ptr->e_name; new_rdn != NULLRDN; new_rdn = new_rdn->rdn_next) { avst = avs_comp_new (AttrV_cpy (&new_rdn->rdn_av)); temp = as_comp_new (AttrT_cpy (new_rdn->rdn_at), avst, NULLACL_INFO); entry_ptr->e_attributes = as_merge (entry_ptr->e_attributes, temp); } for (as = entry_ptr->e_attributes; as != NULLATTR; as = as->attr_link) { emnew = NULLMOD; trail = as->attr_link; as->attr_link = NULLATTR; temp = current_entry->e_attributes; for (; temp != NULLATTR; temp = temp->attr_link) if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) { /* found it - does it need changing ? */ if (avs_cmp (as->attr_value, temp->attr_value) != 0) emnew = modify_avs (as->attr_value, temp->attr_value,as->attr_type); break; } if (temp == NULLATTR) { emnew = em_alloc (); emnew->em_type = EM_ADDATTRIBUTE; emnew->em_what = as_cpy(as); emnew->em_next = NULLMOD; } if (emnew != NULLMOD) mod_arg.mea_changes = ems_append (mod_arg.mea_changes,emnew); as->attr_link = trail; } /* remove attribute missing in new entry */ for (as = current_entry->e_attributes; as != NULLATTR; as = as->attr_link) { emnew = NULLMOD; temp = entry_ptr->e_attributes; for (; temp != NULLATTR; temp = temp->attr_link) if (AttrT_cmp (as->attr_type, temp->attr_type) == 0) break; if (temp == NULLATTR) { emnew = em_alloc (); emnew->em_type = EM_REMOVEATTRIBUTE; emnew->em_what = as_comp_new(as->attr_type,NULLAV,NULLACL_INFO); emnew->em_next = NULLMOD; } if (emnew != NULLMOD) mod_arg.mea_changes = ems_append (mod_arg.mea_changes,emnew); } if (mod_arg.mea_changes == NULLMOD) { ps_print (RPS, "The draft entry and the entry for "); dn_print (RPS, dn, EDBOUT); ps_print (RPS, "\nare exactly the same - no change made!!!\n"); entry_free (entry_ptr); make_old (fname,draft_flag); return; } if (rebind () != OK) { entry_free (entry_ptr); return; } /* * If this operation is time-stamped, it may have expired while the user * was editing the entry. Re-calculate the time-stamp. Modify is the only * dish command where this needs to be done. */ if ((mod_arg.mea_common.ca_security != (struct security_parms *) 0) && (mod_arg.mea_common.ca_security->sp_time != NULLCP)) { char *new_version(); free(mod_arg.mea_common.ca_security->sp_time); mod_arg.mea_common.ca_security->sp_time = new_version(); } /* If security parameters are present, take this to mean that strong * authentication is required. This disallows 'parms + no signature' * (pointless) and 'signature + no parms' (security risk). */ if (mod_arg.mea_common.ca_security != (struct security_parms *) 0) { extern struct SecurityServices *dsap_security; mod_arg.mea_common.ca_sig = (dsap_security->serv_sign)((caddr_t)&mod_arg, _ZModifyEntryArgumentDataDAS, &_ZDAS_mod); } while (ds_modifyentry (&mod_arg, &error) != DS_OK) { if (dish_error (OPT, &error) == 0) { entry_free (entry_ptr); return; } mod_arg.mea_object = error.ERR_REFERRAL.DSE_ref_candidates->cr_name; } ps_print (RPS, "Modified "); dn_print (RPS, dn, EDBOUT); ps_print (RPS, "\n"); delete_cache (dn); /* re-cache when next read */ entry_free (entry_ptr); ems_part_free (mod_arg.mea_changes); make_old (fname,draft_flag); }
static DNS dase_interact (DNS dns, DN dn, char *s) { int i; struct type_DASE_Callback__REQ *req = NULL; struct element_DASE_3 **dp; struct type_DASE_Callback__RSP *rsp = NULL; struct type_DASE_Callback__RSP *rp; DNS ds, *dq; PE pe = NULLPE; if (dns == NULLDNS) return NULL; i = 0; for (ds = dns; ds; ds = ds -> dns_next) i++; if (i > 1) { struct dn_seq **base, **bp, **ep; if (base = (struct dn_seq **) malloc ((unsigned) (i * sizeof *base))) { ep = base; for (ds = dns; ds; ds = ds -> dns_next) *ep++ = ds; qsort ((char *) base, i, sizeof *base, dns_compar); bp = base; ds = dns = *bp++; while (bp < ep) { ds -> dns_next = *bp; ds = *bp++; } ds -> dns_next = NULL; free ((char *) base); } } if ((req = (struct type_DASE_Callback__REQ *) calloc (1, sizeof *req)) == NULL) { no_mem: ; advise (LLOG_EXCEPTIONS, NULLCP, "out of memory"); out: ; if (req) free_DASE_Callback__REQ (req); if (rsp) free_DASE_Callback__RSP (rsp); if (pe) pe_free (pe); dn_seq_free (dns); return NULL; } if ((req -> string = str2qb (s, strlen (s), 1)) == NULL) goto no_mem; dp = &req -> choices; for (; dns; dns = ds) { struct element_DASE_3 *d3; struct type_DASE_Pair *pair; if ((d3 = (struct element_DASE_3 *) calloc (1, sizeof *d3)) == NULL) goto no_mem; *dp = d3, dp = &d3 -> next; if ((pair = (struct type_DASE_Pair *) calloc (1, sizeof *pair)) == NULL) goto no_mem; d3 -> Pair = pair; dn_print (nps, dns -> dns_dn, EDBOUT); ps_print (nps, " "); *--nps -> ps_ptr = NULL, nps -> ps_cnt++; pair -> complete = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; ufn_dn_print_aux (nps, dns -> dns_dn, dn, 0); ps_print (nps, " "); *--nps -> ps_ptr = NULL, nps -> ps_cnt++; pair -> friendly = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; if (pair -> complete == NULL || pair -> friendly == NULL) goto no_mem; ds = dns -> dns_next; dn_free (dns -> dns_dn); free ((char *) dns); } dns = NULL; if (encode_DASE_Callback__REQ (&pe, 1, NULL, NULLCP, req) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encode_DASE_Callback__REQ: %s", PY_pepy); goto out; } if (pe2ps (ps, pe) == NOTOK) adios (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno)); PLOGP (pgm_log,DASE_Message, pe, "message", 0); free_DASE_Callback__REQ (req); req = NULL; pe_free (pe); if ((pe = ps2pe (ps)) == NULLPE) adios (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno)); if (decode_DASE_Callback__RSP (pe, 1, NULLIP, NULLVP, &rsp) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "decode_DASE_Callback__RSP: %s", PY_pepy); goto out; } PLOGP (pgm_log,DASE_Message, pe, "message", 1); dq = &dns; for (rp = rsp; rp; rp = rp -> next) { char *cp; if ((ds = (struct dn_seq *) calloc (1, sizeof *ds)) == NULL) goto no_mem; *dq = ds, dq = &ds -> dns_next; if ((cp = qb2str (rp -> IA5String)) == NULL) goto no_mem; ds -> dns_dn = str2dn (cp); free (cp); } free_DASE_Callback__RSP (rsp); pe_free (pe); return dns; }
static dase_aux (struct type_DASE_Query__REQ *req) { int i; int vecp; char **vp; char *context, **vec; struct type_DASE_Query__RSP *rsp; struct element_DASE_0 *d0; struct element_DASE_1 *d1; envlist el; envlist en, *ep; DN *dn; DNS dns; PE pe; if ((rsp = (struct type_DASE_Query__RSP *) calloc (1, sizeof *rsp)) == NULL) { no_mem: ; adios (NULLCP, "out of memory"); } vec = NULL, el = NULL, context = NULL, dns = NULL; i = 1; for (d0 = req -> name; d0; d0 = d0 -> next) i++; if ((vec = (char **) calloc ((unsigned) i, sizeof *vec)) == NULL) goto no_mem; for (vp = vec, d0 = req -> name; d0; vp++, d0 = d0 -> next) if ((*vp = qb2str (d0 -> IA5String)) == NULL) goto no_mem; #ifdef STATS else advise (LLOG_NOTICE, NULLCP, "lookup: %s", *vp); #endif vecp = i - 1; el = NULL, ep = ⪙ for (d1 = req -> envlist; d1; d1 = d1 -> next) { struct type_DASE_Environment *ev = d1 -> Environment; struct element_DASE_2 *d2; struct dn_seq **dp; if ((en = (envlist) calloc (1, sizeof *en)) == NULL) goto no_mem; *ep = en, ep = &en -> Next; en -> Upper = ev -> upper; en -> Lower = ev -> lower; dp = &en -> Dns; for (d2 = ev -> path; d2; d2 = d2 -> next) { char *cp; struct dn_seq *ds; if ((ds = (struct dn_seq *) calloc (1, sizeof *ds)) == NULL) goto no_mem; *dp = ds, dp = &ds -> dns_next; if ((cp = qb2str (d2 -> IA5String)) == NULL) goto no_mem; if (*cp != '-') ds -> dns_dn = str2dn (cp); free (cp); if (*cp != '-' && ds -> dns_dn == NULLDN) { PY_advise (NULLCP, "bad DN in environment (%s)", cp); goto send_rsp; } } } if ((context = qb2str (req -> context)) == NULL) goto no_mem; #ifdef STATS advise (LLOG_NOTICE, NULLCP, "context: %s", context); #endif if (req -> userdn) { int changed = 0; char *cp; DN newdn; if ((cp = qb2str (req -> userdn)) == NULL) goto no_mem; #ifdef STATS advise (LLOG_NOTICE, NULLCP, "userdn: %s", cp); #endif if ((newdn = str2dn (*cp != '@' ? cp : cp + 1)) == NULLDN) { PY_advise (NULLCP, "bad DN for userdn (%s)", cp); free (cp); goto send_rsp; } if (!userdn || dn_cmp (userdn, newdn)) changed++; if (userdn) dn_free (userdn); userdn = newdn; free (cp); if (req -> passwd) { if ((cp = qb2str (req -> passwd)) == NULL) goto no_mem; if (strcmp (passwd, cp)) changed++; strcpy (passwd, cp); free (cp); } else { if (passwd[0]) changed++; passwd[0] = NULL; } if (isbound && changed) { ds_unbind (); isbound = 0; } } if (!isbound && bind_to_dsa () == NOTOK) goto send_rsp; PY_pepy[0] = NULL; pe = NULLPE; if (vecp == 1 && *vec[0] == '@') { static DN dnstat; if ((dnstat = str2dn (vec[0])) == NULLDN) { PY_advise (NULLCP, "invalid name"); goto send_rsp; } rsp -> value = name2psap (*(dn = &dnstat)); goto all_done; } if (!aet_match (vecp, vec, req -> interactive ? dase_interact : just_say_no, &dns, el, context)) { if (PY_pepy[0] == NULL) PY_advise (NULLCP, "unable to resolve name"); goto send_rsp; } if (dns == NULL) { PY_advise (NULLCP, "search failed to find anything"); goto send_rsp; } dn = NULL; if (dns -> dns_next) { if (req -> interactive) dnSelect (vec[0], &dns, dase_interact, el -> Dns); for (; dns; dns = dns -> dns_next) { dn = &dns -> dns_dn; if (rsp -> value = name2psap (*dn)) break; } } else { dn = &dns -> dns_dn; rsp -> value = name2psap (*dn); } all_done: ; if (dn) { encode_IF_DistinguishedName (&rsp -> name, 1, NULL, NULLCP,*dn); #ifdef STATS advise (LLOG_NOTICE, NULLCP, "answer: %s", dn2str (*dn)); #endif ufn_dn_print_aux (nps, *dn, NULLDN, 0); ps_print (nps, " "); *--nps -> ps_ptr = NULL, nps -> ps_cnt++; rsp -> friendly = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; dn_free (*dn); *dn = NULLDN; } send_rsp: ; if (PY_pepy[0]) { advise (LLOG_NOTICE, NULLCP, "diagnostic: %s", PY_pepy); if ((rsp -> diagnostic = str2qb (PY_pepy, strlen (PY_pepy), 1)) == NULL) goto no_mem; } if (encode_DASE_Query__RSP (&pe, 1, NULL, NULLCP, rsp) == NOTOK) adios (NULLCP, "encode_DASE_Query__RSP: %s", PY_pepy); if (pe2ps (ps, pe) == NOTOK) adios (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno)); PLOGP (pgm_log,DASE_Message, pe, "message", 0); free_DASE_Query__RSP (rsp); pe_free (pe); if (vec) { for (vp = vec; *vp; vp++) free (*vp); free ((char *) vec); } for (; el; el = en) { en = el -> Next; dn_seq_free (el -> Dns); free ((char *) el); } if (context) free (context); if (dns) dn_seq_free (dns); }