home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
m
/
master12.zip
/
mastering
/
diskuse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-18
|
21KB
|
713 lines
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <Xm/MainW.h>
#include <Xm/BulletinB.h>
#include <Xm/CascadeB.h>
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/MessageB.h>
#include <Xm/RowColumn.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/PushB.h>
#include <Xm/Separator.h>
/* information for 'what' */
char ident1[]="@(#)diskuse Version 1.2.0 July 29, 1992";
/*-------------------------------------------------------------
** Forward Declarations
*/
void main();
void arm1CB ();
void arm2CB ();
void arm3CB ();
void errorCB ();
void execdu ();
void inputCB ();
void textf_activateCB();
Widget create_dlog ();
Widget CreateHelp ();
Widget CreateVersion ();
void HelpCB ();
void VersionCB ();
void QuitCB ();
/*-------------------------------------------------------------
** Global Variables
*/
#define MAX_ARGS 20
#define BUFFERSZ 40000
XtAppContext app_context;
static XmStringCharSet charset = (XmStringCharSet) XmFONTLIST_DEFAULT_TAG;
String specified_dir;
Widget scroll_text, errmsg_box, pbg;
/*-------------------------------------------------------------
** arm1CB - callback for home directory usage button
*/
void arm1CB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* Message Dialog */
int flag;
/* Create dialog. */
flag = 1;
message_box = create_dlog (w, flag);
execdu (message_box, flag);
}
/*-------------------------------------------------------------
** execdu - execute fork to get du information
*/
void execdu (messageBox, flag)
Widget messageBox;
int flag;
{
int pid;
int to_parent_fds[2];
char homedir[25];
/*
* Add the alternate input callback.
*/
XtAppAddInput (app_context, 0, XtInputReadMask, inputCB, messageBox);
/*
* Fork and exec 'ps' to trigger creation of the selection box.
*/
pipe (to_parent_fds);
pid = fork ();
if (pid == 0)
{
/*
* Child (application) process:
* application --> to_parent_fds[1].
* close other files and exec the application.
*/
close (1);
dup (to_parent_fds[1]);
close (to_parent_fds[0]);
close (to_parent_fds[1]);
if (flag == 1) {
sprintf (homedir, "%s", getenv("HOME"));
execlp ("du", "du", homedir, 0);
}
if (flag == 2)
execlp ("du", "du", 0);
if (flag == 3)
execlp ("bdf", "bdf", 0);
if (flag == 4) {
execlp ("du", "du", specified_dir, 0);
}
}
else if (pid > 0)
{
/*
* Parent (client) process:
* to_parent_fds[0] --> client
* close other files and turn off buffering.
*/
close (0);
dup (to_parent_fds[0]);
close (to_parent_fds[0]);
close (to_parent_fds[1]);
setbuf (stdout, NULL);
}
else
{
fprintf (stderr, "Unable to fork process\n");
exit (1);
}
}
/************************************************************************
* inputCB
***********************************************************************/
void
inputCB (messageBox, fd, id)
Widget messageBox;
int *fd;
XtInputId *id;
{
char buf[BUFFERSZ];
int n, nitems, nbytes;
XmString message_string = NULL;
Arg args[3];
nbytes = read (*fd, buf, BUFFERSZ);
if (nbytes)
{
/*
* Replace the tab character (\011) with a blank (\040) */
for (n = 0; n < nbytes; n++)
{
if (buf[n] == '\011')
buf[n] = '\040';
}
XtRemoveInput (*id);
n = 0;
XtSetArg (args[n], XmNvalue, buf); n++;
XtSetValues (scroll_text, args, n);
XtManageChild (messageBox);
/* Fill buf with NULL for the next read */
for (n = 0; n < nbytes; n++)
buf[n] = NULL;
XmStringFree (message_string);
}
}
/*-------------------------------------------------------------
** arm2CB - callback for current directory usage button
*/
void arm2CB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* message box */
Arg args[MAX_ARGS]; /* arg list */
register int n; /* arg count */
int flag;
/* Create message box dialog. */
flag = 2;
message_box = create_dlog (w, flag);
execdu (message_box, flag);
}
/*-------------------------------------------------------------
** arm3CB - callback for current directory usage button
*/
void arm3CB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* message box */
int flag;
/* Create message box dialog. */
flag = 3;
message_box = create_dlog (w, flag);
execdu (message_box, flag);
}
/*-------------------------------------------------------------
** errorCB - callback for continue button in message area
*/
void errorCB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
int n;
Arg args[10];
XmString label_text;
/* Blank error message in main window message area. */
label_text = XmStringCreateLtoR ("Error Message Window", charset);
n = 0;
XtSetArg(args[n], XmNlabelString, label_text); n++;
XtSetValues (errmsg_box, args, n);
XtUnmanageChild (pbg);
XmStringFree (label_text);
}
/*-------------------------------------------------------------
** textf_activateCB - callback for user specified directory
*/
void textf_activateCB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* message box */
Widget button;
Arg args[MAX_ARGS]; /* arg list */
register int n; /* arg count */
int flag, stat_val;
struct stat bufr;
static char errmsg[BUFFERSZ];
XmString errormsg;
/* Get user specified directory from text field widget */
n = 0;
XtSetArg (args[n], XmNvalue, &specified_dir); n++;
XtGetValues (w, args, n);
/* Check for validity of directory path */
stat_val = stat (specified_dir, &bufr);
if (stat_val == 0){
/* Create message box dialog. */
flag = 4;
message_box = create_dlog (w, flag);
execdu (message_box, flag);
}
else {
sprintf (errmsg, "Error! The input directory is probably invalid.\0");
errormsg = XmStringCreateLtoR (errmsg, charset);
n = 0;
XtSetArg (args [n], XmNlabelString, errormsg); n++;
XtSetValues (errmsg_box, args, n);
XtManageChild (pbg);
}
}
/*-------------------------------------------------------------
** HelpCB - callback for help button
*/
void HelpCB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* message box */
/* Create help window. */
message_box = CreateHelp (w);
/* Display help window. */
XtManageChild (message_box);
}
/*-------------------------------------------------------------
** VersionCB - callback for help button
*/
void VersionCB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
Widget message_box; /* message box */
/* Create message window. */
message_box = CreateVersion (w);
/* Display version window. */
XtManageChild (message_box);
}
/*-----------------------------------------------------------------
** create_dlog - create a custom dialog with a scrolled window
*/
Widget create_dlog (parent, flag)
Widget parent; /* parent widget */
int flag;
{
Widget form, sep, button;
Arg args[MAX_ARGS]; /* arg list */
register int n; /* arg count */
XmString button_string = NULL;
XmString title_string = NULL;
static char *titles[5] =
{ NULL,
"Home Directory Usage",
"Current Directory Usage",
"File Space Available",
"User Specified Directory",
};
/* Create a form dialog (dialog shell and form widget) */
title_string = XmStringCreateLtoR(titles[flag],charset);
n =0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
form = XmCreateFormDialog (parent, "form", args, n);
/* Create a scrolled window widget as a child of the form */
n = 0;
XtSetArg (args[n], XmNbottomOffset, 10); n++;
XtSetArg (args[n], XmNtopOffset, 10); n++;
XtSetArg (args[n], XmNleftOffset, 10); n++;
XtSetArg (args[n], XmNrightOffset, 10); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
XtSetArg (args[n], XmNeditable, False); n++;
scroll_text = XmCreateScrolledText (form, "scroll_text", args, n);
XtManageChild (scroll_text);
/* Create a pushbutton to close the dialog */
button_string = XmStringCreateLtoR ("Close", charset);
n = 0;
XtSetArg (args[n], XmNleftOffset, 335); n++;
XtSetArg (args[n], XmNbottomOffset, 10); n++;
XtSetArg (args[n], XmNtopOffset, 10); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg (args[n], XmNtopWidget, scroll_text); n++;
XtSetArg (args[n], XmNlabelString, button_string); n++;
XtSetArg (args[n], XmNshowAsDefault, True); n++;
XtSetArg (args[n], XmNdefaultButtonShadowThickness, 2); n++;
XtSetArg (args[n], XmNheight, 30); n++;
XtSetArg (args[n], XmNwidth, 80); n++;
button = XmCreatePushButton (form, "button", args, n);
XtManageChild (button);
/* Set the defaultButton resource so behavior complies with style guide */
n = 0;
XtSetArg (args[n], XmNdefaultButton, button); n++;
XtSetValues (form, args, n);
/* Free strings */
if (title_string) XmStringFree (title_string);
if (button_string) XmStringFree (button_string);
return (form);
}
/*-------------------------------------------------------------
** CreateHelp - create help window
*/
Widget CreateHelp (parent)
Widget parent; /* parent widget */
{
Widget button;
Widget message_box; /* Message Dialog */
Arg args[MAX_ARGS]; /* arg list */
register int n; /* arg count */
static char message[BUFFERSZ]; /* help text */
XmString title_string = NULL;
XmString message_string = NULL;
XmString button_string = NULL;
/* Generate message to display. */
sprintf (message, "\
This program provides a quick means of finding the disk space used \n\
by a particular directory. You can enter a specific directory path \n\
in the text field widget labeled 'Enter Directory Here' and press \n\
Return or move the pointer to one of the buttons and click button 1. \n\
Another window will appear with a scrolled text containing the \n\
information you want. There may be a slight time delay before this \n\
window appears. To remove this window, move the pointer to the \n\
Close button and click button 1. To exit the \n\
program, move the pointer to the File button and click button 1. An Exit \n\
button appears. Move the pointer into the Exit button and click \n\
button 1. There is a time delay before the program is terminated.\0");
/* Create the compound strings */
message_string = XmStringCreateLtoR (message, charset);
button_string = XmStringCreateLtoR ("Close", charset);
title_string = XmStringCreateLtoR ("diskuse help", charset);
/* Create message box dialog. */
n = 0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
XtSetArg (args[n], XmNokLabelString, button_string); n++;
XtSetArg (args[n], XmNmessageString, message_string); n++;
message_box = XmCreateMessageDialog (parent, "helpbox", args, n);
button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (button);
button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON);
XtUnmanageChild (button);
/* Free strings and return message box. */
if (title_string) XmStringFree (title_string);
if (message_string) XmStringFree (message_string);
if (button_string) XmStringFree (button_string);
return (message_box);
}
/*-------------------------------------------------------------
** CreateVersion - create version window
*/
Widget CreateVersion (parent)
Widget parent; /* parent widget */
{
Widget button;
Widget message_box; /* Message Dialog */
Arg args[MAX_ARGS]; /* arg list */
register int n; /* arg count */
static char message[BUFFERSZ]; /* help text */
XmString title_string = NULL;
XmString message_string = NULL;
XmString button_string = NULL;
char text4[50];
strcpy (text4, &ident1[4]);
/* Generate message to display. */
sprintf (message, "This is %s \0",text4);
/* Create the compound strings */
message_string = XmStringCreateLtoR (message, charset);
button_string = XmStringCreateLtoR ("Close", charset);
title_string = XmStringCreateLtoR ("diskuse help", charset);
/* Create message box dialog. */
n = 0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
XtSetArg (args[n], XmNokLabelString, button_string); n++;
XtSetArg (args[n], XmNmessageString, message_string); n++;
message_box = XmCreateMessageDialog (parent, "versionbox", args, n);
button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (button);
button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON);
XtUnmanageChild (button);
/* Free strings and return message box. */
if (title_string) XmStringFree (title_string);
if (message_string) XmStringFree (message_string);
if (button_string) XmStringFree (button_string);
return (message_box);
}
/*-------------------------------------------------------------
** QuitCB - callback for quit button
*/
void QuitCB (w, client_data, call_data)
Widget w; /* widget ID */
XtPointer client_data; /* data from application */
XtPointer call_data; /* data from widget class */
{
/* Terminate the application. */
exit (0);
}
/***********************************************************************
*** MAIN ***
***********************************************************************/
void main(argc, argv)
unsigned int argc;
char **argv;
{
Widget appshell, main_window, menu_bar, menu_pane, button, rowcol,
textf, pbutton1, pbutton2, pbutton3;
Widget bboard, labelg, cascade, form1;
Arg args[10];
int n;
char *text1 = "Home Directory Usage";
char *text2 = "Current Directory Usage";
char *text3 = "File Space Available";
XmString label_text1;
XmString label_text2;
XmString label_text3;
XmString textf_label;
/*
* Initialize the Xt Intrinsics
*/
appshell = XtAppInitialize(&app_context, "Diskuse", NULL, 0, &argc, argv,
NULL, args, 0);
/* Create main window.
*/
n = 0;
XtSetArg (args[n], XmNshowSeparator, True); n++;
main_window = XmCreateMainWindow (appshell, "main1", args, n);
XtManageChild (main_window);
/* Create menu bar in main window */
n = 0;
menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n);
XtManageChild (menu_bar);
/* Create "File" pulldown menu. */
n = 0;
menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
n = 0;
button = XmCreatePushButton (menu_pane, "Exit", args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback, QuitCB, NULL);
n = 0;
XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
cascade = XmCreateCascadeButton (menu_bar, "File", args, n);
XtManageChild (cascade);
n = 0;
XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++;
XtSetValues (menu_bar, args, n);
/* Create "Help" pulldown menu. */
n = 0;
menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
n = 0;
button = XmCreatePushButton (menu_pane, "Help", args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback, HelpCB, NULL);
n = 0;
button = XmCreatePushButton (menu_pane, "Program Version", args, n);
XtManageChild (button);
XtAddCallback (button, XmNactivateCallback, VersionCB, NULL);
n = 0;
XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
cascade = XmCreateCascadeButton (menu_bar, "Help", args, n);
XtManageChild (cascade);
n = 0;
XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++;
XtSetValues (menu_bar, args, n);
/*
* Create a bulletin board widget to hold label gadget and text field
*/
n = 0;
bboard = XmCreateBulletinBoard (main_window, "bboard", args, n);
XtManageChild(bboard);
/*
* Create a label gadget
*/
textf_label = XmStringCreateLtoR ("Enter Directory Here", charset);
n = 0;
XtSetArg(args[n], XmNx, 10); n++;
XtSetArg(args[n], XmNy, 10); n++;
XtSetArg(args[n], XmNlabelString, textf_label); n++;
labelg = XmCreateLabelGadget (bboard, "labelg", args, n);
XtManageChild(labelg);
XmStringFree(textf_label);
/*
* Create a text field widget
*/
n = 0;
XtSetArg(args[n], XmNx, 10); n++;
XtSetArg(args[n], XmNy, 40); n++;
XtSetArg (args[n], XmNcolumns, 50); n++;
textf = XmCreateTextField (bboard, "textf", args, n);
XtManageChild(textf);
XtAddCallback (textf, XmNactivateCallback, textf_activateCB, NULL);
/*
* Create a row column widget to hold the buttons
*/
n = 0;
XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n++;
XtSetArg(args[n], XmNnumColumns, 1); n++;
rowcol = XmCreateRowColumn (main_window, "rowcol", args, n);
XtManageChild(rowcol);
/*
* Set up compound strings for button labels
*/
label_text1 = XmStringCreateLtoR(text1, XmFONTLIST_DEFAULT_TAG);
label_text2 = XmStringCreateLtoR(text2, XmFONTLIST_DEFAULT_TAG);
label_text3 = XmStringCreateLtoR(text3, XmFONTLIST_DEFAULT_TAG);
/*
* Create the Pushbuttons.
*/
n = 0;
XtSetArg(args[n], XmNlabelString, label_text1); n++;
pbutton1 = XmCreatePushButton(rowcol, "pbutton", args, n);
XtManageChild(pbutton1);
XtAddCallback (pbutton1, XmNarmCallback, arm1CB, NULL);
n = 0;
XtSetArg(args[n], XmNlabelString, label_text2); n++;
pbutton2 = XmCreatePushButton(rowcol, "pbutton", args, n);
XtManageChild(pbutton2);
XtAddCallback (pbutton2, XmNarmCallback, arm2CB, NULL);
n = 0;
XtSetArg(args[n], XmNlabelString, label_text3); n++;
pbutton3 = XmCreatePushButton(rowcol, "pbutton", args, n);
XtManageChild(pbutton3);
XtAddCallback (pbutton3, XmNarmCallback, arm3CB, NULL);
XmStringFree(label_text1);
XmStringFree(label_text2);
XmStringFree(label_text3);
/*
* Create a form widget for error message
*/
n = 0;
form1 = XmCreateForm (main_window, "form1", args, n);
XtManageChild (form1);
/*
* Create a label gadget within the form for error message
*/
label_text1 = XmStringCreateLtoR("Error Message Window", charset);
n = 0;
XtSetArg(args[n], XmNlabelString, label_text1); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
errmsg_box = XmCreateLabelGadget (form1, "errmsg_box", args, n);
XtManageChild(errmsg_box);
XmStringFree(label_text1);
/*
* Create a pushbutton within the form to remove error message
*/
label_text1 = XmStringCreateLtoR("Continue", charset);
n = 0;
XtSetArg(args[n], XmNlabelString, label_text1); n++;
XtSetArg (args[n], XmNtopWidget, errmsg_box); n++;
XtSetArg (args[n], XmNtopOffset, 20); n++;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg (args[n], XmNleftOffset, 210); n++;
pbg = XmCreatePushButton (form1, "pbg", args, n);
XtAddCallback (pbg, XmNactivateCallback, errorCB, NULL);
XmStringFree (label_text1);
/* Set main window areas */
XmMainWindowSetAreas (main_window, menu_bar, bboard, NULL, NULL,
rowcol);
/*Add Message Area in main window */
n = 0;
XtSetArg (args[n], XmNmessageWindow, (XtArgVal) form1); n++;
XtSetValues (main_window, args, n);
/*
* Realize the appshell widget, which displays all children
*/
XtRealizeWidget(appshell);
/*
* Go into a loop and wait for input
*/
XtAppMainLoop(app_context);
}