/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $TOG: ModAttr.c /main/11 1999/12/09 13:07:05 mgreess $ */ /************************************<+>************************************* **************************************************************************** * * FILE: ModAttr.c * * COMPONENT_NAME: Desktop File Manager (dtfile) * * Description: Source file for the modify file attributes dialog. * * FUNCTIONS: Create * Destroy * FreeValues * GetDefaultValues * GetModAttrValues * GetResourceValues * GetValues * InstallChange * InstallClose * InvalidModAttrMessage * LoadFileAttributes * OkCallback * SetValues * WriteResourceValues * _LoadFileAttributes * displayFSDialog * * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company * (c) Copyright 1993, 1994, 1995 International Business Machines Corp. * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc. * (c) Copyright 1993, 1994, 1995 Novell, Inc. * **************************************************************************** ************************************<+>*************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
#include
#include
#include
#include
#include
#include #include #include #include
#include
#include #include "Encaps.h" #include "SharedProcs.h" #include "FileMgr.h" #include "Desktop.h" #include "Main.h" #include "Common.h" #include "ModAttr.h" #include "Help.h" #ifndef CDE_INSTALLATION_TOP #define CDE_INSTALLATION_TOP "/usr/dt" #endif /* Error message defines */ #define UNKNOWN_USER 0 #define UNKNOWN_GROUP 1 /* Field defines */ #define HOST 0x01 #define DIR 0x02 #define NAME 0x04 #define FILETYPE 0x08 #define GROUP 0x10 #define OWNER 0x20 #define BITS 0x40 #define SIZE 0x80 #define MODTIME 0x100 #define GMA_VALID 0 #define GMA_INVALID 1 #define GMA_NO_FILE 2 #define ALL_FIELDS HOST|DIR|NAME|FILETYPE|GROUP|OWNER|BITS|SIZE|MODTIME #define ALL_BUT_ACCESS HOST|DIR|NAME|FILETYPE|GROUP|OWNER|SIZE|MODTIME #define ALL_BUT_OWNER_GROUP_ACCESS HOST|DIR|NAME|FILETYPE|SIZE|MODTIME #define FM_TYPE_LABEL "TYPE_LABEL" static char * MODIFY_ATTR = "ModifyAttributes"; ModAttrApply *globalApplyData; char *parentDir; /* Resource definitions for the modify file attribute dialog */ static DialogResource resources[] = { { "host", XmRString, sizeof(String), XtOffset(ModAttrDataPtr, host), (XtPointer) NULL, _DtStringToString }, { "directory", XmRString, sizeof(String), XtOffset(ModAttrDataPtr, directory), (XtPointer) NULL, _DtStringToString }, { "name", XmRString, sizeof(String), XtOffset(ModAttrDataPtr, name), (XtPointer) NULL, _DtStringToString }, { "link_name", XmRString, sizeof(String), XtOffset(ModAttrDataPtr, link_name), (XtPointer) NULL, _DtStringToString }, { "access", XmRInt, sizeof(int), XtOffset(ModAttrDataPtr, accessBits), (XtPointer) 0, _DtIntToString }, }; /******** Static Function Declarations ********/ static void Create( Display *display, Widget parent, Widget *return_widget, XtPointer *dialog) ; static void InstallChange( ModAttrRec *modAttr_rec, XtCallbackProc callback, XtPointer client_data) ; static void InstallClose( ModAttrRec *modAttr_rec, XtCallbackProc callback, XtPointer client_data) ; static void Destroy( ModAttrRec *modAttr_rec) ; static XtPointer GetValues( ModAttrRec *modAttr_rec) ; static XtPointer GetDefaultValues( void ) ; static XtPointer GetResourceValues( XrmDatabase data_base, char **name_list) ; static void SetValues( ModAttrRec *modAttr_rec, ModAttrData *modAttr_data) ; static void WriteResourceValues( DialogData *values, int fd, char **name_list) ; static void FreeValues( ModAttrData *modAttr_data) ; static void OkCallback( Widget w, ModAttrApply *apply_data, XtPointer call_data) ; static short GetModAttrValues( ModAttrRec *modAttr_rec, ModAttrData *modAttr_data, Boolean validate) ; static void InvalidModAttrMessage( Widget w, int messageIndex) ; static Boolean _LoadFileAttributes( String host, String dir, String file, ModAttrData *modAttr_data, unsigned long mask) ; static void displayFSDialog( Widget w, dtFSData * fileSystem, XmPushButtonCallbackStruct * cbs); static void DontChangeCB( Widget w, XtPointer client_data, XtPointer call_data ); static void ChangeCB( Widget w, XtPointer client_data, XtPointer call_data ); /******** End Static Function Declarations ********/ /* * The Dialog Class structure. */ static DialogClass modAttrClassRec = { resources, XtNumber(resources), Create, (DialogInstallChangeProc) InstallChange, (DialogInstallCloseProc) InstallClose, (DialogDestroyProc) Destroy, (DialogGetValuesProc) GetValues, GetDefaultValues, GetResourceValues, (DialogSetValuesProc) SetValues, WriteResourceValues, (DialogFreeValuesProc) FreeValues, (DialogMapWindowProc) _DtGenericMapWindow, NULL, }; DialogClass * modAttrClass = (DialogClass *) &modAttrClassRec; /************************************************************************ * * Create * ************************************************************************/ static void Create( Display *display, Widget parent, Widget *return_widget, XtPointer *dialog ) { ModAttrRec * modAttr_rec; Widget shell, form, nameLabel, name; Widget link_label, link_name; Widget fileType, ownerLabel, owner; Widget groupLabel, group, permissionLabel, permissionForm; Widget ownerPLabel, groupPLabel, otherPLabel; Widget readLabel, writeLabel, executeLabel; Widget ownerRead, ownerWrite, ownerExecute; Widget groupRead, groupWrite, groupExecute; Widget otherRead, otherWrite, otherExecute; Widget fsPushButton, fsWarning; Widget sizeLabel, size; Widget modLabel, mod; Widget groupL, ownerL; Widget separator, ok, cancel, help; XmString label_string; XmString empty_label_string; Arg args[15]; int n; char * tmpStr; Dimension len[2]; int flag=FLAG_RESET; /* Allocate the modify file attributes dialog instance record. */ modAttr_rec = (ModAttrRec *) XtMalloc (sizeof (ModAttrRec)); /* Create the shell form used for the dialog. */ n = 0; XtSetArg (args[n], XmNmwmFunctions, MWM_FUNC_MOVE | MWM_FUNC_CLOSE); ++n; XtSetArg (args[n], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE); ++n; XtSetArg (args[n], XmNallowShellResize, True); ++n; shell = XmCreateDialogShell (parent, "file_properties", args, n); /* Set the useAsyncGeo on the shell */ XtSetArg (args[0], XmNuseAsyncGeometry, True); XtSetValues (XtParent(shell), args, 1); n = 0; XtSetArg (args[n], XmNshadowThickness, 1); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; XtSetArg (args[n], XmNautoUnmanage, False); n++; form = XmCreateForm (shell, "form", args, n); XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the field displaying the selected file name */ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21,30, "Name: "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; nameLabel = XmCreateLabelGadget (form, "file_name_label", args, n); XtManageChild (nameLabel); XmStringFree (label_string); XtAddCallback(nameLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, nameLabel); n++; XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; name = XmCreateLabelGadget (form, "file_name", args, n); XtManageChild (name); XtAddCallback(name, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the optional field displaying the symbolic link name */ label_string = XmStringCreateLocalized ((GETMESSAGE(21,18, "Is Linked To: "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, name); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; link_label= XmCreateLabelGadget (form, "link_name_label", args, n); XtManageChild (link_label); XmStringFree (label_string); XtAddCallback(link_label, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, link_label); n++; XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, name); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; link_name = XmCreateLabelGadget (form, "link_name", args, n); XtManageChild (link_name); XtAddCallback(link_name, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the field displaying the owner name and the group name*/ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 3, "Owner Name: "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, link_name); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; ownerLabel = XmCreateLabelGadget (form, "owner_name", args, n); XtManageChild (ownerLabel); XmStringFree (label_string); XtAddCallback(ownerLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 4, "Group Name: "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerLabel); n++; XtSetArg (args[n], XmNtopOffset, 22); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; groupLabel = XmCreateLabelGadget (form, "group_name", args, n); XtManageChild (groupLabel); XmStringFree (label_string); XtAddCallback(groupLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); XtSetArg (args[0], XmNwidth, &len[0]); XtGetValues(ownerLabel, args, 1); XtSetArg (args[0], XmNwidth, &len[1]); XtGetValues(groupLabel, args, 1); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; if(len[0] > len[1]) { XtSetArg (args[n], XmNleftWidget, ownerLabel); n++; } else { XtSetArg (args[n], XmNleftWidget, groupLabel); n++; } XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, link_name); n++; XtSetArg (args[n], XmNtopOffset, 8); n++; owner = XmCreateTextField (form, "owner_text", args, n); XtManageChild (owner); XtAddCallback(owner, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; if(len[0] > len[1]) { XtSetArg (args[n], XmNleftWidget, ownerLabel); n++; } else { XtSetArg (args[n], XmNleftWidget, groupLabel); n++; } XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; ownerL = XmCreateLabelGadget (form, "owner_textL", args, n); XtAddCallback(ownerL, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; if(len[0] > len[1]) { XtSetArg (args[n], XmNleftWidget, ownerLabel); n++; } else { XtSetArg (args[n], XmNleftWidget, groupLabel); n++; } XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerLabel); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; group = XmCreateTextField (form, "group_text", args, n); XtManageChild (group); XtAddCallback(group, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; if(len[0] > len[1]) { XtSetArg (args[n], XmNleftWidget, ownerLabel); n++; } else { XtSetArg (args[n], XmNleftWidget, groupLabel); n++; } XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; groupL = XmCreateLabelGadget (form, "group_textL", args, n); XtAddCallback(groupL, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the field displaying the file type info */ n = 0; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, link_name); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, owner); n++; XtSetArg (args[n], XmNleftOffset, 20); n++; XtSetArg (args[n], XmNshadowThickness, 2); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; XtSetArg (args[n], XmNhighlightThickness, 5); n++; XtSetArg (args[n], XmNmarginWidth, 4); n++; XtSetArg (args[n], XmNmarginHeight, 4); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; XtSetArg (args[n], XmNpixmapPosition, XmPIXMAP_TOP); n++; XtSetArg (args[n], XmNbehavior, XmICON_LABEL); n++; fileType = _DtCreateIcon (form, "file_type", args, n); XtManageChild (fileType); XtAddCallback(fileType, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the label for the permissions */ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 5, "Permissions:"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupLabel); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; permissionLabel = XmCreateLabelGadget (form, "permission_label", args, n); XtManageChild (permissionLabel); XmStringFree (label_string); XtAddCallback(permissionLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the box containing the permission settings */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 10); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightOffset, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, permissionLabel); n++; XtSetArg (args[n], XmNtopOffset, 3); n++; XtSetArg (args[n], XmNshadowThickness, 2); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_IN); n++; permissionForm = XmCreateForm (form, "permission_form", args, n); XtManageChild (permissionForm); XtAddCallback(permissionForm, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the labels and toggles for the permissions */ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 6, "Read"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 20); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 45); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; readLabel = XmCreateLabelGadget (permissionForm, "read_label", args, n); XtManageChild (readLabel); XmStringFree (label_string); XtAddCallback(readLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 7, "Write"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 45); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 70); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; writeLabel = XmCreateLabelGadget (permissionForm, "write_label", args, n); XtManageChild (writeLabel); XmStringFree (label_string); XtAddCallback(writeLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 8, "Execute"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 70); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 95); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; executeLabel = XmCreateLabelGadget(permissionForm, "execute_label", args, n); XtAddCallback(executeLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); XtManageChild (executeLabel); XmStringFree (label_string); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 9, "Owner:"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, readLabel); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; ownerPLabel = XmCreateLabelGadget (permissionForm, "owner_label", args, n); XtManageChild (ownerPLabel); XmStringFree (label_string); XtAddCallback(ownerPLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); empty_label_string = XmStringCreateLocalized (""); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 30); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, ownerPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; ownerRead = XmCreateToggleButtonGadget (permissionForm, "owner_read", args, n); XtManageChild (ownerRead); XtAddCallback(ownerRead, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 54); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, ownerPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; ownerWrite = XmCreateToggleButtonGadget (permissionForm, "owner_write", args, n); XtManageChild (ownerWrite); XtAddCallback(ownerWrite, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 78); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, ownerPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; ownerExecute = XmCreateToggleButtonGadget (permissionForm, "owner_execute", args, n); XtManageChild (ownerExecute); XtAddCallback(ownerExecute, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 10, "Group:"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, ownerPLabel); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; groupPLabel = XmCreateLabelGadget (permissionForm, "group_label", args, n); XtManageChild (groupPLabel); XmStringFree (label_string); XtAddCallback(groupPLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 30); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, groupPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; groupRead = XmCreateToggleButtonGadget (permissionForm, "group_read", args, n); XtManageChild (groupRead); XtAddCallback(groupRead, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 54); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, groupPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; groupWrite = XmCreateToggleButtonGadget (permissionForm, "group_write", args, n); XtManageChild (groupWrite); XtAddCallback(groupWrite, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 78); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, groupPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; groupExecute = XmCreateToggleButtonGadget (permissionForm, "group_execute", args, n); XtManageChild (groupExecute); XtAddCallback(groupExecute, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 11, "Other:"))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 5); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, groupPLabel); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 15); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; otherPLabel = XmCreateLabelGadget (permissionForm, "other_label", args, n); XtManageChild (otherPLabel); XmStringFree (label_string); XtAddCallback(otherPLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 30); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, otherPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; otherRead = XmCreateToggleButtonGadget (permissionForm, "other_read", args, n); XtManageChild (otherRead); XtAddCallback(otherRead, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 54); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, otherPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; otherWrite = XmCreateToggleButtonGadget (permissionForm, "other_write", args, n); XtManageChild (otherWrite); XtAddCallback(otherWrite, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, empty_label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 78); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 0); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg (args[n], XmNbottomWidget, otherPLabel); n++; XtSetArg (args[n], XmNshadowThickness, 0); n++; otherExecute = XmCreateToggleButtonGadget (permissionForm, "other_execute", args, n); XtManageChild (otherExecute); XmStringFree (empty_label_string); XtAddCallback(otherExecute, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the optional label and push button to invoke a file-system specific dialog */ /* Bottom and top attachments will be made when we know which of these widgets will be mannaged */ /* The callback will be registered in SetValues after the config file has been read */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 5); n++; fsWarning = XmCreateLabelGadget (permissionForm, "fs_warning_label", args, n); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 5); n++; fsPushButton = XmCreatePushButtonGadget (permissionForm, "fs_dialog_button", args, n); /* Create the field displaying the size */ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 12, "Size (in bytes): "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, permissionForm); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; sizeLabel = XmCreateLabelGadget (form, "size_label", args, n); XtManageChild (sizeLabel); XmStringFree (label_string); XtAddCallback(sizeLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, sizeLabel); n++; XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, permissionForm); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; size = XmCreateLabelGadget (form, "size", args, n); XtManageChild (size); XtAddCallback(size, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create the field displaying the modification time */ label_string = XmStringCreateLocalized (((char *) GETMESSAGE(21, 13, "Modified: "))); n = 0; XtSetArg (args[n], XmNlabelString, label_string); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, size); n++; XtSetArg (args[n], XmNleftOffset, 20); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, permissionForm); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; modLabel = XmCreateLabelGadget (form, "modify_date_label", args, n); XtManageChild (modLabel); XmStringFree (label_string); XtAddCallback(modLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftOffset, 0); n++; XtSetArg (args[n], XmNleftWidget, modLabel); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, permissionForm); n++; XtSetArg (args[n], XmNtopOffset, 10); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; mod = XmCreateLabelGadget (form, "modify_date", args, n); XtManageChild (mod); XtAddCallback(mod, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Create a separator between the buttons */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, sizeLabel); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; separator = XmCreateSeparatorGadget (form, "separator", args, n); XtManageChild (separator); /* Create the ok, cancel and help buttons */ n = 0; XtSetArg (args[n], XmNlabelString, okXmString); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 2); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 32); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, separator); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 5); n++; XtSetArg (args[n], XmNmarginHeight, 4); n++; XtSetArg (args[n], XmNuserData, flag); n++; ok = XmCreatePushButtonGadget (form, "ok", args, n); XtManageChild (ok); XtAddCallback(ok, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); /* Set the default action */ XtSetArg (args[0], XmNdefaultButton, ok); XtSetValues (form, args, 1); n = 0; XtSetArg (args[n], XmNlabelString, cancelXmString); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 35); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 65); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, separator); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 5); n++; XtSetArg (args[n], XmNmarginHeight, 4); n++; XtSetArg (args[n], XmNuserData, flag); n++; cancel = XmCreatePushButtonGadget (form, "cancel", args, n); XtManageChild (cancel); XtAddCallback(cancel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); n = 0; XtSetArg (args[n], XmNlabelString, helpXmString); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 68); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 98); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, separator); n++; XtSetArg (args[n], XmNtopOffset, 5); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 5); n++; XtSetArg (args[n], XmNmarginHeight, 4); n++; help = XmCreatePushButtonGadget (form, "help", args, n); XtManageChild (help); XtAddCallback(help, XmNactivateCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); XtAddCallback(help, XmNhelpCallback, (XtCallbackProc)HelpRequestCB, HELP_PROPERTIES_DIALOG_STR); XtSetArg (args[0], XmNcancelButton, cancel); XtSetValues (form, args, 1); /* Fill in our instance structure */ modAttr_rec->shell = shell; modAttr_rec->bboard = form; modAttr_rec->name = name; modAttr_rec->link_name = link_name; modAttr_rec->link_label = link_label; modAttr_rec->fileType = fileType; modAttr_rec->owner_label = ownerLabel; modAttr_rec->owner = owner; modAttr_rec->group = group; modAttr_rec->ownerL = ownerL; modAttr_rec->groupL = groupL; modAttr_rec->ownerRead = ownerRead; modAttr_rec->ownerWrite = ownerWrite; modAttr_rec->ownerExecute = ownerExecute; modAttr_rec->groupRead = groupRead; modAttr_rec->groupWrite = groupWrite; modAttr_rec->groupExecute = groupExecute; modAttr_rec->otherRead = otherRead; modAttr_rec->otherWrite = otherWrite; modAttr_rec->otherExecute = otherExecute; modAttr_rec->otherPLabel = otherPLabel; modAttr_rec->fsWarning = fsWarning; modAttr_rec->fsPushButton = fsPushButton; modAttr_rec->size = size; modAttr_rec->modTime = mod; modAttr_rec->ok = ok; modAttr_rec->cancel = cancel; modAttr_rec->help = help; /* Set the return values for the dialog widget and dialog instance. */ *return_widget = form; *dialog = (XtPointer) modAttr_rec; } /************************************************************************ * * InstallChange * ************************************************************************/ static void InstallChange( ModAttrRec *modAttr_rec, XtCallbackProc callback, XtPointer client_data ) { ModAttrApply * apply_data; /* Setup the callback data to be sent to the Ok callback. */ /* This contains the encapsulation callback to invoke upon */ /* the data within the dialog being changed. */ apply_data = (ModAttrApply *) XtMalloc (sizeof (ModAttrApply)); apply_data->callback = callback; apply_data->client_data = client_data; apply_data->modAttr_rec = (XtPointer) modAttr_rec; modAttr_rec->apply_data = apply_data; XtAddCallback (modAttr_rec->ok, XmNactivateCallback, (XtCallbackProc)OkCallback, (XtPointer) apply_data); } /************************************************************************ * * InstallClose * ************************************************************************/ static void InstallClose( ModAttrRec *modAttr_rec, XtCallbackProc callback, XtPointer client_data ) { Atom delete_window_atom; XtAddCallback (modAttr_rec->cancel, XmNactivateCallback, callback, client_data); /* This callback is removed in SetValues if the config file does */ /* not include a dismiss=yes directive. Thus for some filesystems */ /* you can Cancel the regular permissions dialog when the fs */ /* dialog button is pressed (e.g. for DFS?) or you can let the */ /* the regular permissions dialog stay on screen along with the */ /* fs-specfic dialog. */ if (modAttr_rec->fsPushButton != NULL) XtAddCallback (modAttr_rec->fsPushButton, XmNactivateCallback, callback, client_data); delete_window_atom = XmInternAtom (XtDisplay(modAttr_rec->shell), "WM_DELETE_WINDOW", True); XmRemoveWMProtocols( modAttr_rec->shell, &delete_window_atom, 1 ); XmAddWMProtocolCallback( modAttr_rec->shell, delete_window_atom, callback, (XtPointer) client_data ); } /************************************************************************ * * Destroy * ************************************************************************/ static void Destroy( ModAttrRec *modAttr_rec ) { XtDestroyWidget (modAttr_rec->shell); XtFree ((char *) modAttr_rec->apply_data); XtFree ((char *) modAttr_rec); } /************************************************************************ * * GetValues * ************************************************************************/ static XtPointer GetValues( ModAttrRec *modAttr_rec ) { ModAttrData * modAttr_data; /* Allocate and initialize the modify file attribute dialog data. */ modAttr_data = (ModAttrData *) XtCalloc (1, sizeof (ModAttrData)); modAttr_data->displayed = True; (void) GetModAttrValues(modAttr_rec, modAttr_data, False); return ((XtPointer) modAttr_data); } /************************************************************************ * * GetDefaultValues * ************************************************************************/ static XtPointer GetDefaultValues( void ) { ModAttrData * modAttr_data; /* Allocate and initialize the default file attribute dialog data. */ modAttr_data = (ModAttrData *) XtCalloc (1, sizeof (ModAttrData)); modAttr_data->displayed = False; modAttr_data->x = 0; modAttr_data->y = 0; modAttr_data->height = 0; modAttr_data->width = 0; modAttr_data->name = NULL; modAttr_data->link_name = NULL; modAttr_data->filetype = NULL; modAttr_data->pixmapData = NULL; modAttr_data->owner = NULL; modAttr_data->group = NULL; modAttr_data->accessBits = 0; modAttr_data->setuidBits = 0; modAttr_data->size = 0; modAttr_data->modTime = time(NULL); modAttr_data->host = NULL; modAttr_data->directory = NULL; return ((XtPointer) modAttr_data); } /************************************************************************ * * GetResourceValues * ************************************************************************/ static XtPointer GetResourceValues( XrmDatabase data_base, char **name_list ) { /* We are not using this code so we commented it out for now */ ModAttrData * modAttr_data; String host, directory, name; /* Allocate and get the resources for modify file attrs dialog data. */ modAttr_data = (ModAttrData *) XtCalloc (1, sizeof (ModAttrData)); _DtDialogGetResources (data_base, name_list, MODIFY_ATTR, (char *)modAttr_data, resources, modAttrClass->resource_count); modAttr_data->link_name = XtNewString(modAttr_data->link_name); /* * Since the other fields are dynamic, use the obtained name to * stat the file, and use the current values. If the file no * longer exists, then return the default values. */ (void) _LoadFileAttributes (modAttr_data->host, modAttr_data->directory, modAttr_data->name, modAttr_data, ALL_BUT_ACCESS); return ((XtPointer) modAttr_data); } /************************************************************************ * * SetValues * ************************************************************************/ static void SetValues( ModAttrRec *modAttr_rec, ModAttrData *modAttr_data ) { Arg args[10]; XmString string; char buf[20]; char date_string[256]; Arg trueArg[1]; Arg falseArg[1]; Boolean sensitivity; struct passwd * user_data; String temp; struct tm * tms; char * timeString; int mode; char * fullPath; uid_t effective_user; int n; Pixel background; Pixel foreground; Pixel top_shadow; Pixel bottom_shadow; Pixel select; Colormap colormap; XmString labelString; char * tmpStr; Tt_status tt_status; /* Get the select color */ XtSetArg (args[0], XmNbackground, &background); XtSetArg (args[1], XmNcolormap, &colormap); XtGetValues (modAttr_rec->bboard, args, 2); XmGetColors (XtScreen (modAttr_rec->bboard), colormap, background, &foreground, &top_shadow, &bottom_shadow, &select); /* Adjust the colors of the icon */ SetToNormalColors (modAttr_rec->fileType, modAttr_rec->bboard, modAttr_data->main_widget, 0); /* Verify that we are allowed to change the attributes */ if (modAttr_data->owner) user_data = getpwnam(modAttr_data->owner); else user_data = NULL; effective_user = geteuid(); if (user_data && user_data->pw_uid == getuid() || effective_user == root_user) { /* Check for root user */ if (effective_user == root_user) { fullPath = ResolveLocalPathName (modAttr_data->host, modAttr_data->directory, modAttr_data->name, home_host_name, &tt_status); if( TT_OK == tt_status ) { /* Check for access rights (e.g. NFS mounted filesystem) */ mode = chmod(fullPath, modAttr_data->accessBits + modAttr_data->setuidBits); XtFree(fullPath); if (mode == 0) sensitivity = True; else sensitivity = False; } else sensitivity = False; } else sensitivity = True; } else sensitivity = False; if (modAttr_data->link_name) { Widget children[2]; children[0] = modAttr_rec->link_name; children[1] = modAttr_rec->link_label; XtManageChildren(children, 2); XtSetArg(args[0], XmNtopWidget, modAttr_rec->link_name); XtSetValues(modAttr_rec->owner, args, 1); XtSetValues(modAttr_rec->owner_label, args, 1); XtSetValues(modAttr_rec->fileType, args, 1); } else { Widget children[2]; children[0] = modAttr_rec->link_name; children[1] = modAttr_rec->link_label; XtUnmanageChildren(children, 2); XtSetArg(args[0], XmNtopWidget, modAttr_rec->name); XtSetValues(modAttr_rec->owner, args, 1); XtSetValues(modAttr_rec->owner_label, args, 1); XtSetValues(modAttr_rec->fileType, args, 1); } if (sensitivity == True) { /* Only allow root user to change the ownership. */ if (effective_user == root_user) { XtManageChild(modAttr_rec->owner); XmTextFieldSetEditable(modAttr_rec->owner, True); XtSetArg (args[0], XmNcursorPositionVisible, True); XtSetArg (args[1], XmNshadowThickness, 2); XtSetValues(modAttr_rec->owner, args, 2); if (modAttr_data->owner) { if (getpwnam(modAttr_data->owner) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->owner) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf( newstring,"%s (%s) ",modAttr_data->owner, GETMESSAGE(21,19, "Unknown") ); XmTextFieldSetString(modAttr_rec->owner, newstring); XtFree( newstring ); } else XmTextFieldSetString(modAttr_rec->owner, modAttr_data->owner); } else XmTextFieldSetString(modAttr_rec->owner, (GETMESSAGE(21,19, "Unknown"))); XtUnmanageChild(modAttr_rec->ownerL); XtUnmanageChild(modAttr_rec->groupL); XtManageChild(modAttr_rec->group); XmTextFieldSetEditable(modAttr_rec->group, True); XtSetArg (args[0], XmNcursorPositionVisible, True); XtSetArg (args[1], XmNshadowThickness, 2); XtSetValues(modAttr_rec->group, args, 2); XtSetArg (args[0], XmNshadowType, XmSHADOW_IN); XtSetArg (args[1], XmNbackground, select); XtSetValues(XtParent (modAttr_rec->ownerRead), args, 2); } else { XtUnmanageChild(modAttr_rec->owner); if (modAttr_data->owner) { if (getpwnam(modAttr_data->owner) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->owner) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf( newstring,"%s ( %s ) ",modAttr_data->owner, GETMESSAGE(21,19, "Unknown") ); labelString = XmStringCreateLocalized( newstring ); XtFree( newstring ); } else labelString = XmStringCreateLocalized(modAttr_data->owner); } else { labelString = XmStringCreateLocalized((GETMESSAGE(21,19, "Unknown"))); } XtSetArg (args[0], XmNlabelString, labelString); XtSetValues(modAttr_rec->ownerL, args, 1); XmStringFree (labelString); XtManageChild(modAttr_rec->ownerL); XtUnmanageChild(modAttr_rec->group); if (modAttr_data->group) { if (getgrnam(modAttr_data->group) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->group) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf(newstring,"%s ( %s ) ",modAttr_data->group, GETMESSAGE(21,19, "Unknown")); labelString = XmStringCreateLocalized(newstring); XtFree(newstring); } else labelString = XmStringCreateLocalized(modAttr_data->group); } else { labelString = XmStringCreateLocalized((GETMESSAGE(21,19, "Unknown"))); } XtSetArg (args[0], XmNlabelString, labelString); XtSetValues(modAttr_rec->groupL, args, 1); XmStringFree (labelString); XtManageChild(modAttr_rec->groupL); XtSetArg (args[0], XmNshadowType, XmSHADOW_ETCHED_IN); XtSetArg (args[1], XmNbackground, background); XtSetValues(XtParent (modAttr_rec->ownerRead), args, 2); } if (modAttr_data->group) { if(getgrnam(modAttr_data->group) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->group) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf(newstring,"%s (%s) ",modAttr_data->group, GETMESSAGE(21,19, "Unknown")); XmTextFieldSetString(modAttr_rec->group, newstring); XtFree(newstring); } else XmTextFieldSetString(modAttr_rec->group, modAttr_data->group); } else { XmTextFieldSetString(modAttr_rec->group, (GETMESSAGE(21,19, "Unknown"))); } } else { XtUnmanageChild(modAttr_rec->owner); XtUnmanageChild(modAttr_rec->group); /* I'm not sure why we care to set all these up. Both widgets are being unmanaged by the above 2 statements XmTextFieldSetEditable(modAttr_rec->owner, False); XmTextFieldSetEditable(modAttr_rec->group, False); XtSetArg (args[0], XmNcursorPositionVisible, False); XtSetArg (args[1], XmNshadowThickness, 0); XtSetArg (args[2], XmNbackground, background); XtSetValues(modAttr_rec->owner, args, 3); XtSetValues(modAttr_rec->group, args, 3); */ if (modAttr_data->owner) { if (getpwnam(modAttr_data->owner) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->owner) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf(newstring,"%s ( %s ) ",modAttr_data->owner, GETMESSAGE(21,19, "Unknown")); labelString = XmStringCreateLocalized(newstring); XtFree(newstring); } else labelString = XmStringCreateLocalized(modAttr_data->owner); } else { labelString = XmStringCreateLocalized((GETMESSAGE(21,19, "Unknown"))); } XtSetArg (args[0], XmNlabelString, labelString); XtSetValues(modAttr_rec->ownerL, args, 1); XmStringFree (labelString); if (modAttr_data->group) { if (getgrnam(modAttr_data->group) == NULL) { char *newstring = XtMalloc(strlen(modAttr_data->group) + strlen(GETMESSAGE(21,19, "Unknown")) + 10); sprintf(newstring,"%s ( %s ) ",modAttr_data->group, GETMESSAGE(21,19, "Unknown")); labelString = XmStringCreateLocalized(newstring); XtFree(newstring); } else labelString = XmStringCreateLocalized(modAttr_data->group); } else { labelString = XmStringCreateLocalized((GETMESSAGE(21,19, "Unknown"))); } XtSetArg (args[0], XmNlabelString, labelString); XtSetValues(modAttr_rec->groupL, args, 1); XmStringFree (labelString); XtManageChild(modAttr_rec->ownerL); XtManageChild(modAttr_rec->groupL); XtSetArg (args[0], XmNshadowType, XmSHADOW_ETCHED_IN); XtSetArg (args[1], XmNbackground, background); XtSetValues(XtParent (modAttr_rec->ownerRead), args, 2); } if(modAttr_data->filetype && ( strcmp(modAttr_data->filetype,LT_RECURSIVE_LINK) == 0 || strcmp(modAttr_data->filetype,LT_BROKEN_LINK) == 0)) sensitivity = False; /* User doesn't have modification privileges */ XtSetSensitive(modAttr_rec->ok, sensitivity); XtSetSensitive(modAttr_rec->ownerRead, sensitivity); XtSetSensitive(modAttr_rec->ownerWrite, sensitivity); XtSetSensitive(modAttr_rec->ownerExecute, sensitivity); XtSetSensitive(modAttr_rec->groupRead, sensitivity); XtSetSensitive(modAttr_rec->groupWrite, sensitivity); XtSetSensitive(modAttr_rec->groupExecute, sensitivity); XtSetSensitive(modAttr_rec->otherRead, sensitivity); XtSetSensitive(modAttr_rec->otherWrite, sensitivity); XtSetSensitive(modAttr_rec->otherExecute, sensitivity); if (modAttr_data->name) { /* Build host:dir/name string */ temp = XtMalloc(strlen(modAttr_data->host) + strlen(modAttr_data->directory) + strlen(modAttr_data->name) + 3); temp[0] = '\0'; if (modAttr_data->host) { (void) strcat(temp, modAttr_data->host); (void) strcat(temp, ":"); } if (modAttr_data->directory) { (void) strcat(temp, modAttr_data->directory); if (strcmp (modAttr_data->directory, "/") != 0) (void) strcat(temp, "/"); } (void) strcat(temp, modAttr_data->name); string = XmStringCreateLocalized(temp); XtFree ((char *) temp); } else string = XmStringCreateLocalized(" "); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->name, args, 1); XmStringFree(string); if (modAttr_data->link_name) { string = XmStringCreateLocalized(modAttr_data->link_name); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->link_name, args, 1); XmStringFree(string); } if (modAttr_data->filetype) { char *ptr; if (ptr = (char *)DtDtsDataTypeToAttributeValue(modAttr_data->filetype, FM_TYPE_LABEL, NULL)) { string = XmStringCreateLocalized(ptr); DtDtsFreeAttributeValue(ptr); } else { string = XmStringCreateLocalized(modAttr_data->filetype); } } else string = XmStringCreateLocalized(" "); XtSetArg (args[0], XmNstring, string); if (modAttr_data->pixmapData) XtSetArg (args[1], XmNimageName, modAttr_data->pixmapData->iconFileName); else XtSetArg (args[1], XmNimageName, NULL); XtSetValues(modAttr_rec->fileType, args, 2); _DtCheckAndFreePixmapData(modAttr_data->filetype, toplevel, (DtIconGadget) modAttr_rec->fileType, modAttr_data->pixmapData); modAttr_data->pixmapData = NULL; XmStringFree(string); fullPath = ResolveLocalPathName (modAttr_data->host, modAttr_data->directory, modAttr_data->name, home_host_name, &tt_status); if (fsDialogAvailable(fullPath, &modAttr_rec->fileSystem)) { if (strlen(modAttr_rec->fileSystem.warningMessage) == 0) /* fs dialog is available and there is no warning message */ { string = XmStringCreateLocalized (modAttr_rec->fileSystem.buttonLabel); n = 0; XtSetArg (args[n], XmNlabelString, string); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, modAttr_rec->otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 15); n++; XtSetValues(modAttr_rec->fsPushButton, args, n); XmStringFree(string); } else /* fs dialog is available and there is a warning message */ { n = 0; string = XmStringCreateLocalized (modAttr_rec->fileSystem.warningMessage); XtSetArg (args[n], XmNlabelString, string); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, modAttr_rec->otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightOffset, 15); n++; XtSetValues(modAttr_rec->fsWarning, args, n); XmStringFree(string); n = 0; string = XmStringCreateLocalized (modAttr_rec->fileSystem.buttonLabel); XtSetArg (args[n], XmNlabelString, string); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, modAttr_rec->fsWarning); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 15); n++; XtSetValues(modAttr_rec->fsPushButton, args, n); XmStringFree(string); } n = 0; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetValues(modAttr_rec->otherPLabel, args, n); if (strlen(modAttr_rec->fileSystem.warningMessage) != 0) XtManageChild (modAttr_rec->fsWarning); else XtUnmanageChild (modAttr_rec->fsWarning); /* the fs dialog pushbutton is created with a callback to cancel the */ /* permissions dialog ... here that callback is removed if that was */ /* requested by a directive in the configuration file dtfile.config */ if (!modAttr_rec->fileSystem.dismissStdPermissionDialog) { XtRemoveAllCallbacks(modAttr_rec->fsPushButton, XmNactivateCallback); } XtAddCallback(modAttr_rec->fsPushButton, XmNactivateCallback, (XtCallbackProc)displayFSDialog, &modAttr_rec->fileSystem); XtManageChild (modAttr_rec->fsPushButton); } else { if (strlen(modAttr_rec->fileSystem.warningMessage) == 0) /* fs dialog not available and there is no warning message */ { XtUnmanageChild (modAttr_rec->fsPushButton); XtUnmanageChild (modAttr_rec->fsWarning); n = 0; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetValues(modAttr_rec->otherPLabel, args, n); } else /* fs dialog is not available and there is a warning message */ { n = 0; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_NONE); n++; XtSetValues(modAttr_rec->otherPLabel, args, n); n = 0; string = XmStringCreateLocalized (modAttr_rec->fileSystem.warningMessage); XtSetArg (args[n], XmNlabelString, string); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNtopWidget, modAttr_rec->otherPLabel); n++; XtSetArg (args[n], XmNtopOffset, 15); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, 15); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightOffset, 15); n++; XtSetValues(modAttr_rec->fsWarning, args, n); XmStringFree(string); XtUnmanageChild (modAttr_rec->fsPushButton); XtManageChild (modAttr_rec->fsWarning); XtUnmanageChild (modAttr_rec->fsPushButton); } } XtFree(fullPath); if(modAttr_data->filetype && ( strcmp(modAttr_data->filetype,LT_RECURSIVE_LINK) == 0 || strcmp(modAttr_data->filetype,LT_BROKEN_LINK) == 0 )) { tmpStr = GETMESSAGE(21,19, "Unknown"); sprintf(date_string, " %s",tmpStr); string = XmStringCreateLocalized(date_string); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->size, args, 1); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->modTime, args, 1); XmStringFree(string); } else { (void) sprintf(buf, "%d", modAttr_data->size); string = XmStringCreateLocalized(buf); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->size, args, 1); XmStringFree(string); tms = localtime(&modAttr_data->modTime); tmpStr = GETMESSAGE(21, 14, "%x %X "); timeString = XtNewString(tmpStr); (void)strftime(date_string, 256, timeString, tms); XtFree(timeString); string = XmStringCreateLocalized(date_string); XtSetArg (args[0], XmNlabelString, string); XtSetValues(modAttr_rec->modTime, args, 1); XmStringFree(string); } XtSetArg (trueArg[0], XmNset, True); XtSetArg (falseArg[0], XmNset, False); /* Set the access bits */ if (modAttr_data->accessBits & S_IRUSR) XtSetValues(modAttr_rec->ownerRead, trueArg, 1); else XtSetValues(modAttr_rec->ownerRead, falseArg, 1); if (modAttr_data->accessBits & S_IWUSR) XtSetValues(modAttr_rec->ownerWrite, trueArg, 1); else XtSetValues(modAttr_rec->ownerWrite, falseArg, 1); if (modAttr_data->accessBits & S_IXUSR) XtSetValues(modAttr_rec->ownerExecute, trueArg, 1); else XtSetValues(modAttr_rec->ownerExecute, falseArg, 1); if (modAttr_data->accessBits & S_IRGRP) XtSetValues(modAttr_rec->groupRead, trueArg, 1); else XtSetValues(modAttr_rec->groupRead, falseArg, 1); if (modAttr_data->accessBits & S_IWGRP) XtSetValues(modAttr_rec->groupWrite, trueArg, 1); else XtSetValues(modAttr_rec->groupWrite, falseArg, 1); if (modAttr_data->accessBits & S_IXGRP) XtSetValues(modAttr_rec->groupExecute, trueArg, 1); else XtSetValues(modAttr_rec->groupExecute, falseArg, 1); if (modAttr_data->accessBits & S_IROTH) XtSetValues(modAttr_rec->otherRead, trueArg, 1); else XtSetValues(modAttr_rec->otherRead, falseArg, 1); if (modAttr_data->accessBits & S_IWOTH) XtSetValues(modAttr_rec->otherWrite, trueArg, 1); else XtSetValues(modAttr_rec->otherWrite, falseArg, 1); if (modAttr_data->accessBits & S_IXOTH) XtSetValues(modAttr_rec->otherExecute, trueArg, 1); else XtSetValues(modAttr_rec->otherExecute, falseArg, 1); } /************************************************************************ * * WriteResourceValues * ************************************************************************/ static void WriteResourceValues( DialogData *values, int fd, char **name_list ) { /* We are not using this code so we commented it out for now */ ModAttrData * modAttr_data = (ModAttrData *) values->data; ModAttrRec * modAttr_rec; Arg args[4]; /* If the dialog is currently displayed, update the geometry */ /* fields to their current values. */ if (modAttr_data->displayed == True) { _DtGenericUpdateWindowPosition(values); modAttr_rec = (ModAttrRec *) _DtGetDialogInstance(values); } _DtDialogPutResources (fd, name_list, MODIFY_ATTR, values->data, resources, modAttrClass->resource_count); } /************************************************************************ * * FreeValues * ************************************************************************/ static void FreeValues( ModAttrData *modAttr_data ) { XtFree ((char *) modAttr_data->host); XtFree ((char *) modAttr_data->directory); XtFree ((char *) modAttr_data->name); XtFree ((char *) modAttr_data->link_name); XtFree ((char *) modAttr_data->filetype); XtFree ((char *) modAttr_data->owner); XtFree ((char *) modAttr_data->group); if( modAttr_data->pixmapData ) { DtDtsFreeAttributeValue(modAttr_data->pixmapData->hostPrefix); DtDtsFreeAttributeValue(modAttr_data->pixmapData->instanceIconName); DtDtsFreeAttributeValue(modAttr_data->pixmapData->iconName); DtDtsFreeAttributeValue(modAttr_data->pixmapData->iconFileName); XtFree((char *) modAttr_data->pixmapData); } XtFree ((char *) modAttr_data); } /************************************************************************ * * OkCallback * This is a callback function called when the (Ok) button * is pressed. It makes any indicated modifications, and then * discards the data and brings down the dialog. * ************************************************************************/ static void OkCallback( Widget w, ModAttrApply *apply_data, XtPointer call_data ) { ModAttrRec * modAttr_rec = (ModAttrRec *) apply_data->modAttr_rec; ModAttrData * new_attr_data; FileMgrRec *file_mgr_rec; Widget close = modAttr_rec->cancel; DialogData * old_dialog; ModAttrData * old; Boolean question = False; short result; old_dialog = _DtGetInstanceData ((XtPointer)modAttr_rec); old = (ModAttrData *) old_dialog->data; if(RecheckFlag(NULL,w)) return; else if(RecheckFlag(NULL,close)) return; new_attr_data = (ModAttrData *) XtCalloc (1, sizeof (ModAttrData)); new_attr_data->displayed = True; /* Verify the user and group names */ result = GetModAttrValues(modAttr_rec, new_attr_data, True); if (result == GMA_VALID) { /* Check to see if the file we are changing is the CURRENT directory. * If it is we need to see if after the changes, the user will have * permissions to read this folder. If he/she doesn't we want to warn * the user that this will be the case and allow them to back out of * the change. If they don't want to back out of the change, we need * to make the change, then move them up to the parent directory. */ if(strcmp(old->name, ".") == 0) { /* It is the current directory, now we need to test the cases where * by changing permissions the user would no should be in this * directory because lack of privileges. * Cases where this is true: * 1. If the execute bit for owner has been changed to off and the * user is the owner. * 2. The user changes the owner, and the execute bit is for owner * is the only execute bit set. * 3. The read access bit for owner has been turned off. * * Others? */ if(strcmp(old->owner, new_attr_data->owner) == 0 && (new_attr_data->accessBits & 64) == 0) { /* Criteria 1 above has been meet */ question = True; } else if (strcmp(old->owner, new_attr_data->owner) != 0 && ((new_attr_data->accessBits & 73) == 0 || (new_attr_data->accessBits & 73) == 64)) { /* Criteria 2 above has been meet */ question = True; } else if((new_attr_data->accessBits & 256) == 0) { /* Criteria 3 above has been meet */ question = True; } } if(question) { char *title, *message; globalApplyData = apply_data; parentDir = XtNewString(old->directory); title = XtNewString(GETMESSAGE(21, 36, "Change Permissions Warning")); message = XtNewString(GETMESSAGE(21, 37, "You are changing the permissions on the Current\nFolder in a way that won't allow you to view\nthis folder any longer. It will be automatically\nclosed and you will no longer be able to reopen\nthe folder.\n\nIs this what you want to do?")); _DtMessageDialog(modAttr_rec->shell, title, message, NULL, TRUE, DontChangeCB, ChangeCB, NULL, HelpRequestCB, False, QUESTION_DIALOG); XtFree(title); XtFree(message); } else /* Information was valid */ (*(apply_data->callback)) (w, apply_data->client_data, NULL); } else if (result == GMA_NO_FILE) { DialogData * old_dialog; char *title,*tmpmsg,*msg; ModAttrData * old; old_dialog = _DtGetInstanceData ((XtPointer)modAttr_rec); old = (ModAttrData *) old_dialog->data; file_mgr_rec = (FileMgrRec *) LocateRecordStructure(w); ResetFlag(NULL,w); ResetFlag(NULL,close); title = XtNewString(GETMESSAGE(21,33, "Permissions Error")); tmpmsg = GETMESSAGE(21,35,"The Permissions dialog for the object\n\n%s/%s\n\nhas been closed because this object has been deleted\nfrom your system."); msg = XtMalloc(strlen(tmpmsg)+strlen(old->directory)+strlen(old->name)+3); sprintf(msg,tmpmsg,old->directory,old->name); ModAttrClose ((XtPointer)file_mgr_rec, old_dialog, NULL); _DtMessage(toplevel, title, msg, NULL, HelpRequestCB); XtFree(title); XtFree(msg); } FreeValues (new_attr_data); } /************************************************************************ * * GetModAttrValues * Update the current file attribute values within the data structure. * ************************************************************************/ static short GetModAttrValues( ModAttrRec *modAttr_rec, ModAttrData *modAttr_data, Boolean validate ) { Arg args[4]; DialogData * old_dialog; ModAttrData * old; int error; Boolean retStatus; old_dialog = _DtGetInstanceData ((XtPointer)modAttr_rec); old = (ModAttrData *) old_dialog->data; retStatus = _LoadFileAttributes (old->host, old->directory, old->name, modAttr_data, ALL_BUT_OWNER_GROUP_ACCESS); if(!retStatus) return ((short)GMA_NO_FILE); /* Get the current geometry */ XtSetArg (args[0], XmNx, &modAttr_data->x); XtSetArg (args[1], XmNy, &modAttr_data->y); XtSetArg (args[2], XmNwidth, &modAttr_data->width); XtSetArg (args[3], XmNheight, &modAttr_data->height); XtGetValues (modAttr_rec->shell, args, 4); /* Get the user, group and access bits */ if( XtIsManaged( modAttr_rec->owner ) ) modAttr_data->owner = XmTextFieldGetString(modAttr_rec->owner); else modAttr_data->owner = XtNewString( old->owner ); modAttr_data->group = XmTextFieldGetString(modAttr_rec->group); modAttr_data->accessBits = 0; if (XmToggleButtonGadgetGetState(modAttr_rec->ownerRead)) modAttr_data->accessBits |= S_IRUSR; if (XmToggleButtonGadgetGetState(modAttr_rec->ownerWrite)) modAttr_data->accessBits |= S_IWUSR; if (XmToggleButtonGadgetGetState(modAttr_rec->ownerExecute)) modAttr_data->accessBits |= S_IXUSR; if (XmToggleButtonGadgetGetState(modAttr_rec->groupRead)) modAttr_data->accessBits |= S_IRGRP; if (XmToggleButtonGadgetGetState(modAttr_rec->groupWrite)) modAttr_data->accessBits |= S_IWGRP; if (XmToggleButtonGadgetGetState(modAttr_rec->groupExecute)) modAttr_data->accessBits |= S_IXGRP; if (XmToggleButtonGadgetGetState(modAttr_rec->otherRead)) modAttr_data->accessBits |= S_IROTH; if (XmToggleButtonGadgetGetState(modAttr_rec->otherWrite)) modAttr_data->accessBits |= S_IWOTH; if (XmToggleButtonGadgetGetState(modAttr_rec->otherExecute)) modAttr_data->accessBits |= S_IXOTH; if (old->link_name) modAttr_data->link_name = XtNewString(old->link_name); else modAttr_data->link_name = NULL; /* Validate the entry */ if (validate) { /* Valid user name */ error = -1; if (getpwnam(modAttr_data->owner) == NULL) error = UNKNOWN_USER; else if (getgrnam(modAttr_data->group) == NULL) error = UNKNOWN_GROUP; if (error != -1) { /* Bad entry; free up everything allocated so far */ ResetFlag(NULL,modAttr_rec->ok); ResetFlag(NULL,modAttr_rec->cancel); InvalidModAttrMessage(modAttr_rec->shell, error); XtFree ((char *) modAttr_data->host); modAttr_data->host = NULL; XtFree ((char *) modAttr_data->directory); modAttr_data->directory = NULL; XtFree ((char *) modAttr_data->name); modAttr_data->name = NULL; XtFree ((char *) modAttr_data->filetype); modAttr_data->filetype = NULL; XtFree ((char *) modAttr_data->owner); modAttr_data->owner = NULL; XtFree ((char *) modAttr_data->group); modAttr_data->group = NULL; XtFree ((char *) modAttr_data->link_name); modAttr_data->link_name = NULL; XSync(XtDisplay(modAttr_rec->ok), False); return ((short)GMA_INVALID); } } return((short)GMA_VALID); } /************************************************************************ * * InvalidModAttrMessage * Display an error message. * ************************************************************************/ static void InvalidModAttrMessage( Widget w, int messageIndex ) { String string; char * title; char * tmpStr; static String unknownUser = NULL; static String unknownGroup = NULL; if (unknownUser == NULL) { tmpStr = GETMESSAGE(21,31, "Owner Name is invalid.\nThe specified user does not exist."); unknownUser = XtNewString(tmpStr); tmpStr = GETMESSAGE(21,32, "Group Name is invalid.\n\nNo group of users with this name has been created on your system.\nUse your system administration software if you want to create\na user group with this name."); unknownGroup = XtNewString(tmpStr); } switch (messageIndex) { case UNKNOWN_USER: string = unknownUser; break; case UNKNOWN_GROUP: string = unknownGroup; break; } tmpStr = GETMESSAGE(21,33, "Permissions Error"); title = XtNewString(tmpStr); _DtMessage (w, title, string, NULL, HelpRequestCB); XtFree(title); } /************************************************************************ * * _LoadFileAttributes * Load the data structure with the data describing the indicated file. * * THIS IS A Private FUNCTION * ************************************************************************/ static Boolean _LoadFileAttributes( String host, String dir, String file, ModAttrData *modAttr_data, unsigned long mask ) { String filetype; FileData *file_data=NULL; struct group * group_data; struct passwd * user_data; Boolean returnStatus=TRUE; char buf[32]; file_data = (FileData *) ReadFileData(dir,file); if (file_data && (file_data->errnum == 0 || file_data->link)) { /* Extract the most uptodate attributes */ if (mask & HOST) { if (host) modAttr_data->host = XtNewString(host); else modAttr_data->host = NULL; } else modAttr_data->host = NULL; if (mask & DIR) { if (dir) modAttr_data->directory = XtNewString(dir); else modAttr_data->directory = NULL; } else modAttr_data->directory = NULL; if (mask & NAME) modAttr_data->name = XtNewString(file); else modAttr_data->name = NULL; if (mask & FILETYPE) { modAttr_data->filetype = XtNewString(file_data->logical_type); if (modAttr_data->pixmapData) { /* free old pixmap data */ DtDtsFreeAttributeValue(modAttr_data->pixmapData->hostPrefix); DtDtsFreeAttributeValue(modAttr_data->pixmapData->instanceIconName); DtDtsFreeAttributeValue(modAttr_data->pixmapData->iconName); DtDtsFreeAttributeValue(modAttr_data->pixmapData->iconFileName); XtFree((char *) modAttr_data->pixmapData); modAttr_data->pixmapData = NULL; } modAttr_data->pixmapData = _DtRetrievePixmapData( file_data->logical_type, NULL, NULL, toplevel, LARGE); } else { modAttr_data->filetype = NULL; modAttr_data->pixmapData = NULL; } if (file_data->errnum == 0 && (file_data->stat.st_mode & S_IFMT) != S_IFLNK ) { if (mask & GROUP) { group_data = getgrgid(file_data->stat.st_gid); if(group_data != NULL) modAttr_data->group = XtNewString(group_data->gr_name); else { sprintf(buf, "%ld", (long)file_data->stat.st_gid); modAttr_data->group = XtNewString(buf); } } else modAttr_data->group = NULL; if (mask & OWNER) { user_data = getpwuid(file_data->stat.st_uid); if(user_data != NULL) modAttr_data->owner = XtNewString(user_data->pw_name); else { sprintf(buf, "%ld", (long)file_data->stat.st_uid); modAttr_data->owner = XtNewString(buf); } } else modAttr_data->owner = NULL; modAttr_data->setuidBits = file_data->stat.st_mode & 07000; if (mask & BITS) modAttr_data->accessBits = file_data->stat.st_mode & 0777; if (mask & SIZE) modAttr_data->size = file_data->stat.st_size; if (mask & MODTIME) modAttr_data->modTime = file_data->stat.st_mtime; } else { modAttr_data->owner = NULL; modAttr_data->group = NULL; modAttr_data->accessBits = 0; modAttr_data->size = 0; modAttr_data->modTime = 0; } } else { /* File did not exist or can't be accessed; use defaults */ modAttr_data->host = NULL; modAttr_data->link_name = NULL; modAttr_data->directory = NULL; modAttr_data->name = NULL; modAttr_data->filetype = NULL; modAttr_data->pixmapData = NULL; modAttr_data->owner = NULL; modAttr_data->group = NULL; modAttr_data->accessBits = 0; modAttr_data->size = 0; modAttr_data->modTime = 0; returnStatus = False; } if(file_data) FreeFileData(file_data,True); return(returnStatus); } /************************************************************************ * * LoadFileAttributes * Load the data structure with the data describing the indicated file. * * THIS IS A Public FUNCTION * ************************************************************************/ Boolean LoadFileAttributes( String host, String dir, String file, ModAttrData *modAttr_data ) { FileData *file_data=NULL; file_data = (FileData *) ReadFileData( dir, file); /* Get the link attributes */ if (file_data && file_data->link) modAttr_data->link_name = XtNewString(file_data->link); else modAttr_data->link_name = NULL; if(file_data) FreeFileData(file_data,True); return _LoadFileAttributes (host, dir, file, modAttr_data, ALL_FIELDS); } /************************************************************************ * * displayFSDialog * Display dialog to edit file-system-specific attributes, * e.g. AFS Access Control Lists. The dialog is displayed * be executing an independent program. There is no communication * between the two. While this is ok for filesystems like AFS * where file-system specific attributes are independent of * unix attributes, it might not be ok for file systems where * the two are dependent on each other (e.g. DFS?). * ************************************************************************/ static void displayFSDialog (Widget w, dtFSData *fileSystem, XmPushButtonCallbackStruct *cbs) { static char *pname = "displayFSDialog"; pid_t pid; int n; Arg args[20]; Widget dialog; String s; XmString xm_string; String errorScript = CDE_INSTALLATION_TOP "/bin/dtfile_error"; switch ((pid = fork())) { case -1: /* error forking */ s = GETMESSAGE(21, 26, "Unable to create a process for file system dialog"); xm_string = XmStringCreateLocalized(s); n = 0; XtSetArg(args[n], XmNmessageString, xm_string); n++; dialog = XmCreateErrorDialog(XtParent(w),"fork_error",args,1); XmStringFree(xm_string); XtManageChild(dialog); break; case 0: /* child */ DBGFORK(("%s: child forked\n", pname)); execl(fileSystem->fsDialogProgram, fileSystem->fsDialogProgram, /* argv[0] */ fileSystem->path, /* argv[1] */ NULL); /* if the exec fails, build a string and execute a script */ /* to display it */ s = (char *)XtMalloc( 50 + strlen( GETMESSAGE(21, 27, "Error executing file system dialog") ) + strlen( GETMESSAGE(21, 28, "Attempting to execute: ") ) + strlen( fileSystem->fsDialogProgram ) + strlen( fileSystem->path ) + strlen( strerror(errno) ) ); strcpy (s, GETMESSAGE(21, 27, "Error executing file system dialog")); strcat (s, "\n"); strcat (s, GETMESSAGE(21, 28, "Attempting to execute: ")); strcat (s, fileSystem->fsDialogProgram); strcat (s, " "); strcat (s, fileSystem->path); strcat (s, "\n"); strcat (s, strerror(errno)); strcat (s, "\n"); execl(errorScript, errorScript, /* argv[0] */ s, /* argv[1] */ NULL); XtFree( s ); DBGFORK(("%s: child exiting\n", pname)); exit(EXIT_FAILURE); /* just in case */ break; default: /* parent */ DPRINTF(("in parent after forking file system dialog\n")); break; } /* end switch */ DBGFORK(("%s: forked child<%d>\n", pname, pid)); } /* end displayFSDialog */ /************************************************************************ * * DontChangeCB - * ************************************************************************/ static void DontChangeCB( Widget w, XtPointer client_data, XtPointer call_data ) { ModAttrRec * modAttr_rec = (ModAttrRec *) globalApplyData->modAttr_rec; Widget close = modAttr_rec->cancel; Widget ok = modAttr_rec->ok; XtUnmanageChild((Widget)client_data); XmUpdateDisplay((Widget)client_data); XtDestroyWidget((Widget)client_data); ResetFlag(NULL, ok); ResetFlag(NULL, close); } /************************************************************************ * * ChangeCB - * * ************************************************************************/ static void ChangeCB( Widget w, XtPointer client_data, XtPointer call_data ) { char *ptr; XtUnmanageChild((Widget)client_data); XmUpdateDisplay((Widget)client_data); XtDestroyWidget((Widget)client_data); /* user says they want to go ahead with the change, so first let's * apply the change. */ (*(globalApplyData->callback)) (w, globalApplyData->client_data, NULL); /* Now let's change the directory to the Parent directory */ ptr = DtStrrchr(parentDir, '/'); if(ptr != NULL && strcmp(parentDir, "/") != 0) { *ptr = '\0'; _DtChangeTo(globalApplyData->client_data, parentDir); } XtFree(parentDir); } void ModAttrFreeValues( ModAttrData *modAttr_data ) { FreeValues(modAttr_data); }