2469 lines
90 KiB
C
2469 lines
90 KiB
C
/*
|
|
* 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 <stdio.h>
|
|
#include <errno.h>
|
|
#include <time.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <limits.h>
|
|
#include <grp.h>
|
|
#include <pwd.h>
|
|
|
|
#include <Xm/XmP.h>
|
|
#include <Xm/BulletinB.h>
|
|
#include <Xm/CascadeBG.h>
|
|
#include <Xm/DialogS.h>
|
|
#include <Xm/Frame.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/LabelG.h>
|
|
#include <Xm/MessageB.h>
|
|
#include <Xm/PushBG.h>
|
|
#include <Xm/RowColumn.h>
|
|
#include <Xm/ScrolledW.h>
|
|
#include <Xm/TextF.h>
|
|
#include <Xm/ToggleBG.h>
|
|
#include <Xm/SeparatoG.h>
|
|
#include <Xm/VendorSEP.h>
|
|
#include <Xm/MwmUtil.h>
|
|
#include <Xm/Protocols.h>
|
|
|
|
#include <Dt/Icon.h>
|
|
#include <Dt/IconP.h>
|
|
#include <Dt/IconFile.h>
|
|
#include <Dt/TitleBox.h>
|
|
#include <Dt/Dts.h>
|
|
#include <Dt/SharedProcs.h>
|
|
|
|
#include <X11/ShellP.h>
|
|
#include <X11/Shell.h>
|
|
#include <X11/Xatom.h>
|
|
|
|
#include <Dt/Connect.h>
|
|
#include <Dt/DtNlUtils.h>
|
|
|
|
#include <Tt/tttk.h>
|
|
|
|
#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);
|
|
}
|