|
|
1.1 root 1: #include <stdlib.h>
2: #include "util_funcs.h"
3: #include "dirwrap.h"
4: #include "threadwrap.h"
5: #include "gtkmonitor.h"
6: #include "semwrap.h"
7:
8: int run_cmd_mutex_initalized=0;
9: pthread_mutex_t run_cmd_mutex;
10:
11: /*****************************************************************************/
12: /* Returns command line generated from instr with %c replacments */
13: /*****************************************************************************/
14: char *mycmdstr(char *instr, char *fpath)
15: {
16: char str[256],str2[128];
17: int i,j,len;
18: #if 0
19: char cmd[MAX_PATH+1];
20: #else
21: char *cmd;
22: #endif
23:
24: cmd=(char *)malloc(MAX_PATH+1);
25: if(cmd==NULL) {
26: display_message("malloc() Error", "Cannot allocate enough memory for the message", "gtk-dialog-error");
27: return(NULL);
28: }
29: len=strlen(instr);
30: for(i=j=0;i<len && j<128;i++) {
31: if(instr[i]=='%') {
32: i++;
33: cmd[j]=0;
34: switch(toupper(instr[i])) {
35: case 'F': /* File path */
36: strcat(cmd,fpath);
37: break;
38: case 'G': /* Temp directory */
39: if(cfg.temp_dir[0]!='\\'
40: && cfg.temp_dir[0]!='/'
41: && cfg.temp_dir[1]!=':') {
42: strcpy(str,cfg.ctrl_dir);
43: strcat(str,cfg.temp_dir);
44: if(FULLPATH(str2,str,40))
45: strcpy(str,str2);
46: backslash(str);
47: strcat(cmd,str);
48: }
49: else
50: strcat(cmd,cfg.temp_dir);
51: break;
52: case 'J':
53: if(cfg.data_dir[0]!='\\'
54: && cfg.data_dir[0]!='/'
55: && cfg.data_dir[1]!=':') {
56: strcpy(str,cfg.ctrl_dir);
57: strcat(str,cfg.data_dir);
58: if(FULLPATH(str2,str,40))
59: strcpy(str,str2);
60: backslash(str);
61: strcat(cmd,str);
62: }
63: else
64: strcat(cmd,cfg.data_dir);
65: break;
66: case 'K':
67: strcat(cmd,cfg.ctrl_dir);
68: break;
69: case 'O': /* SysOp */
70: strcat(cmd,cfg.sys_op);
71: break;
72: case 'Q': /* QWK ID */
73: strcat(cmd,cfg.sys_id);
74: break;
75: case '!': /* EXEC Directory */
76: strcat(cmd,cfg.exec_dir);
77: break;
78: case '@': /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
79: #ifndef __unix__
80: strcat(cmd,cfg.exec_dir);
81: #endif
82: break;
83: case '%': /* %% for percent sign */
84: strcat(cmd,"%");
85: break;
86: case '.': /* .exe for DOS/OS2/Win32, blank for Unix */
87: #ifndef __unix__
88: strcat(cmd,".exe");
89: #endif
90: break;
91: case '?': /* Platform */
92: #ifdef __OS2__
93: strcpy(str,"OS2");
94: #else
95: strcpy(str,PLATFORM_DESC);
96: #endif
97: strlwr(str);
98: strcat(cmd,str);
99: break;
100: default: /* unknown specification */
101: sprintf(cmd,"ERROR Checking Command Line '%s'",instr);
102: display_message("Command line Error",cmd,"gtk-dialog-error");
103: free(cmd);
104: return(NULL);
105: }
106: j=strlen(cmd);
107: }
108: else
109: cmd[j++]=instr[i];
110: }
111: cmd[j]=0;
112:
113: return(cmd);
114: }
115:
116: void exec_cmdline(void *cmdline)
117: {
118: GtkWidget *w;
119:
120: if(cmdline==NULL)
121: return;
122: if(!run_cmd_mutex_initalized) {
123: pthread_mutex_init(&run_cmd_mutex, NULL);
124: run_cmd_mutex_initalized=1;
125: }
126: pthread_mutex_lock(&run_cmd_mutex);
127: system((char *)cmdline);
128: free(cmdline);
129: w=glade_xml_get_widget(xml, "MainWindow");
130: gtk_widget_set_sensitive(GTK_WIDGET(w), TRUE);
131: pthread_mutex_unlock(&run_cmd_mutex);
132: }
133:
134: char *complete_path(char *dest, char *path, char *filename)
135: {
136: if(path != NULL) {
137: strcpy(dest, path);
138: backslash(dest);
139: }
140: else
141: dest[0]=0;
142:
143: if(filename != NULL)
144: strcat(dest, filename);
145: fexistcase(dest); /* TODO: Hack: Fixes upr/lwr case fname */
146: return(dest);
147: }
148:
149: void run_external(char *path, char *filename)
150: {
151: static char cmdline[MAX_PATH*2];
152: GtkWidget *w;
153:
154: w=glade_xml_get_widget(xml, "MainWindow");
155: gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
156: complete_path(cmdline,path,filename);
157: _beginthread(exec_cmdline, 0, strdup(cmdline));
158: }
159:
160: void exec_cmdstr(char *cmdstr, char *path, char *filename)
161: {
162: char p[MAX_PATH+1];
163: GtkWidget *w;
164:
165: complete_path(p,path,filename);
166: w=glade_xml_get_widget(xml, "MainWindow");
167: gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
168: _beginthread(exec_cmdline, 0, mycmdstr(cmdstr, p));
169: }
170:
171: void touch_sem(char *path, char *filename)
172: {
173: char fn[MAX_PATH*2];
174:
175: ftouch(complete_path(fn,path,filename));
176: }
177:
178: /* Assumes a 12 char outstr */
179: char *getsizestr(char *outstr, long size, BOOL bytes) {
180: if(bytes) {
181: if(size < 1000) { /* Bytes */
182: snprintf(outstr,12,"%ld bytes",size);
183: return(outstr);
184: }
185: if(size<10000) { /* Bytes with comma */
186: snprintf(outstr,12,"%ld,%03ld bytes",(size/1000),(size%1000));
187: return(outstr);
188: }
189: size = size/1024;
190: }
191: if(size<1000) { /* KB */
192: snprintf(outstr,12,"%ld KB",size);
193: return(outstr);
194: }
195: if(size<999999) { /* KB With comma */
196: snprintf(outstr,12,"%ld,%03ld KB",(size/1000),(size%1000));
197: return(outstr);
198: }
199: size = size/1024;
200: if(size<1000) { /* MB */
201: snprintf(outstr,12,"%ld MB",size);
202: return(outstr);
203: }
204: if(size<999999) { /* MB With comma */
205: snprintf(outstr,12,"%ld,%03ld MB",(size/1000),(size%1000));
206: return(outstr);
207: }
208: size = size/1024;
209: if(size<1000) { /* GB */
210: snprintf(outstr,12,"%ld GB",size);
211: return(outstr);
212: }
213: if(size<999999) { /* GB With comma */
214: snprintf(outstr,12,"%ld,%03ld GB",(size/1000),(size%1000));
215: return(outstr);
216: }
217: size = size/1024;
218: if(size<1000) { /* TB (Yeah, right) */
219: snprintf(outstr,12,"%ld TB",size);
220: return(outstr);
221: }
222: sprintf(outstr,"Plenty");
223: return(outstr);
224: }
225:
226: /* Assumes a 12 char outstr */
227: char *getnumstr(char *outstr, ulong size) {
228: if(size < 1000) {
229: snprintf(outstr,12,"%ld",size);
230: return(outstr);
231: }
232: if(size<1000000) {
233: snprintf(outstr,12,"%ld,%03ld",(size/1000),(size%1000));
234: return(outstr);
235: }
236: if(size<1000000000) {
237: snprintf(outstr,12,"%ld,%03ld,%03ld",(size/1000000),((size/1000)%1000),(size%1000));
238: return(outstr);
239: }
240: size=size/1000000;
241: if(size<1000000) {
242: snprintf(outstr,12,"%ld,%03ld M",(size/1000),(size%1000));
243: return(outstr);
244: }
245: if(size<10000000) {
246: snprintf(outstr,12,"%ld,%03ld,%03ld M",(size/1000000),((size/1000)%1000),(size%1000));
247: return(outstr);
248: }
249: sprintf(outstr,"Plenty");
250: return(outstr);
251: }
252:
253: void display_message(char *title, char *message, char *icon)
254: {
255: GtkWidget *dialog, *label;
256:
257: dialog=gtk_dialog_new_with_buttons(title
258: ,GTK_WINDOW(glade_xml_get_widget(xml, "MainWindow"))
259: ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
260: ,GTK_STOCK_OK
261: ,GTK_RESPONSE_NONE
262: ,NULL);
263: if(icon==NULL)
264: icon="gtk-info";
265: gtk_window_set_icon_name(GTK_WINDOW(dialog), icon);
266: label = gtk_label_new (message);
267:
268: g_signal_connect_swapped (dialog
269: ,"response"
270: ,G_CALLBACK(gtk_widget_destroy)
271: ,dialog);
272: gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
273: label);
274: gtk_widget_show_all (dialog);
275: gtk_dialog_run(GTK_DIALOG(dialog));
276: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.