home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-01-05 | 47.6 KB | 1,414 lines |
- Path: sparky!uunet!cs.utexas.edu!usc!sdd.hp.com!network.ucsd.edu!mvb.saic.com!vmsnet-sources
- From: tanner@cerritos.edu
- Newsgroups: vmsnet.sources
- Subject: DWProfile V3.3, part 02/06
- Message-ID: <9908584@MVB.SAIC.COM>
- Date: Mon, 04 Jan 1993 20:46:37 GMT
- Organization: Cerritos College, Norwalk CA
- Lines: 1403
- Approved: Mark.Berryman@Mvb.Saic.Com
-
- Submitted-by: tanner@cerritos.edu
- Posting-number: Volume 4, Issue 27
- Archive-name: dwprofile/part02
-
- -+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+
- X `7B"versionLimit", "VersionLimit", XtRInt, sizeof(int),
- X XtOffset(ApplicationDataPtr, version_limit), XtRString, "0"`7D,
- X `7B"minimumGroup", "MinimumGroup", XtRInt, sizeof(int),
- X XtOffset(ApplicationDataPtr, minimum_group), XtRString, "0"`7D,
- X `7B"maximumGroup", "MaximumGroup", XtRInt, sizeof(int),
- X XtOffset(ApplicationDataPtr, maximum_group), XtRString, "32767"`7D
- X`7D;
- X
- X#define dwp32_width 32
- X#define dwp32_height 32
- Xstatic char dwp32_bits`5B`5D = `7B
- X 0x00, 0x00, 0x20, 0x80, 0xfe, 0xff, 0xaf, 0xbf, 0x82, 0x20, 0xa8, 0xaa,
- X 0xfe, 0xff, 0xaf, 0xbf, 0x82, 0x20, 0xa8, 0xaa, 0xfe, 0xff, 0xaf, 0xbf,
- X 0x82, 0x20, 0xa8, 0xaa, 0xfe, 0xff, 0xaf, 0xbf, 0xaa, 0xaa, 0xaa, 0xaa,
- X 0xfe, 0xff, 0xaf, 0xbf, 0xaa, 0xaa, 0xaa, 0xaa, 0xfe, 0xff, 0xaf, 0xbf,
- X 0xfe, 0xff, 0x2f, 0x80, 0xe2, 0x38, 0xee, 0xff, 0xfe, 0xff, 0xef, 0xff,
- X 0xe2, 0x38, 0xee, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xe2, 0x38, 0xee, 0xff,
- X 0xfe, 0xff, 0xef, 0xff, 0xe2, 0x38, 0xee, 0xff, 0xfe, 0xff, 0xef, 0xff,
- X 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- X 0x00, 0x00, 0xe0, 0xff, 0xfe, 0xff, 0xef, 0xff, 0x02, 0x06, 0xe8, 0xff,
- X 0xfe, 0xff, 0xef, 0xff, 0x02, 0x06, 0xe8, 0xff, 0xfe, 0xff, 0xef, 0xff,
- X 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff`7D;
- X
- Xstatic String uidname`5B`5D = `7B
- X "DWPUID:DWPROFILE.UID",
- X "DWPUID:ACCESS.UID",
- X "DWPUID:PRIVS.UID",
- X "DWPUID:IDENTS.UID",
- X`7D;
- X
- X#define HELP_LIBRARY "DWPUID:DWPROFILE.HLB"
- $ CALL UNPACK DWPDEF.H;49 408054743
- $ create 'f'
- X/* DWPROFILE.C -- Authorize/Profile/DECburger replacement */
- X/* Copyright `A9 1990,1991,1992 Bruce Tanner - Cerritos College */
- X
- X/*
- X * Revision history:
- X * 9/4/90 Version 1.0
- X * 9/12/90 Version 1.1
- X * Added popup menu for access, privs boxes.
- X * Forced 12 point Helvetica Bold font.
- X * Moved lots of stuff to the resource file.
- X * Added date of last login, logfails.
- X * 10/10/90 Version 2.0
- X * Create/delete directory.
- X * Add/delete disk quota.
- X * Grant/revoke identifiers.
- X * Take username from command line.
- X * 11/28/90 Version 2.1
- X * Fixed: Dup UIC from calc_uic() on multiple adds from same reco
- Vrd.
- X * Fixed: Identifier not changed on UIC change.
- X * 8/21/91 Version 2.2
- X * Fixed: directory creation; add quota THEN create directory.
- X * Check for blank owner, account DEFAULT, defdir `5BUSER`5D
- X * Fixed: New account created bad UIC.
- X * 10/9/92 Version 2.3
- X * Keep list of identifiers up to date.
- X * Minor code cleanup.
- X * 10/27/92 Version 3.0
- X * Converted to Motif.
- X * 11/4/92 Version 3.1
- X * Added Select menu and Find Next button.
- X * 11/13/92 Version 3.2
- X * Added Help menu item.
- X * 11/30/92 Version 3.3
- X * Beta test bug fixes and the usual code randomizing.
- X */
- X
- X#define TITLE "DWProfile"
- X#module DWProfile "DWProfile V3.3"
- X#include descrip
- X#include string
- X#include ssdef
- X#include stdio
- X#include clidef
- X#include jpidef
- X#include prvdef
- X#include rmsdef
- X#include strdef
- X#include str$routines
- X#include <decw$cursor.h>
- X#include "dwpdef.h"
- X#include <X11/Intrinsic.h>
- X#include <Xm/Xm.h>
- X#include <Xm/MwmUtil.h>
- X#include <Mrm/Mrm.h>
- X#include <Xm/RowColumn.h>
- X#include <Xm/MessageB.h>
- X#include <Xm/SelectioB.h>
- X#include <Xm/DrawingA.h>
- X#include <DXm/DECspecific.h>
- X#include <DXm/DXmHelpB.h>
- X
- Xstatic MrmHierarchy Hierarchy;
- Xstatic MrmType class;
- Xstatic XtAppContext context;
- Xstatic Widget toplevel, dwprofile_main, access_box, privs_box,
- X widget_array`5BMAX_WIDGET`5D, flags_array`5BMAX_FLAGS`5D,
- X prime_array`5BMAX_PRIME`5D, privs_array`5BMAX_PRIVS`5D,
- X button_array`5BMAX_MENUS`5D, idents_box, accounts_box, work_box;
- Xstatic void init_application(), get_gc(), update_prime(),
- X update_time(Cardinal), update_strings(), update_flags(),
- X update_privs(), set_translations(), set_handlers(),
- X trans_uic(Cardinal), make_cursor(), build_popup(),
- X update_held(), set_defaults(), build_accounts(), pos_functions(),
- X DWPerror(String, String, int), DWPmsg(String, Cardinal),
- X progress(ident *), read_identifiers(Boolean);
- Xstatic Boolean get_record(String), parse_uic(int);
- Xstatic XtEventHandler popup_handler(), access_handler();
- Xstatic XtCallbackProc WidgetCreated(), WidgetChanged(),
- X Quit(), Write(), Read(), Find(), Remove(), Access(),
- X Privs(), Accounts(), Idents(),
- X FlagsCreated(), FlagsChanged(),
- X PrimeCreated(), PrimeChanged(),
- X PrivsCreated(), PrivsChanged(),
- X AccountChanged(), CautionCallback(),
- X MessageCallback(), ReadIdentifiers(),
- X ListSelect(), IdentsCancelCallback(),
- X ButtonCreated(), Select(), FindCancelCallback(),
- X Help(), DestroyHelpCallback();
- Xstatic XtActionProc return_key(), select_key();
- Xstatic MrmRegisterArg regvec`5B`5D = `7B
- X `7B"WidgetCreated", WidgetCreated`7D,
- X `7B"WidgetChanged", WidgetChanged`7D,
- X `7B"Quit", Quit`7D,
- X `7B"Write", Write`7D,
- X `7B"Read", Read`7D,
- X `7B"Find", Find`7D,
- X `7B"Remove", Remove`7D,
- X `7B"Access", Access`7D,
- X `7B"Privs", Privs`7D,
- X `7B"Accounts", Accounts`7D,
- X `7B"FlagsCreated", FlagsCreated`7D,
- X `7B"FlagsChanged", FlagsChanged`7D,
- X `7B"PrimeCreated", PrimeCreated`7D,
- X `7B"PrimeChanged", PrimeChanged`7D,
- X `7B"PrivsCreated", PrivsCreated`7D,
- X `7B"PrivsChanged", PrivsChanged`7D,
- X `7B"ReadIdentifiers", ReadIdentifiers`7D,
- X `7B"Idents", Idents`7D,
- X `7B"ListSelect", ListSelect`7D,
- X `7B"ButtonCreated", ButtonCreated`7D,
- X `7B"Select", Select`7D,
- X `7B"Help", Help`7D
- X`7D;
- Xstatic char return_translation`5B`5D = "<Key>Return: return_key()",
- X select_translation`5B`5D = "<Key>osfSelect: select_key()";
- Xstatic XtActionsRec action_table`5B`5D = `7B
- X `7B"return_key", return_key`7D,
- X `7B"select_key", select_key`7D
- X`7D; `20
- Xstatic String fallbacks`5B`5D = `7B
- X "*fontList: -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-*-*-*",
- X NULL
- X`7D;
- Xstatic String select_string, unpad(String);
- Xstatic ApplicationData resource_data;
- Xstatic struct `7B
- X int idata;
- X Boolean changed;
- X char sdata`5BSDATA_LEN`5D, odata`5BSDATA_LEN`5D;
- X `7D uafdata`5BMAX_WIDGET`5D;
- Xstatic struct itemlist3 itmlst`5BMAX_WIDGET`5D;
- Xstatic Display *top_display;
- Xstatic Window top_window;
- Xstatic GC gc_draw, gc_clear;
- Xstatic Boolean setting_widgets, setting_prime, setting_flags, setting_privs;
- Xstatic ident *ident_list = NULL, *select_ptr = NULL, *ident_ptr, *found_ptr,
- X *found_add, found_list = `7BNULL, 0, 0, NULL`7D;
- Xstatic held_ident *held_list = NULL;
- Xstatic Cardinal uic_count, account_count, ident_count, select_index;
- Xstatic XtIntervalId timeout_id, progress_id;
- Xstatic Cursor wait_cursor;
- Xstatic XtWorkProcId idents_work_proc_id, find_work_proc_id;
- X
- X
- Xmain(unsigned int argc, char *argv`5B`5D)
- X`7B
- X Cardinal status, ac;
- X Arg arglist`5B5`5D;
- X Pixmap icon_pixmap;
- X
- X init_application();
- X MrmInitialize();
- X DXmInitialize();
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNtitle, TITLE); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNmwmDecorations,
- X MWM_DECOR_MENU `7CMWM_DECOR_BORDER `7C MWM_DECOR_TITLE `7C
- X MWM_DECOR_MINIMIZE); ac++;
- X toplevel = XtAppInitialize(&context, "DWProfile", NULL, 0, &argc, argv,
- X fallbacks, arglist, ac);
- X
- X status = MrmOpenHierarchy(XtNumber(uidname), uidname, NULL, &Hierarchy);
- X if (status != MrmSUCCESS) lib$signal(status);
- X
- X status = MrmRegisterNames(regvec, XtNumber(regvec));
- X if (status != MrmSUCCESS) lib$signal(status);
- X
- X if ((MrmFetchWidget(Hierarchy, "dwprofile_main", toplevel,
- X &dwprofile_main, &class)) != MrmSUCCESS)
- X XtAppError(context, "Error Fetching main widget");
- X
- X XtGetApplicationResources(toplevel, &resource_data, resources,
- X XtNumber(resources), NULL, 0);
- X
- X XtManageChild(dwprofile_main);
- X XtRealizeWidget(toplevel);
- X
- X top_display = XtDisplay(toplevel);
- X top_window = XtWindow(toplevel);
- X icon_pixmap = XCreateBitmapFromData(top_display, top_window,
- X dwp32_bits, dwp32_width, dwp32_heigh
- Vt);
- X
- X /* Set up the WM icons via shell widget attributes */
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNiconPixmap, icon_pixmap); ac++;
- X XtSetValues(toplevel, arglist, ac);
- X
- X make_cursor(); /* create wait_cursor */
- X set_translations(); /* set text widget translations */
- X build_popup(); /* build a popup menu */
- X get_gc(); /* set up stuff for access windows */
- X pos_functions(); /* center the functions box */
- X
- X if (argc == 1)
- X get_record(""); /* Initialize text fields */
- X
- X /* load username if given on command line */
- X if (argc == 2)
- X if (!get_record(argv`5B1`5D))
- X if (get_record("DEFAULT"))
- X set_defaults(argv`5B1`5D);
- X else
- X DWPerror("Main Init", "Cannot read username DEFAULT", 0);
- X
- X /* set up the windows based on resource file */
- X if (resource_data.show_access) Access(NULL, NULL, NULL);
- X if (resource_data.show_privs) Privs(NULL, NULL, NULL);
- X if (resource_data.show_accounts) Accounts(NULL, NULL, NULL);
- X if (resource_data.show_idents) Idents(NULL, NULL, NULL);
- X
- X /* traverse to the username widget */
- X XmProcessTraversal(widget_array`5BUAI$_USERNAME`5D, XmTRAVERSE_CURRENT);
- X
- X XtAppMainLoop(context);
- X`7D
- X
- X
- X/*** Initialization Routines ***/
- X
- X/*
- X * Set sysprv
- X * Clear out widget arrays
- X */
- X
- Xstatic void init_application()
- X`7B
- X Cardinal ind, status, my_privs`5B2`5D,
- X jpicode = JPI$_AUTHPRIV, priv_mask`5B2`5D = `7B0, 0`7D;
- X
- X status = lib$getjpi(&jpicode, 0, 0, &my_privs, 0, 0);
- X if (status != SS$_NORMAL)
- X XtAppError(context, "lib$getjpi failed");
- X `20
- X if (my_privs`5B0`5D & (PRV$M_SYSPRV `7C PRV$M_SETPRV)) `7B
- X priv_mask`5B0`5D `7C= PRV$M_SYSPRV;
- X status = sys$setprv(ON, &priv_mask, 0, 0);
- X if (status != SS$_NORMAL)
- X XtAppError(context, "sys$setprv failed");
- X `7D
- X else `7B
- X printf("Insufficient privilege to see other than your own UAF record
- V\n");
- X/* exit(); */
- X `7D
- X
- X for (ind = 0; ind < MAX_WIDGET; ind++) widget_array`5Bind`5D = NULL;
- X for (ind = 0; ind < MAX_FLAGS; ind++) flags_array`5Bind`5D = NULL;
- X for (ind = 0; ind < MAX_PRIVS; ind++) privs_array`5Bind`5D = NULL;
- X for (ind = 0; ind < MAX_PRIME; ind++) prime_array`5Bind`5D = NULL;
- X`7D
- X
- X
- X/*
- X * Load the cursor font and allocate colors for the cursor
- X */
- X
- Xstatic void make_cursor()
- X`7B
- X Colormap cmap;
- X XColor red, white, dummy;
- X Font cursorfont;
- X
- X cmap = DefaultColormap(top_display, DefaultScreen(top_display));
- X
- X XAllocNamedColor(top_display, cmap, "white", &white, &dummy);
- X XAllocNamedColor(top_display, cmap, "red", &red, &dummy);
- X
- X cursorfont = XLoadFont(top_display, "DECW$CURSOR");
- X wait_cursor = XCreateGlyphCursor(top_display, cursorfont, cursorfont,
- X decw$c_wait_cursor, decw$c_wait_cursor+1, &red, &white);
- X
- X`7D
- X
- X
- X/*
- X * Override the translation table of the Username, Account text widgets
- X * Override Select translation for selectable fields
- X */
- X
- Xstatic void set_translations()
- X`7B
- X Cardinal si;
- X XtTranslations compiled_trans;
- X
- X XtAppAddActions(context, action_table, XtNumber(action_table));
- X
- X compiled_trans = XtParseTranslationTable(return_translation);
- X XtOverrideTranslations(widget_array`5BUAI$_USERNAME`5D, compiled_trans);
- X XtOverrideTranslations(widget_array`5BUAI$_ACCOUNT`5D, compiled_trans);
- X
- X compiled_trans = XtParseTranslationTable(select_translation);
- X for(si = 0; select_data`5Bsi`5D.code; si++)
- X if (select_data`5Bsi`5D.type != DWP_RINT)
- X XtOverrideTranslations(widget_array`5Bselect_data`5Bsi`5D.code`5
- VD, compiled_trans);
- X`7D
- X
- X
- X/*
- X * Set up event handlers for access windows
- X */
- X
- Xstatic void set_handlers()
- X`7B
- X Cardinal wi;
- X
- X for (wi = UAI$_NETWORK_ACCESS_P; wi <= UAI$_REMOTE_ACCESS_S; wi++)
- X if (widget_array`5Bwi`5D)
- X XtAddEventHandler(widget_array`5Bwi`5D,
- X ButtonPressMask `7C ButtonReleaseMask `7C Expo
- VsureMask `7C
- X Button1MotionMask, FALSE, access_handler, wi);
- X`7D
- X
- X
- X/*
- X * Build a MenuPopup widget and children
- X */
- X
- Xstatic void build_popup()
- X`7B
- X#define MENUS 4
- X Arg arglist`5B2`5D;
- X Cardinal ac, ind;
- X struct `7B
- X String resource;
- X String title;
- X XtCallbackProc callback;
- X `7D params`5BMENUS`5D = `7B
- X `7B"access_button", "Access...", Access`7D,
- X `7B"privs_button", "Privs...", Privs`7D,
- X `7B"accounts_button", "Accounts...", Accounts`7D,
- X `7B"idents_button", "Identifiers...", Idents`7D
- X `7D;
- X Widget menu_items`5BMENUS`5D, popup_menu;
- X
- X popup_menu = XmCreatePopupMenu(dwprofile_main, "popup", NULL, 0);
- X /* pass popup_menu as the client data for popup() */
- X XtAddEventHandler(dwprofile_main, ButtonPressMask, FALSE, popup_handler,
- V popup_menu);
- X
- X for (ind = 0; ind < MENUS; ind++) `7B
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNlabelString, XmStringCreateSimple(param
- Vs`5Bind`5D.title)); ac++;
- X menu_items`5Bind`5D = XmCreatePushButtonGadget(popup_menu, params`5B
- Vind`5D.resource, arglist, ac);
- X XtAddCallback(menu_items`5Bind`5D, XmNactivateCallback, params`5Bind
- V`5D.callback, 0);
- X `7D
- X
- X XtManageChildren(menu_items, ind); /* just the buttons, not the menu *
- V/
- X`7D
- X
- X
- X/*
- X * Set up the graphic contexts gc_draw and gc_clear
- X */
- X
- Xstatic void get_gc()
- X`7B
- X Cardinal ac;
- X Arg arglist`5B2`5D;
- X XGCValues gc_values;
- X Pixel foreground, background;
- X
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNforeground, &foreground); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNbackground, &background); ac++;
- X XtGetValues(dwprofile_main, arglist, ac);
- X gc_values.foreground = foreground;
- X gc_values.background = background;
- X gc_draw = XtGetGC(dwprofile_main, GCForeground `7C GCBackground, &gc_val
- Vues);
- X gc_values.foreground = background;
- X gc_clear = XtGetGC(dwprofile_main, GCForeground, &gc_values);
- X`7D
- X
- X
- X
- X/*** Utility Routines ***/
- X
- X/*
- X * Set the username, password and directory name
- X * Called by main, Read
- X */
- X
- Xstatic void set_defaults(String user)
- X`7B
- X Arg arg`5B1`5D;
- X char text`5B40`5D;
- X
- X /* SetString sets .sdata and .changed */
- X XmTextSetString(widget_array`5BUAI$_USERNAME`5D, user);
- X XmTextSetString(widget_array`5BUAI$_PWD`5D, user);
- X sprintf(uafdata`5BUAI$_DEFDIR`5D.sdata, "`5B%s`5D", user);
- X XmTextSetString(widget_array`5BUAI$_DEFDIR`5D, uafdata`5BUAI$_DEFDIR`5D.
- Vsdata);
- X
- X sprintf(text, "%s\n%s", TITLE, user);
- X XtSetArg(arg`5B0`5D, XmNiconName, text);
- X XtSetValues(toplevel, arg, 1); /* update the icon name */
- X`7D
- X
- X
- X/*
- X * Center the functions box
- X */
- X
- Xstatic void pos_functions()
- X`7B
- X Arg arglist`5B5`5D;
- X Cardinal ac;
- X Dimension funct_width, main_width, funct_x, new_x;
- X
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNwidth, &funct_width); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNx, &funct_x); ac++;
- X XtGetValues(button_array`5Bfunctions_menu`5D, arglist, ac);
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNwidth, &main_width); ac++;
- X XtGetValues(dwprofile_main, arglist, ac);
- X new_x = (main_width - funct_width) / 2;
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNx, new_x); ac++;
- X XtSetValues(button_array`5Bfunctions_menu`5D, arglist, ac);
- X`7D
- X
- X
- X/*
- X * Lookup a UAF record and fill those widgets
- X * Called by Read and program initialization
- X */
- X
- Xstatic Boolean get_record(String acct)
- X`7B
- X Cardinal status, ind, si, resid, rdbctx = 0, holder`5B2`5D = `7B0, 0`7D;
- X ushort namlen;
- X ident *ptr;
- X held_ident *hptr, *tptr;
- X Arg arg`5B1`5D;
- X char text`5B40`5D, nambuf`5B40`5D;
- X $DESCRIPTOR(acct_dsc, acct);
- X $DESCRIPTOR(name_dsc, nambuf);
- X
- X /* reset all the data storage */
- X for (ind = 0; ind < MAX_WIDGET; ind++) `7B
- X memset(uafdata`5Bind`5D.sdata, 0, SDATA_LEN);
- X uafdata`5Bind`5D.idata = 0;
- X uafdata`5Bind`5D.changed = FALSE;
- X `7D
- X
- X /* acct = "" means clear form */
- X if (strlen(acct)) `7B`20
- X acct_dsc.dsc$w_length = strlen(acct);
- X for (ind = 0; ; ind++) `7B
- X itmlst`5Bind`5D.buflen = items`5Bind`5D.size;
- X itmlst`5Bind`5D.itmcode = items`5Bind`5D.code;
- X if (!items`5Bind`5D.code) break; /* exit after copying zero e
- Vntry */
- X if (items`5Bind`5D.size > 4) /* anything that fits goes i
- Vn .idata */
- X itmlst`5Bind`5D.bufadr = uafdata`5Bitems`5Bind`5D.code`5D.sd
- Vata;
- X else
- X itmlst`5Bind`5D.bufadr = &uafdata`5Bitems`5Bind`5D.code`5D.i
- Vdata;
- X itmlst`5Bind`5D.retadr = 0;
- X `7D
- X status = sys$getuai(0, 0, &acct_dsc, &itmlst, 0, 0, 0);
- X
- X if ((status & 7) != SS$_NORMAL) /* often SS$_BUFFEROVF */
- X return FALSE; /* probably not found */
- X
- X for (ind = 0; items`5Bind`5D.code; ind++) /* reset changed flags
- V */
- X uafdata`5Bitems`5Bind`5D.code`5D.changed = FALSE;
- X
- X /* remember the old values of device and directory */
- X memcpy(uafdata`5BUAI$_DEFDEV`5D.odata, uafdata`5BUAI$_DEFDEV`5D.sdat
- Va, 32);
- X memcpy(uafdata`5BUAI$_DEFDIR`5D.odata, uafdata`5BUAI$_DEFDIR`5D.sdat
- Va, 64);
- X `7D
- X
- X for (hptr = held_list; hptr;) `7B /* free old held list */
- X tptr = hptr;
- X hptr = hptr->next;
- X XtFree(tptr);
- X `7D
- X held_list = NULL;
- X
- X if (strlen(acct)) `7B
- X holder`5B0`5D = uafdata`5BUAI$_UIC`5D.idata;
- X for (hptr = held_list;;) `7B
- X status = sys$find_held(&holder, &resid, 0, &rdbctx);
- X if (status == SS$_NOSUCHID) break;
- X if (status != SS$_NORMAL) `7B
- X sys$finish_rdb(&rdbctx);
- X DWPmsg("get_record", status);
- X break;
- X `7D
- X if (hptr)
- X hptr = hptr->next = XtNew(held_ident);
- X else
- X held_list = hptr = XtNew(held_ident);
- X hptr->next = NULL;
- X hptr->identifier = resid;
- X hptr->status = original;
- X status = sys$idtoasc(resid, &namlen, &name_dsc, 0, 0, 0);
- X nambuf`5Bnamlen`5D = '\0';
- X hptr->name = XtNewString(nambuf);
- X `7D
- X `7D
- X
- X uafdata`5BUAI$_PWD`5D.sdata`5B0`5D = '\0'; /* discard password for Wr
- Vite()*/
- X
- X update_strings(); /* update the string widgets */
- X update_flags(); /* update the flag toggle button widgets */
- X update_prime(); /* update the primary days and time widgets */
- X update_privs(); /* update the privs toggle button widgets */
- X update_held(); /* update the list of held identifiers */
- X
- X if (strlen(acct)) `7B
- X sprintf(text, "%s\n%s", TITLE, acct);
- X XtSetArg(arg`5B0`5D, XmNiconName, text);
- X XtSetValues(toplevel, arg, 1); /* update the icon name */
- X `7D
- X return TRUE;
- X`7D
- X
- X
- X/*
- X * Find all UAI elements that have (text) widgets and update them
- X */
- X
- Xstatic void update_strings()
- X`7B
- X Cardinal ind, value, status;
- X ushort length;
- X char str`5BSDATA_LEN`5D, *ptr;
- X Arg arg`5B1`5D;
- X XmString xmstr;
- X
- X setting_widgets = TRUE;
- X for (ind = 0; value = items`5Bind`5D.code; ind++)
- X if (widget_array`5Bvalue`5D)
- X switch (items`5Bind`5D.type) `7B
- X case DWP_LALPHA: /* string with length byte */
- X /* can't use unpad() because owner field contains spaces */
- X length = (ushort) uafdata`5Bvalue`5D.sdata`5B0`5D;
- X uafdata`5Bvalue`5D.sdata`5Blength+1`5D = '\0';
- X XmTextSetString(widget_array`5Bvalue`5D,
- X &uafdata`5Bvalue`5D.sdata`5B1`5D);
- X break;
- X case DWP_ALPHA: /* string (username, account) */
- X XmTextSetString(widget_array`5Bvalue`5D,
- X unpad(uafdata`5Bvalue`5D.sdata));
- X break;
- X case DWP_ENCR: /* password */
- X XmTextSetString(widget_array`5Bvalue`5D, ""); /* clear fiel
- Vd */
- X break;
- X case DWP_DATE: /* text date */
- X `7B
- X $DESCRIPTOR(time_dsc, str);
- X
- X sys$asctim(&length, &time_dsc, uafdata`5Bvalue`5D.sdata, 0);
- X str`5Blength`5D = '\0';
- X ptr = strstr(str, ":00.00");
- X if (ptr) *ptr = '\0';
- X if (!strncmp(str, "17-NOV-1858", 11))
- X strcpy(str,"(none)"); /* handle 'none' */
- X XmTextSetString(widget_array`5Bvalue`5D, str);
- X break;
- X `7D
- X case DWP_RDATE: /* label date */
- X `7B
- X $DESCRIPTOR(time_dsc, str);
- X
- X sys$asctim(&length, &time_dsc, uafdata`5Bvalue`5D.sdata, 0);
- X str`5Blength`5D = '\0';
- X ptr = strrchr(str, ':');
- X if (ptr) *ptr = '\0'; /* chop off :ss.cc */
- X if (!strncmp(str, "17-NOV-1858", 11))
- X strcpy(str,"(none)"); /* handle 'none' */
- X xmstr = XmStringCreateSimple(str);
- X XtSetArg(arg`5B0`5D, XmNlabelString, xmstr);
- X XtSetValues(widget_array`5Bvalue`5D, arg, 1);
- X XmStringFree(xmstr);
- X break;
- X `7D
- X case DWP_CPU: /* CPU time */
- X if (!uafdata`5Bvalue`5D.idata)
- X strcpy(str, "(none)");
- X else `7B
- X Cardinal dd, hh, mm, ss, cc, time = uafdata`5Bvalue`5D.i
- Vdata;
- X
- X dd = time / 8640000;
- X time -= dd * 8640000;
- X hh = time / 360000;
- X time -= hh * 360000;
- X mm = time / 6000;
- X time -= mm * 6000;
- X ss = time / 100;
- X time -= ss * 100;
- X cc = time;
- X sprintf(str, "%d %02d:%02d:%02d.%02d",
- X dd, hh, mm, ss, cc);
- X `7D
- X XmTextSetString(widget_array`5Bvalue`5D, str);
- X break;
- X case DWP_UIC: /* UIC */
- X sprintf(uafdata`5Bvalue`5D.sdata, "`5B%o,%o`5D",
- X uafdata`5Bvalue`5D.idata >> 16,
- X uafdata`5Bvalue`5D.idata & 0xFFFF);
- X XmTextSetString(widget_array`5Bvalue`5D,
- X uafdata`5Bvalue`5D.sdata);
- X trans_uic(uafdata`5Bvalue`5D.idata);
- X break;
- X case DWP_INT: /* text integer */
- X sprintf(str, "%d", uafdata`5Bvalue`5D.idata);
- X XmTextSetString(widget_array`5Bvalue`5D, str);
- X break;
- X case DWP_RINT: /* label integer */
- X sprintf(str, "%d", uafdata`5Bvalue`5D.idata);
- X xmstr = XmStringCreateSimple(str);
- X XtSetArg(arg`5B0`5D, XmNlabelString, xmstr);
- X XtSetValues(widget_array`5Bvalue`5D, arg, 1);
- X XmStringFree(xmstr);
- X break;
- X `7D
- X setting_widgets = FALSE;
- X`7D
- X
- X
- X/*
- X * Update login flags toggle buttons according to UAI data
- X */
- X
- Xstatic void update_flags()
- X`7B
- X Cardinal ind;
- X Boolean notify = NO;
- X
- X setting_flags = TRUE;
- X for (ind = 0; ind < MAX_FLAGS; ind++)
- X if (flags_array`5Bind`5D)
- X if (uafdata`5BUAI$_FLAGS`5D.idata >> ind & 1)
- X XmToggleButtonSetState(flags_array`5Bind`5D, ON, notify);
- X else
- X XmToggleButtonSetState(flags_array`5Bind`5D, OFF, notify);
- X setting_flags = FALSE;
- X`7D
- X
- X
- X/*
- X * Set the buttons to reflect primedays
- X * Set the time map window widgets
- X */
- X
- Xstatic void update_prime()
- X`7B
- X Cardinal ind;
- X Boolean notify = NO;
- X
- X setting_prime = TRUE;
- X for (ind = 0; ind < MAX_PRIME; ind++)
- X if (prime_array`5Bind`5D)
- X XmToggleButtonSetState(prime_array`5Bind`5D,
- X uafdata`5BUAI$_PRIMEDAYS`5D.idata >> ind & 1 `5E 1, notify);
- X setting_prime = FALSE;
- X
- X update_time(UAI$_NETWORK_ACCESS_P);
- X update_time(UAI$_NETWORK_ACCESS_S);
- X update_time(UAI$_BATCH_ACCESS_P);
- X update_time(UAI$_BATCH_ACCESS_S);
- X update_time(UAI$_LOCAL_ACCESS_P);
- X update_time(UAI$_LOCAL_ACCESS_S);
- X update_time(UAI$_DIALUP_ACCESS_P);
- X update_time(UAI$_DIALUP_ACCESS_S);
- X update_time(UAI$_REMOTE_ACCESS_P);
- X update_time(UAI$_REMOTE_ACCESS_S);
- X`7D
- X
- X
- X/*
- X * Set the priv buttons to reflect auth priv & default priv
- X * the buttons for default privs 0-38 are kept in privs_array`5B0-38`5D
- X * the buttons for auth privs 0-38 are kept in privs_array`5B40-78`5D
- X * (PRIVS_BIAS is 40)
- X */
- X
- Xstatic void update_privs()
- X`7B
- X Cardinal ind;
- X Boolean notify = NO;
- X
- X setting_privs = TRUE;
- X for (ind = 0; ind < MAX_PRIVS/2; ind++)
- X if (privs_array`5Bind`5D)
- X if (uafdata`5BUAI$_PRIV`5D.sdata`5Bind >> 3`5D >> (ind & 7) & 1)
- X XmToggleButtonSetState(privs_array`5Bind`5D, ON, notify);
- X else
- X XmToggleButtonSetState(privs_array`5Bind`5D, OFF, notify);
- X
- X for (ind = PRIVS_BIAS; ind < MAX_PRIVS; ind++)
- X if (privs_array`5Bind`5D)
- X if (uafdata`5BUAI$_DEF_PRIV`5D.sdata`5Bind - PRIVS_BIAS >> 3`5D
- V >>
- X (ind - PRIVS_BIAS & 7) & 1)
- X XmToggleButtonSetState(privs_array`5Bind`5D, ON, notify);
- X else
- X XmToggleButtonSetState(privs_array`5Bind`5D, OFF, notify);
- X setting_privs = FALSE;
- X`7D `20
- X
- X
- X/*
- X * Update a time map window widget
- X */
- X
- Xstatic void update_time(Cardinal code)
- X`7B
- X Cardinal ind;
- X Display *display;
- X Window window;
- X
- X if (!widget_array`5Bcode`5D) return; /* return if no widget */
- X
- X display = XtDisplay(widget_array`5Bcode`5D); /* get display for XFill *
- V/
- X window = XtWindow(widget_array`5Bcode`5D); /* get window for XFill */
- X if (!window) return; /* Just paranoia? */
- X
- X switch (uafdata`5Bcode`5D.idata) `7B /* speed up special case
- Vs */
- X case 0: /* full access */
- X XFillRectangle(display, window, gc_draw,
- X 0, 0, resource_data.hour_size * 24, k_hours_height);
- X break;
- X case 0xFFFFFF: /* no access */
- X XFillRectangle(display, window, gc_clear,
- X 0, 0, resource_data.hour_size * 24, k_hours_height);
- X break;
- X default:
- X XFillRectangle(display, window, gc_draw,
- X 0, 0, resource_data.hour_size * 24, k_hours_height);
- X for (ind = 0; ind < 24; ind++)
- X if (uafdata`5Bcode`5D.idata >> ind & 1)
- X XFillRectangle(display, window, gc_clear,
- X ind * resource_data.hour_size, 0,
- X resource_data.hour_size, k_hours_height);
- X `7D
- X`7D
- X
- X
- X/*
- X * Update the list of held identifiers
- X */
- X
- Xstatic void update_held()
- X`7B
- X Cardinal status, ac, ind, entries, position;
- X Boolean already_granted;
- X Arg arglist`5B5`5D;
- X ident *ptr;
- X held_ident *hptr;
- X XmString *items;
- X
- X /* quit if the idents box is not there, or still building ident_list */
- X if (!idents_box `7C`7C !XtIsManaged(idents_box) `7C`7C idents_work_proc_
- Vid)
- X return;
- X
- X items = (XmString *)XtCalloc(ident_count, sizeof(XmString));
- X
- X /* show the held idents list */
- X for (hptr = held_list, ind = 0; hptr; hptr = hptr->next)
- X if (hptr->status == original `7C`7C hptr->status == add_ident)
- X items`5Bind++`5D = XmStringCreateSimple(hptr->name);
- X entries = ind; /* save count of list entries */
- X if (ind > ident_count)
- X XtAppError(context, "held ident array overflow in update_held()");
- X /* The Motif FAQ says that this will free memory used by the old list */
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNitems, items); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNitemCount, ind); ac++;
- X XtSetValues(widget_array`5Bk_widget_held_list`5D, arglist, ac);
- X for (ind = 0; ind < entries; ind++)
- X XmStringFree(items`5Bind`5D);
- X
- X /* show all the non-uic idents not already held */
- X for (ptr = ident_list, ind = 0; ptr; ptr = ptr->next)
- X if (ptr->status == user_ident) `7B
- X already_granted = FALSE;
- X for (hptr = held_list; hptr; hptr = hptr->next)
- X already_granted `7C= (hptr->identifier == ptr->identifier) &
- V&
- X (hptr->status != del_orig);
- X if (!already_granted) `7B /* if user doesn't already have id */
- X if (!strcmp(ptr->name, resource_data.default_ident))
- X position = ind;
- X items`5Bind++`5D = XmStringCreateSimple(ptr->name);
- X `7D
- X `7D
- X entries = ind; /* save count of list entries */
- X if (ind > ident_count)
- X XtAppError(context, "all ident array overflow in update_held()");
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNitems, items); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNitemCount, ind); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNtopItemPosition, position + 1); ac++;
- X XtSetValues(widget_array`5Bk_widget_all_list`5D, arglist, ac);
- X for (ind = 0; ind < entries; ind++)
- X XmStringFree(items`5Bind`5D);
- X
- X XtFree(items);
- X`7D
- X
- X
- X/*
- X * Force text to uppercase
- X * Called by WidgetChanged, AccountChanged
- X */
- X
- Xstatic void uppercase(String str)
- X`7B
- X String str2;
- X
- X for (str2 = str; *str2; str2++)
- X *str2 = toupper(*str2);
- X`7D
- X `20
- X
- X/*
- X * Remove trailing blanks from a DWP_LALPHA data item
- X * Returns the address of the string
- X */
- X
- Xstatic String unpad(String alpha)
- X`7B
- X String ptr;
- X
- X ptr = strchr(alpha, ' ');
- X if (ptr) *ptr = '\0'; /* if there is a trailing space, trim it */
- X if ((Cardinal) alpha`5B0`5D < 32)
- X return alpha + 1; /* if there is a length byte, return the start of
- V the string */
- X else
- X return alpha;
- X`7D
- X
- X
- X/*
- X * Signal a local error
- X * Interval = -2 means don't do anything
- X * -1 means just printf to stdout
- X * 0 means popup message box without timeout
- X * > 0 means popup message box with timeout in 'interval' ms
- X */
- X
- Xstatic void DWPerror(String where, String what, int interval)
- X`7B
- X Cardinal ac;
- X Arg arglist`5B5`5D;
- X char msg`5B100`5D;
- X XmString xmstr;
- X static Widget message_box = NULL;
- X
- X if (interval == -2)
- X return;
- X if (interval == -1) `7B
- X printf("%s (From: %s)\n", what, where);
- X return;
- X `7D
- X if (!message_box) `7B
- X ac = 0;
- X xmstr = XmStringCreateSimple("DWProfile: Warning Message");
- X XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
- X`09message_box = XmCreateMessageDialog(dwprofile_main, "message_box", arglis
- Vt, ac);
- X XmStringFree(xmstr);
- X XtUnmanageChild(XmMessageBoxGetChild(message_box, XmDIALOG_HELP_BUTT
- VON));
- X XtUnmanageChild(XmMessageBoxGetChild(message_box, XmDIALOG_CANCEL_BU
- VTTON));
- X`09XtAddCallback(message_box, XmNokCallback, MessageCallback, NULL);
- X `7D
- X ac = 0;
- X sprintf(msg, "%s\nFrom: %s", what, where);
- X xmstr = XmStringCreateLtoR(msg,XmSTRING_DEFAULT_CHARSET);
- X XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
- X XtSetValues(message_box, arglist, ac);
- X XmStringFree(xmstr);
- X XtManageChild(message_box); /* popup message box */
- X if (interval)
- X timeout_id = XtAppAddTimeOut(context, interval, MessageCallback, mes
- Vsage_box);
- X XFlush(top_display);
- X`7D
- X
- X
- X/*
- X * Signal an external error
- X */
- X
- Xstatic void DWPmsg(String where, Cardinal msg)
- X`7B
- X char buffer`5B100`5D;
- X Cardinal status;
- X ushort length;
- X $DESCRIPTOR(txt_dsc, buffer);
- X
- X status = sys$getmsg(msg, &length, &txt_dsc, 0, 0);
- X buffer`5Blength`5D = '\0';
- X if ((status & 7) == SS$_NORMAL)
- X DWPerror(where, buffer, 0);
- X else
- X DWPerror(where, "Unknown", 0);
- X`7D
- X
- X
- X/*
- X * Do a DCL command
- X * Called by Write
- X */
- X
- Xstatic void spawn_dcl(String str)
- X`7B
- X Cardinal status, substatus = SS$_NORMAL, flags = CLI$M_NOCLISYM, /* `7C
- V CLI$M_NOLOGNAM */
- X devlen, ctx, count = 0;
- X char *cptr, dev1`5B40`5D = "", dev2`5B40`5D, dir`5B40`5D, result`5B40`5D
- V, filespec`5B40`5D;
- X ident *iptr, *prev;
- X FILE *file;
- X $DESCRIPTOR(dcl_dsc, "DCL.TMP");
- X#ifdef DEBUG
- X $DESCRIPTOR(out_dsc, "TT:");
- X#else
- X $DESCRIPTOR(out_dsc, "NL:"); /* change to TT: for debugging command fil
- Ves */
- X#endif
- X $DESCRIPTOR(dev1_dsc, dev1);
- X $DESCRIPTOR(dev2_dsc, dev2);
- X $DESCRIPTOR(res_dsc, result);
- X $DESCRIPTOR(file_dsc, filespec);
- X Boolean remove_command = !strncmp(str, "$ UAF REMOVE", 12);
- X Boolean modify_uic = strstr(str, "$ UAF MODIFY") && strstr(str, "/UIC");
- X
- X#ifdef DEBUG
- X printf("spawn_dcl(%s)\n", str);
- X#endif
- X
- X /* set up dev1, dev2, dir */
- X /* if from getuai, it has a length byte; if from text widget, not */
- X strcpy(dev1, unpad(uafdata`5BUAI$_DEFDEV`5D.sdata));
- X if (dev1`5Bstrlen(dev1) - 1`5D == ':')
- X dev1`5Bstrlen(dev1) - 1`5D = '\0'; /* strip off trailing ':' */
- X dev1_dsc.dsc$w_length = strlen(dev1);
- X status = lib$sys_trnlog(&dev1_dsc, &devlen, &dev2_dsc, 0, 0, 0);
- X cptr = strchr(dev2, ' ');
- X if (cptr) *cptr = '\0'; /* null terminate */
- X cptr = strchr(dev2, ':');
- X if (cptr) *cptr = '\0'; /* physical device without ':' */
- X strcpy(dir, unpad(uafdata`5BUAI$_DEFDIR`5D.sdata));
- X if (dir`5B0`5D == '`5B')
- X strcpy(dir, dir + 1); /* strip off `5B */
- X if (dir`5Bstrlen(dir) - 1`5D == '`5D')
- X dir`5Bstrlen(dir) - 1`5D = '\0'; /* strip off `5D */
- X
- X file = fopen("DCL.TMP","w");
- X#ifdef DEBUG
- X fprintf(file, "$ SET VERIFY\n");
- X fprintf(file, "$ SHOW LOGICAL DWPUID\n");
- X#endif `20
- X fprintf(file, "$ DELETE DCL.TMP;*\n");
- X fprintf(file, "$ PREVPRIV = F$SETPRV(\"ALL\")\n");
- X fprintf(file, "$ DEFINE/USER SYSUAF SYS$SYSTEM:SYSUAF\n");
- X fprintf(file, "$ UAF :== $AUTHORIZE\n");
- X fprintf(file, "%s\n", str);
- X
- X /* if the command is REMOVE, delete mail profile */
- X if (remove_command) `7B
- X fprintf(file, "$ MAIL\n");
- X fprintf(file, "%s\n", str);
- X fprintf(file, "EXIT\n");
- X `7D
- X
- X /* if the command is REMOVE, delete disk files and directory */
- X if (remove_command && strlen(dev1) && strlen(dir))
- X fprintf(file, "$ @DWPUID:DELTREE %s:`5B%s`5D\n", dev1, dir);
- X
- X /* add the quota and overdraft resources.
- X The default (0) is to do nothing, i.e. use the `5Bgroup,0`5D entry
- X in quota.sys. Set the resources 'quota' and 'overdraft' to use
- X a fixed quota
- X */
- X /* if defdev exists and a fixed disk quota specified */
- X if (strlen(dev1) && (resource_data.quota)) `7B
- X sprintf(filespec, "%s:`5B000000`5DQUOTA.SYS", dev2);
- X file_dsc.dsc$w_length = strlen(filespec);
- X ctx = 0;
- X status = lib$find_file(&file_dsc, &res_dsc, &ctx, 0, 0, 0, 0);
- X lib$find_file_end(&ctx);
- X if ((status & 7) == SS$_NORMAL) `7B /* QUOTA.SYS exists */
- X fprintf(file, "$ RUN SYS$SYSTEM:DISKQUOTA\n");
- X fprintf(file, "USE %s\n", dev2);
- X if (remove_command)
- X fprintf(file, "REMOVE %s\n", uafdata`5BUAI$_UIC`5D.sdata);
- X else
- X fprintf(file, "ADD %s /PERMQUOTA=%d /OVERDRAFT=%d\n",
- X uafdata`5BUAI$_UIC`5D.sdata, resource_data.quota,
- X resource_data.overdraft);
- X fprintf(file, "EXIT\n");
- X `7D
- X `7D `20
- X fclose(file);
- X status = lib$spawn(0, &dcl_dsc, &out_dsc, &flags, 0, 0, &substatus, 0, 0
- V, 0, 0, 0);
- X if ((substatus & 7) != SS$_NORMAL) /* probably CLI$_NORMAL */
- X DWPmsg("Spawned process status", substatus);
- X if (status != SS$_NORMAL)
- X DWPmsg("Spawn_DCL", status);
- X
- X if (!remove_command && strlen(dev1) && strlen(dir)) `7B
- X sprintf(filespec, "%s:`5B000000`5D%s.DIR", dev1, dir);
- X file_dsc.dsc$w_length = strlen(filespec);
- X ctx = 0;
- X status = lib$find_file(&file_dsc, &res_dsc, &ctx, 0, 0, 0, 0);
- X lib$find_file_end(&ctx);
- X filespec`5B0`5D == '\0';
- X if (status == RMS$_FNF) `7B
- X/* setpriv(ON, PRV$M_BYPASS `7C PRV$M_EXQUOTA `7C PRV$M_SYSPRV); */
- X sprintf(filespec, "%s:`5B%s`5D", dev1, dir);
- X file_dsc.dsc$w_length = strlen(filespec);
- X if (strlen(filespec)) `7B
- X status = lib$create_dir(&file_dsc, &uafdata`5BUAI$_UIC`5D.id
- Vata, 0, 0,
- X &resource_data.version_limit, 0);
- X#ifdef DEBUG
- X printf("create_dir %s status = %d\n", filespec, status);
- X#endif
- X if (status != SS$_CREATED)
- X DWPmsg("Create Dir", status);
- X `7D
- X `7D
- X `7D
- X
- X /* If REMOVE, remove identifier from ident_list */
- X if (remove_command `7C`7C modify_uic) `7B
- X for (iptr = ident_list, prev = NULL; iptr; prev = iptr, iptr = iptr-
- V>next)
- X if (!strcmp(iptr->name, uafdata`5BUAI$_USERNAME`5D.sdata)) break
- V;
- X if (iptr) `7B
- X if (prev)
- X prev->next = iptr->next;
- X else
- X ident_list = iptr->next;
- X XtFree(iptr->name);
- X XtFree(iptr);
- X uic_count--;
- X `7D
- X /* identifier may still be on found_list */
- X for (iptr = found_list.next, prev = &found_list; iptr; prev = iptr,
- V iptr = iptr->next)
- X if (!strcmp(iptr->name, uafdata`5BUAI$_USERNAME`5D.sdata)) break
- V;
- X if (iptr) `7B
- X prev->next = iptr->next;
- X XtFree(iptr->name);
- X XtFree(iptr);
- X if (iptr == found_ptr)
- X found_ptr = prev;
- X if (iptr == found_add)
- X found_add = prev;
- X `7D
- X /* remove group identifier if no other uic in group */
- X for (iptr = ident_list; iptr; iptr = iptr->next)
- X if ((iptr->identifier >> 16) == (uafdata`5BUAI$_UIC`5D.idata >>
- V 16))
- X count++;
- X if (count == 1) `7B
- X for (iptr = ident_list, prev = NULL; iptr; prev = iptr, iptr = i
- Vptr->next)
- X if (iptr->identifier == (uafdata`5BUAI$_UIC`5D.idata `7C 0xF
- VFFF)) break;
- X if (iptr) `7B
- X if (prev)
- X prev->next = iptr->next;
- X else
- X ident_list = iptr->next;
- X XtFree(iptr->name);
- X XtFree(iptr);
- X account_count--;
- X `7D
- X `7D
- X if (accounts_box && XtIsManaged(accounts_box)) `7B
- X XtUnmanageChild(accounts_box);
- X Accounts(NULL, NULL, NULL); /* reload accounts select box */
- X `7D
- X `7D
- X`7D
- X
- X
- X/*
- X * Calculate the next available UIC in the group that matches the account
- X * or finds the next available group if there is no match
- X * Updates the UIC widget and uafdata fields.
- X * Called when an account is selected via selector widget or from return_ke
- Vy
- X * when in the account text widget
- X */
- X
- Xstatic void calc_uic()
- X`7B
- X Cardinal status, maxgroup = resource_data.minimum_group,
- X groupid = 0, uic = 0;
- X ushort length;
- X ident *ptr;
- X $DESCRIPTOR(group_dsc, uafdata`5BUAI$_ACCOUNT`5D.sdata);
- X `20
- X /* read in text widget */
- X if (!parse_uic(UAI$_UIC))
- X DWPerror("calc_uic","Illegal UIC format", 0);
- X if (uafdata`5BUAI$_UIC`5D.idata) return; /* don't recalc if UIC exist
- Vs */
- X read_identifiers(FALSE);
- X group_dsc.dsc$w_length = strlen(uafdata`5BUAI$_ACCOUNT`5D.sdata);
- X status = sys$asctoid(&group_dsc, &groupid, 0);
- X for (ptr = ident_list; ptr; ptr = ptr->next) `7B
- X /* if groups match and not in `5Bn,*`5D and higher than old uic, sav
- Ve it */
- X if (((ptr->identifier >> 16) == (groupid >> 16)) &&
- X ((ptr->identifier & 0xFFFF) != 0xFFFF))
- X uic = (ptr->identifier > uic) ? ptr->identifier : uic;
- X /* if this is a new group name, remember highest `5Bn,*`5D ident */
- X if (!groupid &&
- X (ptr->identifier < 0x80000000) &&
- X (ptr->identifier < (resource_data.maximum_group << 16)) &&
- X (ptr->identifier > maxgroup))
- X maxgroup = ptr->identifier;
- X `7D
- X if (!groupid) /* new group name */
- X groupid = maxgroup + 0x10000; /* highest group + 1 */
- X if (!uic) /* if only `5Bx,177777`5D in UAF, give `5Bx,101`5D as uic *
- V/
- X uic = (groupid & 0x7FFF0000) + 0100;
- X uafdata`5BUAI$_UIC`5D.idata = ++uic;
- X sprintf(uafdata`5BUAI$_UIC`5D.sdata, "`5B%o,%o`5D", uic >> 16, uic & 0xF
- VFFF);
- X XmTextSetString(widget_array`5BUAI$_UIC`5D, uafdata`5BUAI$_UIC`5D.sdata)
- V;
- X`7D
- X
- X
- X/*
- X * Translate UIC to identifier format, if identifiers are loaded
- X * Called by update_strings, return key in Account widget, and Accounts sel
- Vector
- X */
- X
- Xstatic void trans_uic(Cardinal uic)
- X`7B
- X ident *ptr;
- X char group`5B32`5D = "", member`5B32`5D = "", suic`5B32`5D;
- X Arg arg`5B1`5D;
- X XmString xmstr;
- X
- X for (ptr = ident_list; ptr; ptr = ptr->next)
- X if (ptr->identifier == uic)
- X strcpy(member, ptr->name);
- X else if (ptr->identifier == (uic & 0x7FFF0000 `7C 0xFFFF))
- X strcpy(group, ptr->name);
- X if (member`5B0`5D)
- X if (group`5B0`5D)
- X sprintf(suic, "(`5B%s,%s`5D)", group, member);
- X else
- X sprintf(suic, "(`5B%s`5D)", member);
- X else
- X sprintf(suic, "(`5B%o,%o`5D)", uic >> 16, uic & 0xFFFF);
- X
- X xmstr = XmStringCreateSimple(suic);
- X XtSetArg(arg`5B0`5D, XmNlabelString, xmstr);
- X XtSetValues(widget_array`5Bk_widget_uic_trans`5D, arg, 1);
- X XmStringFree(xmstr);
- X`7D
- X `20
- X
- X/*
- X * Close the work_box dialog box
- X */
- X
- Xstatic void close_work_box()
- X`7B
- X if (XtIsManaged(work_box))
- X XtUnmanageChild(work_box);
- X XUndefineCursor(top_display, top_window);
- X`7D
- X
- X
- X/*
- X * WorkProc to put one identifier on the idents list
- X */
- X
- Xstatic Boolean idents_work_proc(XtPointer data)
- X`7B
- X Cardinal status, resid, ac = 0, pct;
- X static int id, count, rdbctx;
- X Arg arglist`5B5`5D;
- X ushort namlen;
- X XmString xmstr;
- X char idbuf`5B35`5D, str`5B30`5D;
- X Pixmap gague_pixmap;
- X char gague`5B100`5D;
- X $DESCRIPTOR(name_dsc, idbuf);
- X
- X if (!ident_ptr) `7B /* init count, id, context on first & subsequent ca
- Vlls */
- X count = 0;
- X id = -1;
- X sys$finish_rdb(&rdbctx);
- X `7D
- X count++;
- X if (((count % 100) == 0) && (count >= 200)) `7B
- X sprintf(str, "Reading identifier %d", count);
- X ac = 0;
- X xmstr = XmStringCreateSimple(str);
- X XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
- X XtSetValues(work_box, arglist, ac);
- X XmStringFree(xmstr);
- X `7D
- X
- X status = sys$idtoasc(id, &namlen, &name_dsc, &resid, 0, &rdbctx);
- X if (status == SS$_NOSUCHID) `7B
- X close_work_box();
- X idents_work_proc_id = (XtWorkProcId) 0;
- X build_accounts();
- X update_held();
- X return TRUE;
- X `7D
- X if (status != SS$_NORMAL) `7B
- X sys$finish_rdb(&rdbctx);
- X DWPmsg("read_identifiers", status);
- X close_work_box();
- X idents_work_proc_id = (XtWorkProcId) 0;
- X return TRUE;
- X `7D
- X if (ident_ptr)
- X ident_ptr = ident_ptr->next = XtNew(ident);
- X else
- X ident_list = ident_ptr = XtNew(ident);
- X idbuf`5Bnamlen`5D = '\0';
- X ident_ptr->name = XtNewString(idbuf);
- X ident_ptr->next = NULL;
- X ident_ptr->identifier = resid;
- X if ((resid > 0x80010000) && /* if not VMS defined idents */
- X strncmp(idbuf, "SYS$NODE", 8)) `7B /* and not SYS$NODE_xxx */
- X ident_ptr->status = user_ident; /* it's a regular ident */
- X ident_count++;
- X `7D
- X else if (resid > 0x80000000) /* if a non-uic ident and not a user ident
- V */
- X ident_ptr->status = intern_ident; /* it's a internal ident */
- X else if ((resid & 0xFFFF) == 0xFFFF) `7B
- X ident_ptr->status = account; /* accounts end in FFFF */
- X account_count++;
- X `7D
- X else `7B
- X ident_ptr->status = uic_ident;
- X uic_count++;
- X `7D
- X return FALSE;
- X`7D
- X
- X
- X/*
- X * Build list of identifiers if list is empty or if 'force' true
- X */
- X
- Xstatic void read_identifiers(Boolean force)
- X`7B
- X Cardinal ac;
- X Arg arglist`5B10`5D;
- X XmString xmstr;
- X ident *ptr, *tptr;
- X
- X if (!idents_work_proc_id && (!ident_list `7C`7C force)) `7B
- X if (!work_box) `7B
- X ac = 0;
- X XtSetArg(arglist`5Bac`5D, XmNheight, 120); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNwidth, 220); ac++;
- X XtSetArg(arglist`5Bac`5D, XmNresizePolicy, XmRESIZE_NONE); ac++;
- X xmstr = XmStringCreateSimple("DWProfile: Reading Identifiers");
- X XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
- X work_box = XmCreateWorkingDialog(dwprofile_main, "work_box", arg
- Vlist, ac);
- X XmStringFree(xmstr);
- X XtUnmanageChild(XmMessageBoxGetChild(work_box, XmDIALOG_OK_BUTTO
- VN));
- X XtUnmanageChild(XmMessageBoxGetChild(work_box, XmDIALOG_HELP_BUT
- VTON));
- X XtAddCallback(work_box, XmNcancelCallback, IdentsCancelCallback,
- V NULL);
- X `7D
- X ac = 0;
- X xmstr = XmStringCreateSimple("Reading identifiers");
- X XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
- X XtSetValues(work_box, arglist, ac);
- X XmStringFree(xmstr);
- X if (resource_data.show_work && !XtIsManaged(work_box))
- X XtManageChild(work_box); /* pop up work box */
- X
- X for (ptr = ident_list; ptr;) `7B /* free old ident list */
- X XtFree(ptr->name);
- X tptr = ptr;
- X ptr = ptr->next;
- X XtFree(tptr);
- X `7D
- X ident_list = ident_ptr = select_ptr = NULL;
- X account_count = uic_count = ident_count = 0;
- X idents_work_proc_id = XtAppAddWorkProc(context, idents_work_proc, NU
- VLL);
- X `7D
- X`7D
- X
- X
- X/*
- X * Check each uic identifier for match against select_string
- X * Update found_add (the end of found_list)
- X */
- X
- Xstatic Boolean find_work_proc(XtPointer data)
- X`7B
- X char message`5B80`5D, match_string`5B80`5D;
- X Boolean matched;
- X Cardinal status, uic;
- X ushort length, logfails;
- X String sptr;
- X struct dsc$descriptor_s ident_dsc = `7B 0, DSC$K_DTYPE_T, DSC$K_CLASS_S,
- V NULL `7D;
- X $DESCRIPTOR(select_dsc, select_string);
- X $DESCRIPTOR(match_dsc, match_string);
- X
- X select_dsc.dsc$w_length = strlen(select_string);
- X if (!ident_list) `7B /* No idents read, this is bad and shouldn't hap
- Vpen */
- X find_work_proc_id = (XtWorkProcId) 0;
- X return TRUE;
- X `7D
- X if (!select_ptr) /* select_ptr is the workproc control variable */
- X select_ptr = ident_list;
- X if (select_ptr->status != uic_ident) `7B
- X select_ptr = select_ptr->next; /* only look at uic type idents */
- X return FALSE;
- X `7D
- X ident_dsc.dsc$a_pointer = select_ptr->name;
- +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-
-