🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: vmsnet.sources
Article #137

DWProfile V3.3, part 03/06

#137
From: tanner
Date: Mon, 04 Jan 1993 20:47
1408 lines
50329 bytes
Submitted-by: tanner@cerritos.edu
Posting-number: Volume 4, Issue 28
Archive-name: dwprofile/part03

-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
X    ident_dsc.dsc$w_length = strlen(select_ptr->name);
X    switch (select_data`5Bselect_index`5D.type) `7B
X    case DWP_ALPHA:
X        if (select_data`5Bselect_index`5D.code == UAI$_USERNAME) `7B
X            matched = (str$match_wild(&ident_dsc, &select_dsc) == STR$_MATCH
V);
X            break;
X        `7D
X        else `7B
X            itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X            itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X            itmlst`5B0`5D.bufadr = match_string;
X            itmlst`5B0`5D.retadr = 0;
X            itmlst`5B1`5D.buflen = 0;
X            itmlst`5B1`5D.itmcode = 0;
X            status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X            if ((status & 7) != SS$_NORMAL) `7B
X                sprintf(message, "Username %s does not exist", select_ptr->n
Vame);
X                DWPerror("Find", message, resource_data.find_interval);
X                break;
X            `7D
X            match_string`5B8`5D = ' ';    /* make sure ' ' */
X            match_string`5B9`5D = '\0';   /* make sure null */
X            sptr = strchr(match_string, ' ');
X            if (sptr) *sptr = '\0';
X            match_dsc.dsc$w_length = strlen(match_string);
X            matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH
V);
X            break;
X        `7D
X    case DWP_LALPHA:
X        itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X        itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X        itmlst`5B0`5D.bufadr = match_string;
X        itmlst`5B0`5D.retadr = &length;
X        itmlst`5B1`5D.buflen = 0;
X        itmlst`5B1`5D.itmcode = 0;
X        status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X        if ((status & 7) != SS$_NORMAL) `7B
X            sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X            DWPerror("Find", message, resource_data.find_interval);
X            break;
X        `7D
X        match_string`5Blength`5D = ' ';    /* make sure ' ' */
X        match_string`5Blength+1`5D = '\0';   /* make sure null */
X        strcpy(match_string, unpad(match_string));  /* get rid of length byt
Ve */
X        match_dsc.dsc$w_length = strlen(match_string);
X        matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH);
X        break;
X    case DWP_UIC:
X        itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X        itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X        itmlst`5B0`5D.bufadr = &uic;
X        itmlst`5B0`5D.retadr = &length;
X        itmlst`5B1`5D.buflen = 0;
X        itmlst`5B1`5D.itmcode = 0;
X        status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X        if ((status & 7) != SS$_NORMAL) `7B
X            sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X            DWPerror("Find", message, resource_data.find_interval);
X            break;
X        `7D
X        /* convert UIC to text and do text wildcard match */
X        sprintf(match_string, "`5B%o,%o`5D", uic >> 16, uic & 0xFFFF);
X        match_dsc.dsc$w_length = strlen(match_string);
X        matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH);
X        break;
X    case DWP_DATE:
X        itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X        itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X        itmlst`5B0`5D.bufadr = match_string;
X        itmlst`5B0`5D.retadr = 0;
X        itmlst`5B1`5D.buflen = 0;
X        itmlst`5B1`5D.itmcode = 0;
X        status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X        if ((status & 7) != SS$_NORMAL) `7B
X            sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X            DWPerror("Find", message, resource_data.find_interval);
X            break;
X        `7D
X        matched = (!memcmp(match_string, select_string,
X                           select_data`5Bselect_index`5D.size));
X        break;
X    case DWP_RINT:
X        /* special test - the only test of a RINT is logfails > 0 */
X        itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X        itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X        itmlst`5B0`5D.bufadr = &logfails;
X        itmlst`5B0`5D.retadr = &length;
X        itmlst`5B1`5D.buflen = 0;
X        itmlst`5B1`5D.itmcode = 0;
X        status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X        if ((status & 7) != SS$_NORMAL) `7B
X            sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X            DWPerror("Find", message, resource_data.find_interval);
X            break;
X        `7D
X        matched = logfails;
X        break;
X    `7D
X    if (matched) `7B
X        if (found_add)
X            found_add = found_add->next = XtNew(ident);
X        else
X            found_add = found_list.next = XtNew(ident);
X        found_add->name = XtNewString(select_ptr->name);
X        found_add->next = NULL;
X    `7D
X    if (select_ptr = select_ptr->next)
X        return FALSE;
X    else `7B
X        if (!found_ptr->next) `7B  /* no more to display */
X            XtSetSensitive(button_array`5Bfind_button`5D, OFF);  /* 'find' b
Vutton is inactive */
X            XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X        `7D
X        progress(NULL);
X        find_work_proc_id = (XtWorkProcId) 0;
X        return TRUE;
X    `7D
X`7D
X
X
X/*
X *  Parse textual date to 64 bit binary value`20
X *  Returns false if illegal date
X */
X
Xstatic Boolean parse_date(Cardinal value)
X`7B
X    Cardinal status, count = 0;
X    String str;
X    $DESCRIPTOR(time_dsc, uafdata`5Bvalue`5D.sdata);
X
X    if (!strlen(uafdata`5Bvalue`5D.sdata)) `7B /* empty date means (none) */
X        memset(uafdata`5Bvalue`5D.sdata, 0, 8);  /* make date 'none' */
X        return TRUE;
X    `7D
X    /* default expiration date to midnight instead of current time */
X    for (str = uafdata`5Bvalue`5D.sdata; str;) `7B
X        if((str = strchr(str, ':')) == NULL)
X            break;  /* no more colons */
X        count++;    /* count the colons in date */
X        str++;      /* skip over the colon we just counted */
X    `7D
X    if (count < 1)              /* no hh:mm:ss.cc */
X        strcat(uafdata`5Bvalue`5D.sdata, " 00:00:00.00");
X    else if (count < 2)         /* no ss.cc */
X        strcat(uafdata`5Bvalue`5D.sdata, ":00.00");
X    time_dsc.dsc$w_length = strlen(uafdata`5Bvalue`5D.sdata);
X    status = sys$bintim(&time_dsc, &uafdata`5Bvalue`5D.sdata);
X    /* .sdata will now contain the 64-bit system time */
X    return (status == SS$_NORMAL);
X`7D
X
X
X/*
X *  Parse textual UIC to binary value`20
X *  Returns false if illegal UIC format
X */
X
Xstatic Boolean parse_uic(int code)
X`7B
X    Cardinal status, grp = 0, mem = 0;
X
X    status = sscanf(uafdata`5Bcode`5D.sdata, "`5B%o,%o`5D", &grp, &mem);
X    if (status != 2) /* try without `5B`5D */
X        status = sscanf(uafdata`5Bcode`5D.sdata, "%o,%o", &grp, &mem);
X    uafdata`5BUAI$_UIC`5D.idata = (grp << 16) + mem;
X    return (status == 2);
X`7D
X
X
X/*
X *  Build the list of accounts for accounts_box
X */
X
Xstatic void build_accounts()
X`7B
X    ident *ptr;
X    XmString *items;
X    Widget list;
X    Cardinal ind;
X
X    if (!accounts_box `7C`7C !XtIsManaged(accounts_box))
X        return; /* box isn't there */
X
X    list = XmSelectionBoxGetChild(accounts_box, XmDIALOG_LIST);
X    XmListDeleteAllItems(list);
X    items = (XmString *)XtCalloc(account_count, sizeof(XmString));
X    for (ptr = ident_list, ind = 0; ptr; ptr = ptr->next)
X        if (ptr->status == account)
X            items`5Bind++`5D = XmStringCreateSimple(ptr->name);
X    XmListAddItems(list, items, ind, 0);
X    for (ind = 0; ind < account_count; ind++)
X        XmStringFree(items`5Bind`5D);
X    XtFree(items);
X`7D
X
X
X/*
X *  Show the progress of 'Find Next'
X */
X
Xstatic void progress(ident *location)
X`7B
X    static Widget progress_box = NULL;
X    XmString xmstr;
X    char str`5B80`5D;
X    Cardinal ac, count, pct;
X    static int old_pct = -1;
X    Arg arglist`5B10`5D;
X    ident *ptr;
X    Display *display;
X    Window window;
X
X    if (progress_id) `7B
X        XtRemoveTimeOut(progress_id);   /* clear out any old timers */
X        progress_id = (XtIntervalId) 0;
X    `7D
X
X    if (!location) `7B  /* location = null means pop down box */
X        if (progress_box && XtIsManaged(progress_box))
X            XtUnmanageChild(progress_box);
X        return;
X    `7D
X
X    if (!progress_box) `7B
X        ac = 0;
X        xmstr = XmStringCreateSimple("DWProfile: Find progress");
X        XtSetArg(arglist`5Bac`5D, XmNheight, 112); ac++;
X        XtSetArg(arglist`5Bac`5D, XmNwidth, 224); ac++;
X        XtSetArg(arglist`5Bac`5D, XmNresizePolicy, XmRESIZE_NONE); ac++;
X        XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X        progress_box = XmCreateWorkingDialog(dwprofile_main, "progress_box",
V arglist, ac);
X        XmStringFree(xmstr);
X        XtUnmanageChild(XmMessageBoxGetChild(progress_box, XmDIALOG_OK_BUTTO
VN));
X        XtUnmanageChild(XmMessageBoxGetChild(progress_box, XmDIALOG_HELP_BUT
VTON));
X        XtAddCallback(progress_box, XmNcancelCallback, FindCancelCallback, N
VULL);
X    `7D
X
X    if (!XtIsManaged(progress_box))
X        XtManageChild(progress_box);    /* pop up progress box */
X
X    if (location->next) `7B
X        for (ptr = ident_list, count = 0; ptr != location; ptr = ptr->next)
X            if (ptr->status == uic_ident)
X                count++;   /* count idents read so far */
X        pct = (count * 100) / uic_count;  /* idents read as a percent */
X        if (pct != old_pct) `7B
X            old_pct = pct;
X            sprintf(str, "%d%% of identifiers searched", pct);
X            xmstr = XmStringCreateSimple(str);
X            ac = 0;
X            XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
X            XtSetValues(progress_box, arglist, ac);
X            XmStringFree(xmstr);
X        `7D
X        /* leave this dialog box up, call Find in 1 second */
X        progress_id = XtAppAddTimeOut(context, 1000, Find, NULL);
X
X    `7D
X    else  /* this is the last item, pop down the box */
X        XtUnmanageChild(progress_box);
X`7D
X
X
X
X/*** Event Handlers ***/
X
X/*
X *  Called by mouse button and exposure events in access windows
X */
X
Xstatic XtEventHandler access_handler(Widget w, XtPointer data,
X                                     XButtonEvent *event, Boolean *dispatch)
X`7B
X    Cardinal wi, hour;
X    static Boolean mode;
X
X    /* find the uai code for this event */
X    for (wi = UAI$_NETWORK_ACCESS_P;
X        widget_array`5Bwi`5D != w && wi <= UAI$_REMOTE_ACCESS_S; wi++)
X        /* just calc index */ ;
X
X    switch (event->type) `7B
X    case Expose :
X        update_time(wi);    /* update the exposed window */
X        break;
X    case ButtonPress :
X        uafdata`5Bwi`5D.changed = TRUE;
X        hour = event->x / resource_data.hour_size;
X        mode = uafdata`5Bwi`5D.idata >> hour & 1 `5E 1;    /* flip current *
V/
X    case MotionNotify:         /* common code for ButtonPress, Motion */
X        hour = event->x / resource_data.hour_size;
X        XFillRectangle(event->display, event->window,
X                       mode ? gc_clear : gc_draw,
X                       hour * resource_data.hour_size, 0,
X                       resource_data.hour_size, k_hours_height);
X        if (mode)
X            uafdata`5Bwi`5D.idata `7C= 1 << hour;
X        else
X            uafdata`5Bwi`5D.idata &= `7E(1 << hour);
X        break;
X    `7D
X`7D
X
X
X/*
X *  Called by event handler on MB3 push
X */
X
Xstatic XtEventHandler popup_handler(Widget widget, Widget popup_menu,
X                                    XButtonPressedEvent *event, Boolean *dis
Vpatch)
X`7B
X    if (event->button != Button3)
X        return;
X    XmMenuPosition(popup_menu, event);     /* position popup menu */
X    XtManageChild(popup_menu);             /* manage it */
X`7D
X
X
X/*
X *  Called when a return is pressed in a text widget
X */
X
Xstatic XtActionProc return_key(Widget widget, XKeyPressedEvent *event,    `2
V0
X                               String *str, Cardinal *args)
X`7B
X    if (widget == widget_array`5BUAI$_USERNAME`5D)
X        Read(NULL, NULL, NULL); /* read new username */
X    else if (widget == widget_array`5BUAI$_ACCOUNT`5D) `7B
X        calc_uic();                         /* figure out a new uic */
X        trans_uic(uafdata`5BUAI$_UIC`5D.idata); /* in case calc_uic didn't *
V/
X    `7D
X`7D
X
X
X/*
X * Select menu shortcut
X * Set up select_data index for call to Select()
X */
X
Xstatic XtActionProc select_key(Widget widget, XKeyPressedEvent *event,    `2
V0
X                               String *str, Cardinal *args)
X`7B
X    Cardinal wi, si;
X
X    /* find the widget_array index */
X    for(wi = 0; items`5Bwi`5D.code; wi++)
X        if (widget == widget_array`5Bwi`5D)
X            break;
X    /* find the select_data index */
X    for(si = 0; select_data`5Bsi`5D.code; si++)
X        if (wi == select_data`5Bsi`5D.code)
X            break;
X    /* call Select() with the index */
X    if (select_data`5Bsi`5D.code)
X        Select(NULL, &si, NULL);
X`7D
X
X
X
X/*** Callbacks ***/
X
X/*
X *  Called by 'Quit' menu item
X */
X
Xstatic XtCallbackProc Quit(Widget widget, XtPointer data,    `20
X            XmPushButtonCallbackStruct *reason)
X`7B
X    exit();
X`7D
X
X
X/*
X *  Read in the uaf entry specified by username; if error, load DEFAULT
X *  Called by 'Read' menu or return_key from username text widget
X */
X
Xstatic XtCallbackProc Read(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    String str;
X
X    XDefineCursor(top_display, top_window, wait_cursor);
X    XFlush(top_display);
X    str = XmTextGetString(widget_array`5BUAI$_USERNAME`5D);
X    if (!get_record(str)) `7B
X        if (get_record("DEFAULT")) `7B
X            set_defaults(str);
X            DWPerror("Read", "Username does not exist, defaults applied",
X                     resource_data.read_interval);
X        `7D
X        else
X            DWPerror("Read", "Cannot read username DEFAULT", 0);
X    `7D
X    XtFree(str);
X    XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X *  Find the next UAF entry that matches the current criteria
X *
X *  Note: UAF entry is defined as a UIC-type identifier.
X *  If a UAF entry does not have an identifier of the same
X *   name, it will not be searched.
X *
X *  Called by 'Find' menu item
X */
X
Xstatic XtCallbackProc Find(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X
X    /* if nothing found yet and still looking, mark time */
X    if (!found_ptr->next && find_work_proc_id) `7B
X        progress(select_ptr);
X        return;
X    `7D
X
X#ifdef DEBUG
X    if (!XtIsSensitive(button_array`5Bfind_button`5D)) `7B  /* stray timer c
Vallback */
X        printf("Find() callback with button insensitive\n");
X        return;
X    `7D
X#endif
X
X    progress(NULL);  /* something is found or search done, get rid of progre
Vss box */
X
X    /* get next found ident and display it */
X    if (found_ptr->next) `7B
X        found_ptr = found_ptr->next;
X        get_record(found_ptr->name);
X        if (!found_ptr->next && !find_work_proc_id) `7B        /* last item
V on found list? */
X            XtSetSensitive(button_array`5Bfind_button`5D, OFF);
X            XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X        `7D
X    `7D
X    /* we get here when something allows a Find Next with nothing to get */
X    else `7B
X#ifdef DEBUG
X        printf("This shouldn't happen, tell me\n");
X#endif
X        XtSetSensitive(button_array`5Bfind_button`5D, OFF);  /* turn off but
Vton */
X        XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X    `7D
X`7D
X
X
X/*
X *  Update the UAF record for 'username'
X *  Called by 'Write' menu item
X */
X
Xstatic XtCallbackProc Write(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    Cardinal ind, pad, item, value, status, dd, hh, mm, ss, cc,
X             holder`5B2`5D = `7B0, 0`7D;
X    ident *ptr, *prev, *next;
X    held_ident *hptr, *prev_hptr, *tmp_hptr;
X    char command`5B200`5D = "", temp`5B100`5D;
X    $DESCRIPTOR(acct_dsc, uafdata`5BUAI$_USERNAME`5D.sdata);
X
X    XDefineCursor(top_display, top_window, wait_cursor);
X    XFlush(top_display);
X
X    /* make sure uafdata`5Buai$_uic`5D.idata matches the text */
X    if (!parse_uic(UAI$_UIC))  /* if not good uic */
X        uafdata`5BUAI$_UIC`5D.idata = 0;  /* force error */
X   `20
X    if (!strlen(uafdata`5BUAI$_OWNER`5D.sdata) `7C`7C
X        !strncmp(uafdata`5BUAI$_ACCOUNT`5D.sdata, "DEFAULT", 7) `7C`7C
X        !strncmp(uafdata`5BUAI$_DEFDIR`5D.sdata, "`5BUSER`5D", 6) `7C`7C
X        !strlen(unpad(uafdata`5BUAI$_DEFDEV`5D.sdata)) `7C`7C
X        !strlen(unpad(uafdata`5BUAI$_DEFDIR`5D.sdata)) `7C`7C
X        !uafdata`5BUAI$_UIC`5D.idata) `7B
X            DWPerror("Write","Bad Owner, Account, UIC or Directory name", 0)
V;
X            XUndefineCursor(top_display, top_window);
X            return;
X    `7D
X    /* item code UAI$_USERNAME is never used by sys$setuai */
X    if (uafdata`5BUAI$_USERNAME`5D.changed) `7B
X        if (uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D &&
X                uafdata`5BUAI$_UIC`5D.idata) `7B    /* create a new user */
X            sprintf(temp, "$ UAF ADD %s/UIC=%s", uafdata`5BUAI$_USERNAME`5D.
Vsdata,
X                    uafdata`5BUAI$_UIC`5D.sdata);
X            strcpy(command, temp);
X            uafdata`5BUAI$_USERNAME`5D.changed = FALSE;
X            uafdata`5BUAI$_UIC`5D.changed = FALSE;
X            if (uafdata`5BUAI$_ACCOUNT`5D.sdata`5B0`5D) `7B
X                sprintf(temp, "/ACCOUNT=%s", uafdata`5BUAI$_ACCOUNT`5D.sdata
V);
X                strcat(command, temp);
X                uafdata`5BUAI$_ACCOUNT`5D.changed = FALSE;
X            `7D
X            if (uafdata`5BUAI$_PWD`5D.sdata`5B0`5D) `7B
X                sprintf(temp, "/PASSWORD=%s", uafdata`5BUAI$_PWD`5D.sdata);
X                strcat(command, temp);
X                uafdata`5BUAI$_PWD`5D.changed = FALSE;
X            `7D
X            spawn_dcl(command);
X        `7D
X        else `7B
X            DWPerror("Write","No username or no UIC", 0);
X            XUndefineCursor(top_display, top_window);
X            return;
X        `7D
X    `7D
X    else `7B
X        /* check for password change; is setuai able to do this now? */
X        if (uafdata`5BUAI$_PWD`5D.changed &&
X          uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D &&
X          uafdata`5BUAI$_PWD`5D.sdata`5B0`5D) `7B
X            sprintf(temp, "$ UAF MODIFY %s/PASSWORD=%s\n",
X                    uafdata`5BUAI$_USERNAME`5D.sdata, uafdata`5BUAI$_PWD`5D.
Vsdata);
X            strcat(command, temp);
X            uafdata`5BUAI$_PWD`5D.changed = FALSE;
X        `7D
X        /* check for device/directory change; the directory tree needs to be
V moved */
X        if ((uafdata`5BUAI$_DEFDEV`5D.changed && strlen(uafdata`5BUAI$_DEFDE
VV`5D.sdata))
X            `7C`7C (uafdata`5BUAI$_DEFDIR`5D.changed && strlen(uafdata`5BUAI
V$_DEFDIR`5D.sdata))) `7B
X            sprintf(temp, "$ @DWPUID:MOVE_DIRECTORY %s %s %s %s\n",
X                    unpad(uafdata`5BUAI$_DEFDEV`5D.odata),
X                    unpad(uafdata`5BUAI$_DEFDIR`5D.odata),
X                    unpad(uafdata`5BUAI$_DEFDEV`5D.sdata),
X                    unpad(uafdata`5BUAI$_DEFDIR`5D.sdata));
X            strcat(command, temp);
X            /* update the old values */
X            strcpy(uafdata`5BUAI$_DEFDEV`5D.odata, unpad(uafdata`5BUAI$_DEFD
VEV`5D.sdata));
X            strcpy(uafdata`5BUAI$_DEFDIR`5D.odata, unpad(uafdata`5BUAI$_DEFD
VIR`5D.sdata));
X        `7D
X        /* check for UIC change;  old identifier must be deleted, new ident
V created */
X        /* let authorize handle it.  new UIC will be added to idents list be
Vlow */
X        if (uafdata`5BUAI$_UIC`5D.changed &&
X          uafdata`5BUAI$_UIC`5D.idata) `7B
X            sprintf(temp, "$ UAF MODIFY %s/UIC=%s\n",
X                    uafdata`5BUAI$_USERNAME`5D.sdata, uafdata`5BUAI$_UIC`5D.
Vsdata);
X            strcat(command, temp);
X            uafdata`5BUAI$_UIC`5D.changed = FALSE;
X            sprintf(temp, "$ @DWPUID:RESETOWNER %s%s %s\n",
X                    unpad(uafdata`5BUAI$_DEFDEV`5D.sdata),
X                    unpad(uafdata`5BUAI$_DEFDIR`5D.sdata),
X                    uafdata`5BUAI$_USERNAME`5D.sdata);
X            strcat(command, temp);
X        `7D
X        /* any of these generated a DCL command? */
X        if (strlen(command))
X            spawn_dcl(command);
X    `7D
X    item = 0;
X    for (ind = 0; value = items`5Bind`5D.code; ind++) `7B
X        if (value && uafdata`5Bvalue`5D.changed) `7B
X            uafdata`5Bvalue`5D.changed = FALSE;
X            itmlst`5Bitem`5D.itmcode = value;
X            itmlst`5Bitem`5D.buflen = items`5Bind`5D.size;
X            switch (items`5Bind`5D.type) `7B
X            case DWP_LALPHA: /* if it's been changed, it has no length byte
V */
X                if (value == UAI$_DEFDIR && strlen(uafdata`5Bvalue`5D.sdata)
V) `7B
X                    if (uafdata`5Bvalue`5D.sdata`5B0`5D != '`5B') `7B
X                        sprintf(temp, "`5B%s", uafdata`5Bvalue`5D.sdata);
X                        strcpy(uafdata`5Bvalue`5D.sdata, temp);
X                    `7D
X                    if (uafdata`5Bvalue`5D.sdata`5Bstrlen(uafdata`5Bvalue`5D
V.sdata)-1`5D
X                        != '`5D')
X                        strcat(uafdata`5Bvalue`5D.sdata, "`5D");    /* dir h
Vas `5B`5D */
X                `7D
X                if (value == UAI$_DEFDEV &&
X                        strlen(uafdata`5Bvalue`5D.sdata) &&
X                        uafdata`5Bvalue`5D.sdata`5Bstrlen(uafdata`5Bvalue`5D
V.sdata)-1`5D
X                        != ':')
X                    strcat(uafdata`5Bvalue`5D.sdata, ":");    /* ends with '
V:' */
X                strcpy(temp, uafdata`5Bvalue`5D.sdata);
X                uafdata`5Bvalue`5D.sdata`5B0`5D = strlen(temp);   /* make le
Vngth byte */
X                for (pad = strlen(temp); pad < items`5Bind`5D.size; pad++)
X                    temp`5Bpad`5D = ' ';     /* pad with spaces, no null */
X                strncpy(&uafdata`5Bvalue`5D.sdata`5B1`5D, temp, items`5Bind`
V5D.size);
X                itmlst`5Bitem`5D.bufadr = uafdata`5Bvalue`5D.sdata;
X                break;
X            case DWP_ALPHA:   /* account */
X                for (pad = 0; pad < items`5Bind`5D.size && uafdata`5Bvalue`5
VD.sdata`5Bpad`5D;)
X                    pad++;  /* skip over string */
X                for (; pad < items`5Bind`5D.size; pad++)
X                    uafdata`5Bvalue`5D.sdata`5Bpad`5D = ' '; /* pad with spa
Vces, no null */
X            case DWP_PRIV:    /* common code for all alphabetic, priv */
X                itmlst`5Bitem`5D.bufadr = uafdata`5Bvalue`5D.sdata;
X                break;
X            case DWP_INT:
X                sscanf(uafdata`5Bvalue`5D.sdata, "%d", &uafdata`5Bvalue`5D.i
Vdata);
X            case DWP_TIME:    /* these have correct data in .idata */
X            case DWP_FLAG:
X            case DWP_PRIME:
X                itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X                break;
X            case DWP_CPU:
X                dd = hh = mm = ss = cc = 0;
X                status = sscanf(uafdata`5Bvalue`5D.sdata, "%d %02d:%02d:%02d
V.%02d",
X                                                      &dd, &hh, &mm, &ss, &c
Vc);
X                if (status < 4) `7B /* try hh:mm:ss */
X                    dd = hh = mm = ss = cc = 0;
X                    status = sscanf(uafdata`5Bvalue`5D.sdata, "%02d:%02d:%02
Vd.%02d",
X                                                            &hh, &mm, &ss, &
Vcc);
X                `7D
X                if (status < 3) `7B /* try mm:ss */
X                    dd = hh = mm = ss = cc = 0;
X                    status = sscanf(uafdata`5Bvalue`5D.sdata, "%02d:%02d.%02
Vd",
X                                                            &mm, &ss, &cc);
X                `7D
X                if (status < 2) `7B /* try ss */
X                    dd = hh = mm = ss = cc = 0;
X                    status = sscanf(uafdata`5Bvalue`5D.sdata, "%d.%02d",
X                                                            &ss, &cc);
X                `7D
X                uafdata`5Bvalue`5D.idata = dd * 8640000 + hh * 360000 +
X                                       mm * 6000 + ss * 100 + cc;
X                itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X                break;
X            case DWP_DATE: `7B
X                /* This one's kinda tricky, .sdata can contain a 64-bit */
X                /* system time or a string.  At this point it should contain
V */
X                /* a string, since .changed is set only in WidgetChanged */
X                if (parse_date(value))
X                    itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.sdata;
X                else `7B
X                    DWPerror("Write","Illegal date format", 0);
X                    --item;
X                `7D
X                break;
X            `7D
X            case DWP_UIC:
X                itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X                break;
X            `7D
X            itmlst`5Bitem`5D.retadr = 0;
X            item++;
X        `7D
X    `7D
X    itmlst`5Bitem`5D.itmcode = itmlst`5Bitem`5D.buflen = 0;    /* end the li
Vst */
X    acct_dsc.dsc$w_length = strlen(uafdata`5BUAI$_USERNAME`5D.sdata);
X    if (item) `7B
X        status = sys$setuai(0, 0, &acct_dsc, &itmlst, 0, 0, 0);
V              `20
X        if (status != SS$_NORMAL)
X            DWPmsg("Write/SETUAI", status);
X        else
X            DWPerror("Write", "SETUAI successful", resource_data.write_inter
Vval);
X    `7D
X    update_strings();    /* undo the padding of strings done above */
X
X    holder`5B0`5D = uafdata`5BUAI$_UIC`5D.idata;
X    for (hptr = held_list, prev_hptr = NULL; hptr;) `7B
X        tmp_hptr = NULL;
X        switch (hptr->status) `7B
X        case add_ident:  /* ident flagged for pending add */
X            status = sys$add_holder(hptr->identifier, &holder, 0);
X            if (status != SS$_NORMAL)
X                DWPmsg("Write/ADD_HOLDER", status);
X            else
X                DWPerror("Write","ADD_HOLDER successful", resource_data.writ
Ve_interval);
X            hptr->status = original;  /* ident is now permanently held */
X            break;
X        case del_orig:  /* ident flagged for pending delete */
X            status = sys$rem_holder(hptr->identifier, &holder);
X            if (status != SS$_NORMAL)
X                DWPmsg("Write/REM_HOLDER", status);
X            else
X                DWPerror("Write","REM_HOLDER successful", resource_data.writ
Ve_interval);
X            if (prev_hptr)
X                prev_hptr->next = hptr->next;  /* remove node from list */
X            else
X               held_list = hptr->next;
X            tmp_hptr = hptr;
X            break;
X        case original: /* originally held id, no need to add it again */
X            break;
X        `7D
X        prev_hptr = hptr;
X        hptr = hptr->next;
X        if (tmp_hptr)
X            XtFree(tmp_hptr);
X    `7D
X
X        /* add identifier to list */
X        for (ptr = ident_list, prev = NULL; ptr; prev = ptr, ptr = ptr->next
V)
X            if (strcmp(ptr->name, uafdata`5BUAI$_USERNAME`5D.sdata) >= 0) br
Veak;
X        /* if ptr = 0, no identifier was higher than username
X           if strcmp > 0, ptr->name is the next higher name
X           if strcmp = 0, names matched; don't insert
X        */
X        if (!ptr `7C`7C strcmp(ptr->name, uafdata`5BUAI$_USERNAME`5D.sdata))
V `7B
X            next = ptr;
X            ptr = XtNew(ident);
X            if (prev)
X                prev->next = ptr;
X            else
X                ident_list = ptr;
X            ptr->name = XtNewString(uafdata`5BUAI$_USERNAME`5D.sdata);
X            ptr->next = next;
X            ptr->identifier = uafdata`5BUAI$_UIC`5D.idata;
X            ptr->status = uic_ident;
X            uic_count++;
X        `7D
X        /* add group identifier to list */
X        for (ptr = ident_list, prev = NULL; ptr; prev = ptr, ptr = ptr->next
V)`20
X            if (strcmp(ptr->name, uafdata`5BUAI$_ACCOUNT`5D.sdata) >= 0) bre
Vak;
X        if (!ptr `7C`7C strcmp(ptr->name, uafdata`5BUAI$_ACCOUNT`5D.sdata))
V `7B
X            next = ptr;
X            ptr = XtNew(ident);
X            if (prev)
X                prev->next = ptr;
X            else
X                ident_list = ptr;
X            ptr->name = XtNewString(uafdata`5BUAI$_ACCOUNT`5D.sdata);
X            ptr->next = next;
X            ptr->identifier = (uafdata`5BUAI$_UIC`5D.idata `7C 0xFFFF);
X            ptr->status = account;
X            account_count++;
X            if (accounts_box && XtIsManaged(accounts_box)) `7B
X               build_accounts();  /* reload accounts info */
X            `7D
X        `7D
X
X    XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X *  Delete a UAF record
X *  Called by 'Remove' menu item
X */
X
Xstatic XtCallbackProc Remove(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    Cardinal ac;
X    Arg arglist`5B5`5D;
X    char msg`5B30`5D;
X    XmString xmstr;
X    String str;
X    static Widget caution_box = NULL;
X
X    str = XmTextGetString(widget_array`5BUAI$_USERNAME`5D);
X    strcpy(msg, str);
X    XtFree(str);
X    if (!get_record(msg)) `7B
X        sprintf(msg, "User %s doesn't exist", uafdata`5BUAI$_USERNAME`5D.sda
Vta);
X        DWPerror("Remove", msg, 0);
X        return;
X    `7D
X    if (!caution_box) `7B
X        ac = 0;
X        xmstr = XmStringCreateSimple("DWProfile: Remove");
X        XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X        XtSetArg(arglist`5Bac`5D, XmNdialogStyle, XmDIALOG_APPLICATION_MODAL
V); ac++;
X        caution_box = XmCreateWarningDialog(dwprofile_main, "caution_box", a
Vrglist, ac);
X        XmStringFree(xmstr);
X        XtUnmanageChild(XmMessageBoxGetChild(caution_box, XmDIALOG_HELP_BUTT
VON));
X        XtAddCallback(caution_box, XmNokCallback, CautionCallback, NULL);
X    `7D
X    ac = 0;
X    sprintf(msg, "Remove user %s?", uafdata`5BUAI$_USERNAME`5D.sdata);
X    xmstr = XmStringCreateSimple(msg);
X    XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
X    XtSetValues(caution_box, arglist, ac);
X    XmStringFree(xmstr);
X    XtManageChild(caution_box);    /* popup modal caution box */
X`7D
X
X
X/*
X *  Issue REMOVE UAF command if OK button pressed in caution box
X */
X
Xstatic XtCallbackProc CautionCallback(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    char command`5B20`5D;
X
X    XtUnmanageChild(widget);
X    XDefineCursor(top_display, top_window, wait_cursor);
X    XFlush(top_display);
X    if (reason->reason == XmCR_OK
X            && uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D) `7B
X        sprintf(command, "$ UAF REMOVE %s", uafdata`5BUAI$_USERNAME`5D.sdata
V);
X        spawn_dcl(command);
X        get_record("");
X    `7D
X    XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X *  Remove the error message widget when ack'ed or timed out
X */
X
Xstatic XtTimerCallbackProc MessageCallback(Widget widget, XtPointer data)
X`7B
X    XtUnmanageChild(widget); /* popdown message box */
X    XtRemoveTimeOut(timeout_id); /* clear out timer */
X`7D
X
X
X/*
X *  Stop the idents work proc when 'reading idents' WorkingDialog widget is
V cancelled
X */
X
Xstatic XtCallbackProc IdentsCancelCallback(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    XtRemoveWorkProc(idents_work_proc_id);
X    idents_work_proc_id = (XtWorkProcId) 0;
X`7D
X
X
X/*
X *  Stop find() when 'find progress' WorkingDialog widget is cancelled
X */
X
Xstatic XtCallbackProc FindCancelCallback(Widget widget, XtPointer data,
X            XmPushButtonCallbackStruct *reason)
X`7B
X    XtRemoveWorkProc(find_work_proc_id);
X    find_work_proc_id = (XtWorkProcId) 0;
X    if (progress_id) `7B
X        XtRemoveTimeOut(progress_id);        /* cancel pending timeout */
X        progress_id = (XtIntervalId) 0;
X    `7D
X
X    if (!found_ptr->next) `7B        /* nothing left on found list? */
X        XtSetSensitive(button_array`5Bfind_button`5D, OFF);
X        XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X    `7D
X`7D
X
X
X/*
X *  Pop up (or remove) the access dialog box
X *  Called by 'Access' menu item
X */
X
Xstatic XtCallbackProc Access(Widget widget, XtPointer data,
X                XmToggleButtonCallbackStruct *reason)
X`7B
X    Cardinal wi, ac;
X    Arg arglist`5B2`5D;
X
X    if (!access_box) `7B
X        if ((MrmFetchWidget(Hierarchy, "access_box", toplevel,
X             &access_box, &class)) != MrmSUCCESS)
X            XtAppError(context, "Error Fetching Access main widget");
X        /* adjust drawing area using hourSize resource */
X        for (wi = UAI$_NETWORK_ACCESS_P; wi <= UAI$_REMOTE_ACCESS_S; wi++) `
V7B
X            ac = 0;
X            XtSetArg(arglist`5Bac`5D, XmNwidth, resource_data.hour_size * 24
V); ac++;  `20
X            if (widget_array`5Bwi`5D)
X                XtSetValues(widget_array`5Bwi`5D, arglist, ac);
X        `7D
X    `7D
X    if (XtIsManaged(access_box)) `7B
X        XtUnmanageChild(access_box);
X        XmToggleButtonSetState(button_array`5Baccess_menu`5D, OFF, NO);
X    `7D
X    else `7B
X        XtManageChild(access_box);
X        XmToggleButtonSetState(button_array`5Baccess_menu`5D, ON, NO);
X        update_prime();       /* may not have existed */
X        set_handlers();       /* set window event handlers */
X    `7D
X`7D
X
X
X/*
X *  Pop up (or remove) the privs dialog box
X *  Called by 'Privs' menu item
X */
X
Xstatic XtCallbackProc Privs(Widget widget, XtPointer data,
X                XmToggleButtonCallbackStruct *reason)
X`7B
X    if (!privs_box)
X        if ((MrmFetchWidget(Hierarchy, "privs_box", toplevel,
X             &privs_box, &class)) != MrmSUCCESS)
X            XtAppError(context, "Error Fetching Privs main widget");
X    if (XtIsManaged(privs_box)) `7B
X        XtUnmanageChild(privs_box);
X        XmToggleButtonSetState(button_array`5Bprivs_menu`5D, OFF, NO);
X    `7D
X    else `7B
X        XtManageChild(privs_box);
X        XmToggleButtonSetState(button_array`5Bprivs_menu`5D, ON, NO);
X        update_privs();        /* may not have existed */
X    `7D
X`7D
X
X
X/*
X *  Activation callback on Select menu item
X *  also called by select_key()
X *  widget, reason not referenced
X */
X
Xstatic XtCallbackProc Select(Widget widget, int *data,
X                XmPushButtonCallbackStruct *reason)
X`7B
X    Cardinal ind, ac;
X    Arg arglist`5B10`5D;
X    ident *ptr, *tptr;
X    char str`5B80`5D;
X    XmString xmstr;
X
X    if (found_list.next `7C`7C *data < 100) `7B  /* skip if 100 and nothing
V on list */
X        XtSetSensitive(button_array`5Bfind_button`5D, ON);  /* 'find' button
V is now active */
X        XtSetSensitive(button_array`5Bfind_menu`5D, ON);    /* 'find' menu i
Vtem is now active */
X    `7D
X    if (*data == 100) `7B  /* 100 means re-enable found_list */
X        found_ptr = &found_list;
X        return;
X    `7D
X
X    sprintf(str, "Reset %s search", select_data`5B*data`5D.name);
X    xmstr = XmStringCreateSimple(str);
X    ac = 0;
X    XtSetArg(arglist`5Bac`5D, XmNlabelString, xmstr); ac++;
X    XtSetArg(arglist`5Bac`5D, XmNsensitive, TRUE); ac++;
X    XtSetValues(button_array`5Brestart_button`5D, arglist, ac);
X    XmStringFree(xmstr);
X
X    for (ptr = found_list.next; ptr;) `7B /* free old found list */
X        XtFree(ptr->name);
X        tptr = ptr;
X        ptr = ptr->next;
X        XtFree(tptr);
X    `7D
X    select_index = *data;       /* which field to match */
X    if (select_string)
X        XtFree(select_string);  /* free memory used by old string */
X    switch (select_data`5B*data`5D.type) `7B
X    case DWP_ALPHA:  /* username, account */
X    case DWP_LALPHA: /* other text fields */
X    case DWP_UIC:    /* use the text of UIC */
X        /* we could parse_dev(), parse_dir(), etc. here to ensure match */
X        select_string = XtNewString(unpad(uafdata`5Bselect_data`5B*data`5D.c
Vode`5D.sdata));
X        break;
X    case DWP_DATE:  /* pwdlifetime, expiration; text string or 64 bit date *
V/
X        if (uafdata`5Bselect_data`5B*data`5D.code`5D.changed)  /* text was e
Vntered */
X            if (!parse_date(select_data`5B*data`5D.code))  /* convert text t
Vo binary */
X                DWPerror("Select","Illegal date format", 0);
X        select_string = XtMalloc(select_data`5B*data`5D.size);
X        memcpy(select_string, uafdata`5Bselect_data`5B*data`5D.code`5D.sdata
V,
X               select_data`5B*data`5D.size);
X        break;
X    default:
X        select_string = XtNewString("");  /* so find_work_proc won't blow up
V */
X    `7D
X    select_ptr = found_add = NULL;  /* restart find from the beginning */
X    found_list.next = NULL;
X    found_ptr = &found_list;
X    if (find_work_proc_id)  /* is there one going on now? */
X        XtRemoveWorkProc(find_work_proc_id);  /* stop it */
X    find_work_proc_id = XtAppAddWorkProc(context, find_work_proc, NULL);
X    /* note: to be run first, read_identifiers must be called after AppAddWo
VrkProc */
X    read_identifiers(FALSE);        /* set up ident_list if necessary */
X`7D
X
X
X/*
X *  Creation callback;  save the widget using the UAI code as the index
X */
X
Xstatic XtCallbackProc WidgetCreated(Widget widget, XtPointer data,
X                XmAnyCallbackStruct *reason)
X`7B
X    widget_array`5B*data`5D = widget;
X`7D
X
X
X/*
X *  Creation callback;  save the save menu button widget in button_array
X */
X
Xstatic XtCallbackProc ButtonCreated(Widget widget, XtPointer data,
X                XmAnyCallbackStruct *reason)
X`7B
X    button_array`5B*data`5D = widget;
X`7D
X
X
X/*
X *  Called whenever a key is pressed in a text widget
X */
X
Xstatic XtCallbackProc WidgetChanged(Widget widget, XtPointer data,
X                XmTextVerifyCallbackStruct *reason)
X`7B
X    String str;
X    Cardinal pos;
X
X    if (setting_widgets) return;
X    pos = XmTextGetInsertionPosition(widget);
X    str = XmTextGetString(widget);
X    uafdata`5B*data`5D.changed = TRUE;    /* element has changed */
X    if (*data != UAI$_OWNER)
X            uppercase(str);
X    strcpy(uafdata`5B*data`5D.sdata, str);
X    setting_widgets = TRUE;        /* Don't allow recursion */
X    XmTextSetString(widget, str);
X    XmTextSetInsertionPosition(widget, pos);
X    setting_widgets = FALSE;
X    XtFree(str);
X`7D
X
X
X/*
X *  Called when flag toggle button is created
X */
X
Xstatic XtCallbackProc FlagsCreated(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    flags_array`5B*data`5D = widget;
X`7D
X
X
X/*
X *  Called whenever a flag toggle button is pressed
X */
X
Xstatic XtCallbackProc FlagsChanged(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    if (setting_flags) return;
X    uafdata`5BUAI$_FLAGS`5D.changed = TRUE;        /* element has changed */
X    uafdata`5BUAI$_FLAGS`5D.idata `5E= 1 << *data;    /* toggle flag bit */
X`7D
X
X
X/*
X *  Called when a primary day toggle button is created
X */
X
Xstatic XtCallbackProc PrimeCreated(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    prime_array`5B*data`5D = widget;
X`7D
X
X
X/*
X *  Called whenever a prime day toggle button is pressed
X */
X
Xstatic XtCallbackProc PrimeChanged(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    if (setting_prime) return;
X    uafdata`5BUAI$_PRIMEDAYS`5D.changed = TRUE;        /* element has change
Vd */
X    uafdata`5BUAI$_PRIMEDAYS`5D.idata `5E= 1 << *data;    /* toggle bit in p
Vrimedays */
X`7D
X
X
X/*
X *  Called when a privs toggle button is created
X */
X
Xstatic XtCallbackProc PrivsCreated(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    privs_array`5B*data`5D = widget;
X`7D
X
X
X/*
X *  Called whenever a privs toggle button is pressed
X */
X
Xstatic XtCallbackProc PrivsChanged(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    if (setting_privs) return;
X    if (*data < PRIVS_BIAS) `7B
X        uafdata`5BUAI$_PRIV`5D.sdata`5B*data >> 3`5D `5E= 1 << (*data & 7);
X        uafdata`5BUAI$_PRIV`5D.changed = TRUE;    /* element has changed */
X        `7D
X    else `7B
X        uafdata`5BUAI$_DEF_PRIV`5D.sdata`5B(*data - PRIVS_BIAS) >> 3`5D `5E=
X            1 << (*data - PRIVS_BIAS & 7);
X        uafdata`5BUAI$_DEF_PRIV`5D.changed = TRUE;
X    `7D
X`7D
X
X
X/*
X *  Read selection box widget to get account name
X *  Create new UIC
X */
X
Xstatic XtCallbackProc AccountChanged(Widget widget, XtPointer data,
X            XmSelectionBoxCallbackStruct *reason)
X`7B
X    String str;
X    Cardinal ind;
X
X    if (reason->reason == XmCR_CANCEL) `7B
X        XmTextSetString(widget_array`5BUAI$_ACCOUNT`5D, "");
X        uafdata`5BUAI$_ACCOUNT`5D.changed = TRUE;
X        strcpy(uafdata`5BUAI$_ACCOUNT`5D.sdata, "");
X        return;
X    `7D
X
X    XmStringGetLtoR(reason->value, XmSTRING_DEFAULT_CHARSET, &str);
X    XmTextSetString(widget_array`5BUAI$_ACCOUNT`5D, str);
X    uafdata`5BUAI$_ACCOUNT`5D.changed = TRUE;
X    strcpy(uafdata`5BUAI$_ACCOUNT`5D.sdata, str);
X    uppercase(uafdata`5BUAI$_ACCOUNT`5D.sdata);
X    XtFree(str);
X    strcpy(uafdata`5BUAI$_UIC`5D.sdata, "`5B0,0`5D");    /* force UIC recalc
V */
X    calc_uic();
X    trans_uic(uafdata`5BUAI$_UIC`5D.idata);
X`7D
X
X
X/*
X *  Called by 'Read Identifiers' menu item
X */
X
Xstatic XtCallbackProc ReadIdentifiers(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    read_identifiers(TRUE);
X`7D
X
X
X/*
X *  Pop up accounts selection box widget
X *  Called by 'Accounts' menu item
X */
X
Xstatic XtCallbackProc Accounts(Widget widget, XtPointer data,
X            XmAnyCallbackStruct *reason)
X`7B
X    Cardinal ac;
X    Arg arglist`5B5`5D;
X    XmString xmstr;
X
X    /* make accounts_box */
X    /* this could be fetched from a UID file, but it's easier here */
X    if (!accounts_box) `7B
X        ac = 0;
X        xmstr = XmStringCreateSimple("DWProfile: Accounts");
X        XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X`09XtSetArg(arglist`5Bac`5D, XmNdefaultPosition, FALSE); ac++;
X        accounts_box = XmCreateSelectionDialog(toplevel, "accounts_box", arg
Vlist, ac);
X        XmStringFree(xmstr);
X        XtAddCallback(accounts_box, XmNapplyCallback, AccountChanged, NULL);
X        XtAddCallback(accounts_box, XmNhelpCallback, Help, "menus windows ac
Vcounts");
X        XtUnmanageChild(XmSelectionBoxGetChild(accounts_box, XmDIALOG_OK_BUT
VTON));
X        XtUnmanageChild(XmSelectionBoxGetChild(accounts_box, XmDIALOG_CANCEL
V_BUTTON));
X    `7D
X    if (XtIsManaged(accounts_box)) `7B
X        XtUnmanageChild(accounts_box);
X        XmToggleButtonSetState(button_array`5Baccounts_menu`5D, OFF, NO);
X        return;
X    `7D
X    XtManageChild(accounts_box);
X    XmToggleButtonSetState(button_array`5Baccounts_menu`5D, ON, NO);
X    if (ident_list)
X        build_accounts();  /* build list from idents */
X    else
X        read_identifiers(FALSE); /* get idents, build list when done */
X`7D
X
X
X/*
X *  Pop up (or remove) the idents dialog box
X *  Called by 'Idents' menu item
X */
X
Xstatic XtCallbackProc Idents(Widget widget, XtPointer data,
X                XmAnyCallbackStruct *reason)
X`7B
X    if (!idents_box)
X        if ((MrmFetchWidget(Hierarchy, "idents_box", toplevel,
X             &idents_box, &class)) != MrmSUCCESS)
X            XtAppError(context, "Error Fetching Idents main widget");
X    if (XtIsManaged(idents_box)) `7B
X        XtUnmanageChild(idents_box);
X        XmToggleButtonSetState(button_array`5Bidents_menu`5D, OFF, NO);
X        return;
X    `7D
X    XtManageChild(idents_box);
X    XmToggleButtonSetState(button_array`5Bidents_menu`5D, ON, NO);
X    if (ident_list)
X        update_held();  /* build list from idents */
X    else
X        read_identifiers(FALSE);  /* get idents, build list when done */
X`7D
X
X
X/*
X *  Add (or remove) the identifier for the user
X *  Called by selecting identifier from list box
X */
X
Xstatic XtCallbackProc ListSelect(Widget widget, XtPointer data,
X                XmListCallbackStruct *list)
X`7B
X    Cardinal count, ind;
X    ident *ptr;
X    held_ident *hptr, *prev_hptr, *tmp_hptr;
X    String str;
X
X    switch(*data) `7B
X    case k_widget_all_list:
X        XmStringGetLtoR(list->item, XmSTRING_DEFAULT_CHARSET, &str);
X        /* find the identifier that matches the selected item */
X        for (ptr = ident_list; ptr; ptr = ptr->next)
X            if (!strcmp(ptr->name, str)) break;
X        XtFree(str);
X        for (hptr = held_list, prev_hptr = NULL; hptr; prev_hptr = hptr, hpt
Vr = hptr->next) /* find deleted id or end */
X            if (hptr->identifier == ptr->identifier) break;
X        if (!hptr) `7B   /* not in held list, make new node */
X            hptr = XtNew(held_ident);
X            hptr->name = XtNewString(ptr->name);
X            hptr->identifier = NULL;
X            hptr->next = NULL;
X            if (prev_hptr)
X                prev_hptr->next = hptr;  /* point prev node to new node */
X            else
X                held_list = hptr;        /* or start list with first new nod
Ve */
X        `7D
X        if (!hptr->identifier) `7B
X            hptr->status = add_ident;    /* not found */
X            hptr->identifier = ptr->identifier;
X        `7D
X        else
X            hptr->status = original; /* orig ident deleted then added back *
V/
X        break;
X    case k_widget_held_list:
X        count = 0;
X        for (hptr = held_list, prev_hptr = NULL; hptr;) `7B
X            tmp_hptr = NULL;
X            if (hptr->status == original `7C`7C
X                hptr->status == add_ident) count++;
X            if (count == list->item_position) `7B   /* is this the list item
V selected ? */
X                if (hptr->status == add_ident) `7B  /* if this is a pending
V add */
X                    if (prev_hptr)                /* remove it from held_lis
Vt */
X                        prev_hptr->next = hptr->next;
X                    else
X                        held_list = hptr->next;
X                    tmp_hptr = hptr;              /* and flag it for delete
V */
X                `7D
X                hptr->status = del_orig; /* original ident marked for remova
Vl */
X                break;
X            `7D
X            prev_hptr = hptr;
X            hptr = hptr->next;
X            if (tmp_hptr)
X                XtFree(tmp_hptr);
X        `7D
X        break;
X    `7D
X    update_held();
X`7D
X
X`20
X/*
X *  Activation callback on a help menu or help callback
X */
X
Xstatic XtCallbackProc Help(Widget widget, String data,
X                XmPushButtonCallbackStruct *reason)
X`7B
X
X    Cardinal ac;
X    Arg arglist`5B10`5D;
X    XmString appname, glossarytopic, overviewtopic, libspec, topic;
X    static Widget help_box = NULL;
X    Widget temp_help_box;
X
X    if (!strcmp(data, "context")) `7B
X        /* context sensitive help mode, we'll get back here via helpcallback
V */
X        DXmHelpOnContext(toplevel, FALSE);`09
X        return;
X    `7D
X
X    topic = XmStringCreateSimple(data);
X
X    if (!help_box `7C`7C XtIsManaged(help_box)) `7B
X        /* We're going to create a help widget */
X        ac = 0;
X        appname = XmStringCreateSimple("DWProfile");
X        overviewtopic = XmStringCreateSimple("overview");
X        libspec = XmStringCreateSimple(HELP_LIBRARY);
X        XtSetArg(arglist`5Bac`5D, DXmNapplicationName, appname); ac++;
X        XtSetArg(arglist`5Bac`5D, DXmNoverviewTopic, overviewtopic); ac++;
X        XtSetArg(arglist`5Bac`5D, DXmNlibrarySpec, libspec); ac++;
X    `7D
X
X    if (!help_box) `7B  /* create the help box */
X        help_box = DXmCreateHelpDialog (toplevel, "help_box", arglist, ac);
X        XmStringFree(appname);
X        XmStringFree(overviewtopic);
X        XmStringFree(libspec);
X    `7D
X
+-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
-- 
Bruce Tanner        (310) 860-2451 x 596    Tanner@Cerritos.EDU
Cerritos College    Norwalk, CA             DoD #0161  NOMAD #007
Technical Details
Message-ID: <9908592@MVB.SAIC.COM>
Path: arc1-ca.pugleaf.net!sparky!uunet!wupost!cs.utexas.edu!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!wupost!cs.utexas.edu!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources
From: tanner@cerritos.edu
Newsgroups: vmsnet.sources
Subject: DWProfile V3.3, part 03/06
Message-ID: <9908592@MVB.SAIC.COM>
Date: Mon, 04 Jan 1993 20:47:05 GMT
Organization: Cerritos College, Norwalk CA
Lines: 1408
Approved: Mark.Berryman@Mvb.Saic.Com