blob: b5585859a467f279b4588e9b2ae27ea3c64bdf17 [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;
63 int flags,i,arg_size;
64 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;
98 source=(string)filedata[FULLNAME];
99 dest=(string)filedata[DESTNAME];
100 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 }
152 return 0; // not-reached
153}
154
155static void _cp_ask_overwrite2(string input, mixed *filedata,
156 int interactive,int flags,int move)
157{
158 if (!sizeof(input)) input=" ";
159 input=lower_case(input);
160 switch(input[0])
161 {
162 case 'q':
163 printf("%s abgebrochen!\n",move?"Bewegen":"Kopieren");
164 return;
165 case 'a':
166 flags|=CP_F;
167 if (!(flags&CP_I))
168 {
169 asynchron(filedata,#'cp_file,move,flags,0);
170 return;
171 }
172 case 'y':
173 case 'j':
174 if (!rm(filedata[0][DESTNAME]))
175 printf(DEST_NO_DELETE "Uebergehe Datei...\n",filedata[0][DESTNAME]);
176 else
177 {
178 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
179 if (move)
180 {
181 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
182 printf(NO_MOVE "Uebergehe Datei...\n",filedata[0][FULLNAME]);
183 }
184 else
185 {
186 if (copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]))
187 printf(NO_COPY "Uebergehe Datei...\n",filedata[0][FULLNAME]);
188 }
189 }
190 case 'n':
191 if (flags&CP_I)
192 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
193 else
194 asynchron(filedata[1+filedata[0][SUBDIRSIZE]..],
195 #'cp_file,move,flags,0);
196 return;
197 default:
198 printf("Kommando nicht verstanden.\n");
199 _cp_ask_overwrite(filedata,interactive,flags);
200 return;
201 }
202
203}
204
205static void _cp_ask_overwrite(mixed *filedata, int interactive, int flags)
206{
207 printf("Die Datei '%s' existiert schon.\n",
208 filedata[0][DESTNAME]);
209 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
210 filedata,interactive,flags,0);
211 return;
212}
213
214static void _mv_ask_overwrite(mixed *filedata, int interactive, int flags)
215{
216 printf("Die Datei '%s' existiert schon.",
217 filedata[0][DESTNAME]);
218 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
219 filedata,interactive,flags,1);
220 return;
221}
222
223static void _cp_ask_copy2(string input,mixed *filedata,int mode,
224 int flags,int move)
225{
226 if (!sizeof(input)) input=" ";
227 input=lower_case(input);
228 switch(input[0])
229 {
230 case 'y':
231 case 'j':
232 if (mode==1)
233 {
234 if (!(flags&CP_F))
235 {
236 if (move) _mv_ask_overwrite(filedata,1,flags);
237 else _cp_ask_overwrite(filedata,1,flags);
238 return;
239 }
240 if (!rm(filedata[0][DESTNAME]))
241 {
242 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
243 filedata[0][DESTNAME]);
244 _cp_ask_copy(filedata[1..],move,flags);
245 return;
246 }
247 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
248 }
249 if (mode<2)
250 {
251 if (move) rename(filedata[0][FULLNAME],filedata[0][DESTNAME]);
252 else copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]);
253 _cp_ask_copy(filedata[1..],move,flags);
254 return;
255 }
256 if (mode==2)
257 {
258 if (move)
259 {
260 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
261 printf(NO_MOVE "Uebergehe Verzeichnis...\n",
262 filedata[0][FULLNAME]);
263 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
264 return;
265 }
266 if (mkdir(filedata[0][DESTNAME]))
267 {
268 _cp_ask_copy(filedata[1..],0,flags);
269 return;
270 }
271 printf(NO_CREATE_DIR "Uebergehe Verzeichnis...\n",
272 filedata[0][DESTNAME]);
273 }
274 case 'n':
275 _cp_ask_copy(filedata[(1+filedata[0][SUBDIRSIZE])..],0,flags);
276 return;
277 case 'q':
278 printf("Kopieren abgebrochen!\n");
279 return;
280 case 'a':
281 flags&=~CP_I;
282 asynchron(filedata,#'cp_file,move,flags,0);
283 return;
284 default:
285 printf("Kommando nicht verstanden.\n");
286 _cp_ask_copy(filedata,0,flags);
287 return;
288 }
289}
290
291static void _cp_ask_copy(mixed *filedata,int move, int flags)
292{
293 mixed data;
294 string dest,source;
295 int delete_subs,jump;
296
297 if(!sizeof(filedata))
298 {
299 printf("%s: abgeschlossen.\n",move?"mv":"cp");
300 return;
301 }
302 dest=filedata[0][DESTNAME];
303 source=filedata[0][FULLNAME];
304 switch(0) // break wirkt damit wie ein goto end_of_switch
305 {
306 default:
307 case 0: // Sinnlos, aber er compiliert sonst nicht :(
308 jump=filedata[0][SUBDIRSIZE];
309 if (source==dest)
310 {
311 printf(SAME_FILE,source);
312 break;
313 }
314 if (!MAY_READ(source))
315 {
316 printf(NO_READ,source);
317 break;
318 }
319 if (!MAY_WRITE(dest))
320 {
321 printf(NO_WRITE,dest);
322 jump=0;
323 break;
324 }
Zesstra8fa30f92018-11-08 20:50:06 +0100325 if (filedata[0][FILESIZE]==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200326 {
327 printf(DOESNT_EXIST,source);
328 break;
329 }
Zesstra8fa30f92018-11-08 20:50:06 +0100330 if (filedata[0][FILESIZE]==FSIZE_DIR) // Quelle ist Verzeichnis
MG Mud User88f12472016-06-24 23:31:02 +0200331 {
Zesstra8fa30f92018-11-08 20:50:06 +0100332 if (file_size(dest)>FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200333 {
334 printf(NO_DIRS,dest);
335 break;
336 }
Zesstra8fa30f92018-11-08 20:50:06 +0100337 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200338 {
339 jump=0;
340 break;
341 }
342 printf("Verzeichnis '%s' %s?\n",source,
343 move?"bewegen":"kopieren");
344 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
345 filedata,2,flags,move);
346 return;
347 }
Zesstra8fa30f92018-11-08 20:50:06 +0100348 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200349 {
350 printf(DEST_IS_DIR,dest);
351 break;
352 }
353 printf("'%s' %s?\n",source,move?"bewegen":"kopieren");
354 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
355 filedata,(file_size(dest)!=-1),flags,move);
356 return;
357 }
358 _cp_ask_copy(filedata[1+jump..],move,flags);
359 return;
360}
361
362
363static int _cp(string cmdline)
364{
365 mixed *args;
366 int flags;
367 string mask;
368 string dest,*dest2;
369 cmdline=_unparsed_args();
370 args=parseargs(cmdline,&flags,CP_OPTS,0);
371 if (flags==-1||!sizeof(args))
372 return USAGE(query_verb()+" [-" CP_OPTS
373 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
374 if (flags&CP_M)
375 {
376 mask=args[<1];
377 args=args[0..<2];
378 }
379 if (!dest=to_filename(args[<1]))
380 return USAGE(query_verb()+" [-" CP_OPTS
381 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
Zesstra8fa30f92018-11-08 20:50:06 +0100382 if (file_size(dest)==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200383 {
384 dest2=explode(dest,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100385 if (file_size(implode(dest2[0..<2],"/"))==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200386 {
387 if (dest2[<1]=="*")
388 dest=implode(dest2[0..<2],"/");
389 else
390 if (member(dest2[<1],'*')>-1||
391 member(dest2[<1],'?')>-1)
392 return notify_fail(
393 sprintf("%s: Keine * und ? im Zielnamen erlaubt.\n",query_verb())),0;
394 }
395 else
396 return notify_fail(
397 sprintf("%s: Der angegebene Zielpfad existiert nicht.\n",
398 query_verb())),0;
399 }
400 args=args[0..<2];
Zesstra8fa30f92018-11-08 20:50:06 +0100401 if (file_size(dest)!=FSIZE_DIR && sizeof(args)>1)
MG Mud User88f12472016-06-24 23:31:02 +0200402 return notify_fail(
403 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
404 "sein.\n",query_verb())),0;
405 if (!sizeof(args=map(args,#'to_filename)-({0})))
406 return USAGE(query_verb()+" [-" CP_OPTS
407 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
408 // DEBUG("DEST: " + dest + " : FLAGS: " + flags);
409 args=file_list(args,MODE_CP,(flags&CP_R),dest+"/",mask);
410 if (!sizeof(args))
411 return notify_fail(sprintf("%s: Keine passenden Dateien gefunden.\n",
412 query_verb())),0;
413
Zesstra8fa30f92018-11-08 20:50:06 +0100414 if (sizeof(args)>1&&(args[0][FILESIZE]>=0)&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200415 return notify_fail(
416 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
417 "sein.\n",query_verb())),0;
Zesstra8fa30f92018-11-08 20:50:06 +0100418 if (sizeof(args)==1&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200419 args[0][DESTNAME]=dest;
420 if (!(flags&CP_I))
421 {
422 asynchron(args,#'cp_file,(query_verb()=="mv"),flags,0);
423 return 1;
424 }
425 if (query_verb()=="cp")
426 _cp_ask_copy(args,0,flags);
427 else
428 _cp_ask_copy(args,1,flags);
429 return 1;
430}
431
432// #########
433//############################### RMDIR #################################
434// #########
435
436
437//
438// _rmdir: Verzeichnis loeschen
439// cmdline: Kommandozeilenargumente
440//
441
MG Mud User88f12472016-06-24 23:31:02 +0200442static int _rmdir(string cmdline)
443{
444 string dest,tmp;
445 int flags;
446 mixed *args;
447
448 cmdline=_unparsed_args();
449 args=parseargs(cmdline,&flags,RMDIR_OPTS,1);
450 if (flags==-1||!sizeof(args))
451 return USAGE("rmdir [-" RMDIR_OPTS "] <Verzeichnis>");
452 if (sizeof(args)>1)
453 return
454 notify_fail("Mit 'rmdir' kann nur jeweils EIN Verzeichnis geloescht "
455 "werden.\nDer Befehl 'rm' bietet erweiterte Moeglichkeiten.\n"),0;
456 dest=args[0];
457 if (dest!="/")
458 {
459 args=file_list(({dest}),MODE_RMDIR,0,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100460 args=filter(args,(: ($1[FILESIZE]==FSIZE_DIR) :));
MG Mud User88f12472016-06-24 23:31:02 +0200461 if (!sizeof(args))
462 return notify_fail(
463 sprintf("rmdir: %s: Kein solches Verzeichnis gefunden.\n",dest)),0;
464 if (sizeof(args)>1)
465 return notify_fail(
466 sprintf("rmdir: %s: Maske ist nicht eindeutig.\n",dest)),0;
467 dest=args[0][FULLNAME];
468 if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,1);
469 if (!rmdir(dest))
470 {
471 if (sizeof((get_dir(dest+"/*")||({}))-({".",".."})))
472 printf("rmdir: %s: Verzeichnis ist nicht leer.\n",dest);
473 }
474 else
475 {
476 if (flags&&RMDIR_V) printf(FILE_DELETED,dest);
477 }
478 return 1;
479 }
480 return ERROR(NO_DELETE,dest,1);
481}
482
483// #########
484//############################### MKDIR #################################
485// #########
486
487
488//
489// _mkdir: Verzeichnis erstellen
490// cmdline: Kommandozeilenargumente
491//
492
493static int _mkdir(string cmdline)
494{
495 string dest,tmp;
496 int flags,i;
497 string *args;
498
499 cmdline=_unparsed_args();
500 args=parseargs(cmdline,&flags,MKDIR_OPTS,1);
501 if (flags==-1) return 0;
502 if (!sizeof(args))
503 return USAGE("mkdir [-" MKDIR_OPTS "] <Verzeichnis>");
504 if (sizeof(args)>1)
505 return notify_fail("Mit 'mkdir' kann nur jeweils EIN Verzeichnis "
506 "erstellt werden.\n"),0;
507 dest=args[0];
508
509 if ((i=file_size(implode((args=explode(dest,"/"))[0..<2],"/")))==FSIZE_DIR)
510 {
511 if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,1);
512 if (flags&MKDIR_V) printf(DIR_CREATED,dest,1);
513 printf("mkdir: abgeschlossen.\n");
514 return 1;
515 }
516
517 if (i==FSIZE_NOFILE)
518 {
519 if (flags&MKDIR_R)
520 {
521 if (mkdirp(dest) != 1)
522 return ERROR(NO_CREATE_DIR,dest,1);
523 if (flags&MKDIR_V)
524 printf(DIR_CREATED,implode(args[0..i],"/"));
525 printf("mkdir: abgeschlossen.\n");
526 return 1;
527 }
528 return ERROR(DOESNT_EXIST,implode(args[0..<2],"/"),1);
529 }
530 return ERROR(ALREADY_EXISTS,dest,1);
531}
532
533// ######
534//################################ RM ###################################
535// ######
536
537private void _rm_ask_delete(mixed *filedata, int flags);
538
539static void _rm_ask_delete2(string input,mixed *filedata,int flags)
540{
541 int i;
542 if (!sizeof(input)) input=" ";
543 input=lower_case(input);
544 switch(input[0])
545 {
546 case 'q':
547 printf("Loeschen abgebrochen!\n");
548 return;
549 case 'y':
550 case 'j':
Zesstra8fa30f92018-11-08 20:50:06 +0100551 if (filedata[0][FILESIZE]==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200552 {
553 if (i=filedata[0][SUBDIRSIZE]) // Dir-Eintrag nach hinten schieben
554 {
555 mixed temp;
556 int j;
557 temp=filedata[0];
558 temp[SUBDIRSIZE]=0;
559 for(j=0;j<i;j++) filedata[j]=filedata[j+1];
560 filedata[j]=temp;
561 _rm_ask_delete(filedata,flags);
562 return;
563 }
564 if (!rmdir(filedata[0][FULLNAME]))
565 printf(NO_DELETE,filedata[0][FULLNAME]);
566 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
567 }
568 else // Datei existiert
569 {
570 if (!rm(filedata[0][FULLNAME]))
571 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
572 filedata[0][FULLNAME]);
573 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
574
575 }
576 case 'n':
577 _rm_ask_delete(filedata[1+filedata[0][SUBDIRSIZE]..],flags);
578 return;
579 default:
580 printf("Kommando nicht verstanden.\n");
581 _rm_ask_delete(filedata,flags);
582 return;
583 }
584 return;
585}
586
587private void _rm_ask_delete(mixed *filedata, int flags)
588{
589 int i;
590 mixed temp;
591 if (!sizeof(filedata))
592 {
593 printf("rm: abgeschlossen.\n");
594 return;
595 }
596 switch(filedata[0][FILESIZE])
597 {
Zesstra8fa30f92018-11-08 20:50:06 +0100598 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200599 if (flags&RM_V) printf(DOESNT_EXIST,filedata[0][FULLNAME]);
600 _rm_ask_delete(filedata[1..],flags);
601 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100602 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200603 if (i=filedata[0][SUBDIRSIZE])
604 printf("Ins Verzeichnis '%s' hinabsteigen?\n",
605 filedata[0][FULLNAME]);
606 else
607 printf("Verzeichnis '%s' loeschen?\n",
608 filedata[0][FULLNAME]);
609 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
610 filedata,flags);
611 return;
612 default:
613 printf("'%s' loeschen? (j,n,q)\n",
614 filedata[0][FULLNAME]);
615 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
616 filedata,flags);
617 return;
618 }
619}
620
621
622private void rm_file(mixed filedata, mixed notused, int flags)
623{
624 string dest;
625 dest=filedata[FULLNAME];
626 if (!MAY_WRITE(dest))
627 {
628 printf(NO_WRITE,dest);
629 return;
630 }
631 switch(filedata[FILESIZE])
632 {
Zesstra8fa30f92018-11-08 20:50:06 +0100633 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200634 if (flags&RM_V) printf(DOESNT_EXIST,dest);
635 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100636 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200637 if (!rmdir(dest)) printf(DEST_NO_DELETE,dest);
638 else
639 {
640 if (flags&RM_V) printf(FILE_DELETED,dest);
641 }
642 return;
643 default:
644 if (!rm(dest)) printf(DEST_NO_DELETE,dest);
645 else
646 {
647 if (flags&RM_V) printf(FILE_DELETED,dest);
648 }
649 return;
650 }
651}
652
653static int _rm(string cmdline)
654{
655 mixed *args,*args2;
656 int flags,i;
657 string mask;
658
659 cmdline=_unparsed_args();
660 args=parseargs(cmdline,&flags,RM_OPTS,0);
661 if (flags==-1||!sizeof(args))
662 return USAGE("rm [-" RM_OPTS
663 "] <datei/verz> [<datei2/verz2> ... ] [<maske>]");
664 if (flags&RM_M)
665 {
666 mask=args[<1];
667 args=args[0..<2];
668 }
669 args=map(args,#'to_filename)-({0});
670 args=file_list(args,MODE_RM,(flags&RM_R),"/",mask);
671 if (!(i=sizeof(args)))
672 return printf("Keine passende Datei gefunden.\n"),1;
673 if (!(flags&RM_I))
674 {
675 if (i>1) // Umdrehen
676 {
677 mixed temp;
678 i>>=1;
679 while(i)
680 {
681 temp=args[<(i--)];
682 args[<(i+1)]=args[i];
683 args[i]=temp;
684 }
685 }
686 asynchron(args,#'rm_file,args,flags,0);
687 return 1;
688 }
689 _rm_ask_delete(args,flags);
690 return 1;
691}