blob: a242c686891999c3bd4cd4584076be3a6c71a436 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3//fileedit.c
4//
5// $Id: fileedit.c 9142 2015-02-04 22:17:29Z Zesstra $
6#pragma strict_types
7#pragma save_types
8//#pragma range_check
9#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020010
Zesstra876b0d62018-11-08 20:52:22 +010011protected functions virtual inherit "/std/util/path";
12
MG Mud User88f12472016-06-24 23:31:02 +020013#include <wizlevels.h>
14#include <input_to.h>
15
16#define NEED_PROTOTYPES
17#include <magier.h>
18#include <player.h>
19#include <files.h>
20
21// ###################
22//######################### INITIALISIERUNG #############################
23// ###################
24
25mixed _query_localcmds()
26{
27 return ({ ({"cp","_cp",0,WIZARD_LVL}),
28 ({"mv","_cp",0,WIZARD_LVL}),
29 ({"rm","_rm",0,WIZARD_LVL}),
30 ({"rmdir","_rmdir",0,WIZARD_LVL}),
31 ({"mkdir","_mkdir",0,WIZARD_LVL}),
32 ({"ed","_ed",0,WIZARD_LVL})});
33}
34
35// ######
36//################################ ED ###################################
37// ######
38
39
40//
41// _ed_file: Mehrere Files hintereinander editieren
42//
43
44private nosave string *_ed_cache;
45
46private void _ed_file()
47{
48 if (!sizeof(_ed_cache)) return;
49 printf("ed: Naechste Datei: %s\n",_ed_cache[0]);
50 ed(_ed_cache[0],"_ed_file");
51 _ed_cache=_ed_cache[1..];
52 return;
53}
54
MG Mud User88f12472016-06-24 23:31:02 +020055//
56// _more: Dateien anzeigen
57// cmdline: Kommandozeile
58//
59
60static int _ed(string cmdline)
61{
62 mixed *args,*args2;
Arathornb3051452021-05-13 21:13:03 +020063 int flags,arg_size;
MG Mud User88f12472016-06-24 23:31:02 +020064 cmdline=_unparsed_args();
65 args=parseargs(cmdline,&flags,"",1);
66 if (flags==-1||!(arg_size=sizeof(args)))
67 return USAGE("ed <datei> [<datei2>..]");
68 while(arg_size--)
69 {
70 if (sizeof(args2=file_list(args[arg_size..arg_size],MODE_ED,0,"/")))
71 args[arg_size..arg_size]=args2;
72 else
Zesstra876b0d62018-11-08 20:52:22 +010073 args[arg_size]=({ "" , -1, 0 ,
74 normalize_path(args[arg_size], getuid(), 1) });
MG Mud User88f12472016-06-24 23:31:02 +020075 }
MG Mud User88f12472016-06-24 23:31:02 +020076 args=map(args,(:
Zesstra8fa30f92018-11-08 20:50:06 +010077 if ($1[FILESIZE]>=FSIZE_NOFILE) return $1[FULLNAME];
MG Mud User88f12472016-06-24 23:31:02 +020078 printf("%s ist ein Verzeichnis.\n",$1[FULLNAME]);
79 return 0; :))-({0});
MG Mud User88f12472016-06-24 23:31:02 +020080 if (flags==-1||!sizeof(args)) return USAGE("ed <datei> [<datei2>..]");
81 _ed_cache=args;
82 _ed_file();
83 return 1;
84}
85
86
87// ###########
88//############################## CP & MV ################################
89// ###########
90
91static void _cp_ask_copy(mixed *filedata,int dummy, int flags);
92static void _cp_ask_overwrite(mixed *filedata, int mode, int flags);
93static void _mv_ask_overwrite(mixed *filedata, int mode, int flags);
94
95static mixed cp_file(mixed filedata,int move,int flags, mixed *do_delete)
96{
97 string source,dest;
Vanion50652322020-03-10 21:13:25 +010098 source=filedata[FULLNAME];
99 dest=filedata[DESTNAME];
MG Mud User88f12472016-06-24 23:31:02 +0200100 if (source==dest) return ERROR(SAME_FILE,source,RET_FAIL);
101 if (!MAY_READ(source)) return ERROR(NO_READ,source,RET_JUMP);
102 if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,RET_JUMP);
103 if (filedata[FILESIZE]==-1) return ERROR(DOESNT_EXIST,source,RET_JUMP);
104 if (filedata[FILESIZE]==-2) // Quelle ist Verzeichnis
105 {
106 switch(file_size(dest))
107 {
Zesstra8fa30f92018-11-08 20:50:06 +0100108 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200109 if (move)
110 {
111 if (rename(source,dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
112 if (flags&CP_V) printf(FILE_MOVED,source);
113 return RET_JUMP;
114 }
115 if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
116 if (flags&CP_V) printf(DIR_CREATED,dest);
Zesstra8fa30f92018-11-08 20:50:06 +0100117 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200118 if (!move) return RET_OK;
119 if (filedata[SUBDIRSIZE]>0) return RET_DELETE;
120 if (!rmdir(source)) return ERROR(NO_DELETE,source,RET_FAIL);
121 if (flags&MV_V) printf("mv: %s: Quellverzeichnis wurde "
122 "geloescht.\n",source);
123 return RET_OK;
124 default: return ERROR(NO_DIRS,dest,RET_JUMP);
125 }
126 }
127 switch(file_size(dest))
128 {
Zesstra8fa30f92018-11-08 20:50:06 +0100129 case FSIZE_DIR: return ERROR(DEST_IS_DIR,dest,RET_FAIL);
MG Mud User88f12472016-06-24 23:31:02 +0200130 default:
131 if (flags&CP_F)
132 {
133 if (!rm(dest)) return ERROR(DEST_NO_DELETE,dest,RET_FAIL);
134 if (flags&CP_V) printf(FILE_DELETED,dest);
135 }
136 else
137 {
138 if (move) return #'_mv_ask_overwrite;
139 else return #'_cp_ask_overwrite;
140 }
Zesstra8fa30f92018-11-08 20:50:06 +0100141 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200142 if (move)
143 {
144 if (rename(source,dest)) return ERROR(NO_MOVE,source,RET_FAIL);
145 if (flags&CP_V) printf(FILE_MOVED,source);
146 return RET_OK;
147 }
148 if (copy_file(source,dest)) return ERROR(NO_COPY,source,RET_FAIL);
149 if (flags&CP_V) printf(FILE_COPIED,source);
150 return RET_OK;
151 }
MG Mud User88f12472016-06-24 23:31:02 +0200152}
153
154static void _cp_ask_overwrite2(string input, mixed *filedata,
155 int interactive,int flags,int move)
156{
157 if (!sizeof(input)) input=" ";
158 input=lower_case(input);
159 switch(input[0])
160 {
161 case 'q':
162 printf("%s abgebrochen!\n",move?"Bewegen":"Kopieren");
163 return;
164 case 'a':
165 flags|=CP_F;
166 if (!(flags&CP_I))
167 {
168 asynchron(filedata,#'cp_file,move,flags,0);
169 return;
170 }
171 case 'y':
172 case 'j':
173 if (!rm(filedata[0][DESTNAME]))
174 printf(DEST_NO_DELETE "Uebergehe Datei...\n",filedata[0][DESTNAME]);
175 else
176 {
177 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
178 if (move)
179 {
180 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
181 printf(NO_MOVE "Uebergehe Datei...\n",filedata[0][FULLNAME]);
182 }
183 else
184 {
185 if (copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]))
186 printf(NO_COPY "Uebergehe Datei...\n",filedata[0][FULLNAME]);
187 }
188 }
189 case 'n':
190 if (flags&CP_I)
191 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
192 else
193 asynchron(filedata[1+filedata[0][SUBDIRSIZE]..],
194 #'cp_file,move,flags,0);
195 return;
196 default:
197 printf("Kommando nicht verstanden.\n");
198 _cp_ask_overwrite(filedata,interactive,flags);
199 return;
200 }
201
202}
203
204static void _cp_ask_overwrite(mixed *filedata, int interactive, int flags)
205{
206 printf("Die Datei '%s' existiert schon.\n",
207 filedata[0][DESTNAME]);
208 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
209 filedata,interactive,flags,0);
210 return;
211}
212
213static void _mv_ask_overwrite(mixed *filedata, int interactive, int flags)
214{
215 printf("Die Datei '%s' existiert schon.",
216 filedata[0][DESTNAME]);
217 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
218 filedata,interactive,flags,1);
219 return;
220}
221
222static void _cp_ask_copy2(string input,mixed *filedata,int mode,
223 int flags,int move)
224{
225 if (!sizeof(input)) input=" ";
226 input=lower_case(input);
227 switch(input[0])
228 {
229 case 'y':
230 case 'j':
231 if (mode==1)
232 {
233 if (!(flags&CP_F))
234 {
235 if (move) _mv_ask_overwrite(filedata,1,flags);
236 else _cp_ask_overwrite(filedata,1,flags);
237 return;
238 }
239 if (!rm(filedata[0][DESTNAME]))
240 {
241 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
242 filedata[0][DESTNAME]);
243 _cp_ask_copy(filedata[1..],move,flags);
244 return;
245 }
246 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
247 }
248 if (mode<2)
249 {
250 if (move) rename(filedata[0][FULLNAME],filedata[0][DESTNAME]);
251 else copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]);
252 _cp_ask_copy(filedata[1..],move,flags);
253 return;
254 }
255 if (mode==2)
256 {
257 if (move)
258 {
259 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
260 printf(NO_MOVE "Uebergehe Verzeichnis...\n",
261 filedata[0][FULLNAME]);
262 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
263 return;
264 }
265 if (mkdir(filedata[0][DESTNAME]))
266 {
267 _cp_ask_copy(filedata[1..],0,flags);
268 return;
269 }
270 printf(NO_CREATE_DIR "Uebergehe Verzeichnis...\n",
271 filedata[0][DESTNAME]);
272 }
273 case 'n':
274 _cp_ask_copy(filedata[(1+filedata[0][SUBDIRSIZE])..],0,flags);
275 return;
276 case 'q':
277 printf("Kopieren abgebrochen!\n");
278 return;
279 case 'a':
280 flags&=~CP_I;
281 asynchron(filedata,#'cp_file,move,flags,0);
282 return;
283 default:
284 printf("Kommando nicht verstanden.\n");
285 _cp_ask_copy(filedata,0,flags);
286 return;
287 }
288}
289
290static void _cp_ask_copy(mixed *filedata,int move, int flags)
291{
MG Mud User88f12472016-06-24 23:31:02 +0200292 string dest,source;
Arathornb3051452021-05-13 21:13:03 +0200293 int jump;
MG Mud User88f12472016-06-24 23:31:02 +0200294
295 if(!sizeof(filedata))
296 {
297 printf("%s: abgeschlossen.\n",move?"mv":"cp");
298 return;
299 }
300 dest=filedata[0][DESTNAME];
301 source=filedata[0][FULLNAME];
302 switch(0) // break wirkt damit wie ein goto end_of_switch
303 {
304 default:
305 case 0: // Sinnlos, aber er compiliert sonst nicht :(
306 jump=filedata[0][SUBDIRSIZE];
307 if (source==dest)
308 {
309 printf(SAME_FILE,source);
310 break;
311 }
312 if (!MAY_READ(source))
313 {
314 printf(NO_READ,source);
315 break;
316 }
317 if (!MAY_WRITE(dest))
318 {
319 printf(NO_WRITE,dest);
320 jump=0;
321 break;
322 }
Zesstra8fa30f92018-11-08 20:50:06 +0100323 if (filedata[0][FILESIZE]==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200324 {
325 printf(DOESNT_EXIST,source);
326 break;
327 }
Zesstra8fa30f92018-11-08 20:50:06 +0100328 if (filedata[0][FILESIZE]==FSIZE_DIR) // Quelle ist Verzeichnis
MG Mud User88f12472016-06-24 23:31:02 +0200329 {
Zesstra8fa30f92018-11-08 20:50:06 +0100330 if (file_size(dest)>FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200331 {
332 printf(NO_DIRS,dest);
333 break;
334 }
Zesstra8fa30f92018-11-08 20:50:06 +0100335 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200336 {
337 jump=0;
338 break;
339 }
340 printf("Verzeichnis '%s' %s?\n",source,
341 move?"bewegen":"kopieren");
342 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
343 filedata,2,flags,move);
344 return;
345 }
Zesstra8fa30f92018-11-08 20:50:06 +0100346 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200347 {
348 printf(DEST_IS_DIR,dest);
349 break;
350 }
351 printf("'%s' %s?\n",source,move?"bewegen":"kopieren");
352 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
353 filedata,(file_size(dest)!=-1),flags,move);
354 return;
355 }
356 _cp_ask_copy(filedata[1+jump..],move,flags);
357 return;
358}
359
360
361static int _cp(string cmdline)
362{
363 mixed *args;
364 int flags;
365 string mask;
366 string dest,*dest2;
367 cmdline=_unparsed_args();
368 args=parseargs(cmdline,&flags,CP_OPTS,0);
369 if (flags==-1||!sizeof(args))
370 return USAGE(query_verb()+" [-" CP_OPTS
371 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
372 if (flags&CP_M)
373 {
374 mask=args[<1];
375 args=args[0..<2];
376 }
377 if (!dest=to_filename(args[<1]))
378 return USAGE(query_verb()+" [-" CP_OPTS
379 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
Zesstra8fa30f92018-11-08 20:50:06 +0100380 if (file_size(dest)==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200381 {
382 dest2=explode(dest,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100383 if (file_size(implode(dest2[0..<2],"/"))==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200384 {
385 if (dest2[<1]=="*")
386 dest=implode(dest2[0..<2],"/");
387 else
388 if (member(dest2[<1],'*')>-1||
389 member(dest2[<1],'?')>-1)
390 return notify_fail(
391 sprintf("%s: Keine * und ? im Zielnamen erlaubt.\n",query_verb())),0;
392 }
393 else
394 return notify_fail(
395 sprintf("%s: Der angegebene Zielpfad existiert nicht.\n",
396 query_verb())),0;
397 }
398 args=args[0..<2];
Zesstra8fa30f92018-11-08 20:50:06 +0100399 if (file_size(dest)!=FSIZE_DIR && sizeof(args)>1)
MG Mud User88f12472016-06-24 23:31:02 +0200400 return notify_fail(
401 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
402 "sein.\n",query_verb())),0;
403 if (!sizeof(args=map(args,#'to_filename)-({0})))
404 return USAGE(query_verb()+" [-" CP_OPTS
405 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
406 // DEBUG("DEST: " + dest + " : FLAGS: " + flags);
407 args=file_list(args,MODE_CP,(flags&CP_R),dest+"/",mask);
408 if (!sizeof(args))
409 return notify_fail(sprintf("%s: Keine passenden Dateien gefunden.\n",
410 query_verb())),0;
411
Zesstra8fa30f92018-11-08 20:50:06 +0100412 if (sizeof(args)>1&&(args[0][FILESIZE]>=0)&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200413 return notify_fail(
414 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
415 "sein.\n",query_verb())),0;
Zesstra8fa30f92018-11-08 20:50:06 +0100416 if (sizeof(args)==1&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200417 args[0][DESTNAME]=dest;
418 if (!(flags&CP_I))
419 {
420 asynchron(args,#'cp_file,(query_verb()=="mv"),flags,0);
421 return 1;
422 }
423 if (query_verb()=="cp")
424 _cp_ask_copy(args,0,flags);
425 else
426 _cp_ask_copy(args,1,flags);
427 return 1;
428}
429
430// #########
431//############################### RMDIR #################################
432// #########
433
434
435//
436// _rmdir: Verzeichnis loeschen
437// cmdline: Kommandozeilenargumente
438//
439
MG Mud User88f12472016-06-24 23:31:02 +0200440static int _rmdir(string cmdline)
441{
Arathornb3051452021-05-13 21:13:03 +0200442 string dest;
MG Mud User88f12472016-06-24 23:31:02 +0200443 int flags;
444 mixed *args;
445
446 cmdline=_unparsed_args();
447 args=parseargs(cmdline,&flags,RMDIR_OPTS,1);
448 if (flags==-1||!sizeof(args))
449 return USAGE("rmdir [-" RMDIR_OPTS "] <Verzeichnis>");
450 if (sizeof(args)>1)
451 return
452 notify_fail("Mit 'rmdir' kann nur jeweils EIN Verzeichnis geloescht "
453 "werden.\nDer Befehl 'rm' bietet erweiterte Moeglichkeiten.\n"),0;
454 dest=args[0];
455 if (dest!="/")
456 {
457 args=file_list(({dest}),MODE_RMDIR,0,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100458 args=filter(args,(: ($1[FILESIZE]==FSIZE_DIR) :));
MG Mud User88f12472016-06-24 23:31:02 +0200459 if (!sizeof(args))
460 return notify_fail(
461 sprintf("rmdir: %s: Kein solches Verzeichnis gefunden.\n",dest)),0;
462 if (sizeof(args)>1)
463 return notify_fail(
464 sprintf("rmdir: %s: Maske ist nicht eindeutig.\n",dest)),0;
465 dest=args[0][FULLNAME];
466 if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,1);
467 if (!rmdir(dest))
468 {
469 if (sizeof((get_dir(dest+"/*")||({}))-({".",".."})))
470 printf("rmdir: %s: Verzeichnis ist nicht leer.\n",dest);
471 }
472 else
473 {
474 if (flags&&RMDIR_V) printf(FILE_DELETED,dest);
475 }
476 return 1;
477 }
478 return ERROR(NO_DELETE,dest,1);
479}
480
481// #########
482//############################### MKDIR #################################
483// #########
484
485
486//
487// _mkdir: Verzeichnis erstellen
488// cmdline: Kommandozeilenargumente
489//
490
491static int _mkdir(string cmdline)
492{
Arathornb3051452021-05-13 21:13:03 +0200493 string dest;
MG Mud User88f12472016-06-24 23:31:02 +0200494 int flags,i;
495 string *args;
496
497 cmdline=_unparsed_args();
498 args=parseargs(cmdline,&flags,MKDIR_OPTS,1);
499 if (flags==-1) return 0;
500 if (!sizeof(args))
501 return USAGE("mkdir [-" MKDIR_OPTS "] <Verzeichnis>");
502 if (sizeof(args)>1)
503 return notify_fail("Mit 'mkdir' kann nur jeweils EIN Verzeichnis "
504 "erstellt werden.\n"),0;
505 dest=args[0];
506
507 if ((i=file_size(implode((args=explode(dest,"/"))[0..<2],"/")))==FSIZE_DIR)
508 {
509 if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,1);
510 if (flags&MKDIR_V) printf(DIR_CREATED,dest,1);
511 printf("mkdir: abgeschlossen.\n");
512 return 1;
513 }
514
515 if (i==FSIZE_NOFILE)
516 {
517 if (flags&MKDIR_R)
518 {
519 if (mkdirp(dest) != 1)
520 return ERROR(NO_CREATE_DIR,dest,1);
521 if (flags&MKDIR_V)
522 printf(DIR_CREATED,implode(args[0..i],"/"));
523 printf("mkdir: abgeschlossen.\n");
524 return 1;
525 }
526 return ERROR(DOESNT_EXIST,implode(args[0..<2],"/"),1);
527 }
528 return ERROR(ALREADY_EXISTS,dest,1);
529}
530
531// ######
532//################################ RM ###################################
533// ######
534
535private void _rm_ask_delete(mixed *filedata, int flags);
536
537static void _rm_ask_delete2(string input,mixed *filedata,int flags)
538{
539 int i;
540 if (!sizeof(input)) input=" ";
541 input=lower_case(input);
542 switch(input[0])
543 {
544 case 'q':
545 printf("Loeschen abgebrochen!\n");
546 return;
547 case 'y':
548 case 'j':
Zesstra8fa30f92018-11-08 20:50:06 +0100549 if (filedata[0][FILESIZE]==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200550 {
551 if (i=filedata[0][SUBDIRSIZE]) // Dir-Eintrag nach hinten schieben
552 {
553 mixed temp;
554 int j;
555 temp=filedata[0];
556 temp[SUBDIRSIZE]=0;
557 for(j=0;j<i;j++) filedata[j]=filedata[j+1];
558 filedata[j]=temp;
559 _rm_ask_delete(filedata,flags);
560 return;
561 }
562 if (!rmdir(filedata[0][FULLNAME]))
563 printf(NO_DELETE,filedata[0][FULLNAME]);
564 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
565 }
566 else // Datei existiert
567 {
568 if (!rm(filedata[0][FULLNAME]))
569 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
570 filedata[0][FULLNAME]);
571 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
572
573 }
574 case 'n':
575 _rm_ask_delete(filedata[1+filedata[0][SUBDIRSIZE]..],flags);
576 return;
577 default:
578 printf("Kommando nicht verstanden.\n");
579 _rm_ask_delete(filedata,flags);
580 return;
581 }
MG Mud User88f12472016-06-24 23:31:02 +0200582}
583
584private void _rm_ask_delete(mixed *filedata, int flags)
585{
MG Mud User88f12472016-06-24 23:31:02 +0200586 if (!sizeof(filedata))
587 {
588 printf("rm: abgeschlossen.\n");
589 return;
590 }
591 switch(filedata[0][FILESIZE])
592 {
Zesstra8fa30f92018-11-08 20:50:06 +0100593 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200594 if (flags&RM_V) printf(DOESNT_EXIST,filedata[0][FULLNAME]);
595 _rm_ask_delete(filedata[1..],flags);
596 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100597 case FSIZE_DIR:
Arathornb3051452021-05-13 21:13:03 +0200598 if (filedata[0][SUBDIRSIZE])
MG Mud User88f12472016-06-24 23:31:02 +0200599 printf("Ins Verzeichnis '%s' hinabsteigen?\n",
600 filedata[0][FULLNAME]);
601 else
602 printf("Verzeichnis '%s' loeschen?\n",
603 filedata[0][FULLNAME]);
604 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
605 filedata,flags);
606 return;
607 default:
608 printf("'%s' loeschen? (j,n,q)\n",
609 filedata[0][FULLNAME]);
610 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
611 filedata,flags);
612 return;
613 }
614}
615
616
617private void rm_file(mixed filedata, mixed notused, int flags)
618{
619 string dest;
620 dest=filedata[FULLNAME];
621 if (!MAY_WRITE(dest))
622 {
623 printf(NO_WRITE,dest);
624 return;
625 }
626 switch(filedata[FILESIZE])
627 {
Zesstra8fa30f92018-11-08 20:50:06 +0100628 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200629 if (flags&RM_V) printf(DOESNT_EXIST,dest);
630 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100631 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200632 if (!rmdir(dest)) printf(DEST_NO_DELETE,dest);
633 else
634 {
635 if (flags&RM_V) printf(FILE_DELETED,dest);
636 }
637 return;
638 default:
639 if (!rm(dest)) printf(DEST_NO_DELETE,dest);
640 else
641 {
642 if (flags&RM_V) printf(FILE_DELETED,dest);
643 }
644 return;
645 }
646}
647
648static int _rm(string cmdline)
649{
Arathornb3051452021-05-13 21:13:03 +0200650 mixed *args;
MG Mud User88f12472016-06-24 23:31:02 +0200651 int flags,i;
652 string mask;
653
654 cmdline=_unparsed_args();
655 args=parseargs(cmdline,&flags,RM_OPTS,0);
656 if (flags==-1||!sizeof(args))
657 return USAGE("rm [-" RM_OPTS
658 "] <datei/verz> [<datei2/verz2> ... ] [<maske>]");
659 if (flags&RM_M)
660 {
661 mask=args[<1];
662 args=args[0..<2];
663 }
664 args=map(args,#'to_filename)-({0});
665 args=file_list(args,MODE_RM,(flags&RM_R),"/",mask);
666 if (!(i=sizeof(args)))
667 return printf("Keine passende Datei gefunden.\n"),1;
668 if (!(flags&RM_I))
669 {
670 if (i>1) // Umdrehen
671 {
672 mixed temp;
673 i>>=1;
674 while(i)
675 {
676 temp=args[<(i--)];
677 args[<(i+1)]=args[i];
678 args[i]=temp;
679 }
680 }
681 asynchron(args,#'rm_file,args,flags,0);
682 return 1;
683 }
684 _rm_ask_delete(args,flags);
685 return 1;
686}