blob: d34b3bed12bc0b48725deaea774702ee457dda25 [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
10#pragma pedantic
11
Zesstra876b0d62018-11-08 20:52:22 +010012protected functions virtual inherit "/std/util/path";
13
MG Mud User88f12472016-06-24 23:31:02 +020014#include <wizlevels.h>
15#include <input_to.h>
16
17#define NEED_PROTOTYPES
18#include <magier.h>
19#include <player.h>
20#include <files.h>
21
22// ###################
23//######################### INITIALISIERUNG #############################
24// ###################
25
26mixed _query_localcmds()
27{
28 return ({ ({"cp","_cp",0,WIZARD_LVL}),
29 ({"mv","_cp",0,WIZARD_LVL}),
30 ({"rm","_rm",0,WIZARD_LVL}),
31 ({"rmdir","_rmdir",0,WIZARD_LVL}),
32 ({"mkdir","_mkdir",0,WIZARD_LVL}),
33 ({"ed","_ed",0,WIZARD_LVL})});
34}
35
36// ######
37//################################ ED ###################################
38// ######
39
40
41//
42// _ed_file: Mehrere Files hintereinander editieren
43//
44
45private nosave string *_ed_cache;
46
47private void _ed_file()
48{
49 if (!sizeof(_ed_cache)) return;
50 printf("ed: Naechste Datei: %s\n",_ed_cache[0]);
51 ed(_ed_cache[0],"_ed_file");
52 _ed_cache=_ed_cache[1..];
53 return;
54}
55
MG Mud User88f12472016-06-24 23:31:02 +020056//
57// _more: Dateien anzeigen
58// cmdline: Kommandozeile
59//
60
61static int _ed(string cmdline)
62{
63 mixed *args,*args2;
64 int flags,i,arg_size;
65 cmdline=_unparsed_args();
66 args=parseargs(cmdline,&flags,"",1);
67 if (flags==-1||!(arg_size=sizeof(args)))
68 return USAGE("ed <datei> [<datei2>..]");
69 while(arg_size--)
70 {
71 if (sizeof(args2=file_list(args[arg_size..arg_size],MODE_ED,0,"/")))
72 args[arg_size..arg_size]=args2;
73 else
Zesstra876b0d62018-11-08 20:52:22 +010074 args[arg_size]=({ "" , -1, 0 ,
75 normalize_path(args[arg_size], getuid(), 1) });
MG Mud User88f12472016-06-24 23:31:02 +020076 }
MG Mud User88f12472016-06-24 23:31:02 +020077 args=map(args,(:
Zesstra8fa30f92018-11-08 20:50:06 +010078 if ($1[FILESIZE]>=FSIZE_NOFILE) return $1[FULLNAME];
MG Mud User88f12472016-06-24 23:31:02 +020079 printf("%s ist ein Verzeichnis.\n",$1[FULLNAME]);
80 return 0; :))-({0});
MG Mud User88f12472016-06-24 23:31:02 +020081 if (flags==-1||!sizeof(args)) return USAGE("ed <datei> [<datei2>..]");
82 _ed_cache=args;
83 _ed_file();
84 return 1;
85}
86
87
88// ###########
89//############################## CP & MV ################################
90// ###########
91
92static void _cp_ask_copy(mixed *filedata,int dummy, int flags);
93static void _cp_ask_overwrite(mixed *filedata, int mode, int flags);
94static void _mv_ask_overwrite(mixed *filedata, int mode, int flags);
95
96static mixed cp_file(mixed filedata,int move,int flags, mixed *do_delete)
97{
98 string source,dest;
99 source=(string)filedata[FULLNAME];
100 dest=(string)filedata[DESTNAME];
101 if (source==dest) return ERROR(SAME_FILE,source,RET_FAIL);
102 if (!MAY_READ(source)) return ERROR(NO_READ,source,RET_JUMP);
103 if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,RET_JUMP);
104 if (filedata[FILESIZE]==-1) return ERROR(DOESNT_EXIST,source,RET_JUMP);
105 if (filedata[FILESIZE]==-2) // Quelle ist Verzeichnis
106 {
107 switch(file_size(dest))
108 {
Zesstra8fa30f92018-11-08 20:50:06 +0100109 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200110 if (move)
111 {
112 if (rename(source,dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
113 if (flags&CP_V) printf(FILE_MOVED,source);
114 return RET_JUMP;
115 }
116 if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
117 if (flags&CP_V) printf(DIR_CREATED,dest);
Zesstra8fa30f92018-11-08 20:50:06 +0100118 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200119 if (!move) return RET_OK;
120 if (filedata[SUBDIRSIZE]>0) return RET_DELETE;
121 if (!rmdir(source)) return ERROR(NO_DELETE,source,RET_FAIL);
122 if (flags&MV_V) printf("mv: %s: Quellverzeichnis wurde "
123 "geloescht.\n",source);
124 return RET_OK;
125 default: return ERROR(NO_DIRS,dest,RET_JUMP);
126 }
127 }
128 switch(file_size(dest))
129 {
Zesstra8fa30f92018-11-08 20:50:06 +0100130 case FSIZE_DIR: return ERROR(DEST_IS_DIR,dest,RET_FAIL);
MG Mud User88f12472016-06-24 23:31:02 +0200131 default:
132 if (flags&CP_F)
133 {
134 if (!rm(dest)) return ERROR(DEST_NO_DELETE,dest,RET_FAIL);
135 if (flags&CP_V) printf(FILE_DELETED,dest);
136 }
137 else
138 {
139 if (move) return #'_mv_ask_overwrite;
140 else return #'_cp_ask_overwrite;
141 }
Zesstra8fa30f92018-11-08 20:50:06 +0100142 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200143 if (move)
144 {
145 if (rename(source,dest)) return ERROR(NO_MOVE,source,RET_FAIL);
146 if (flags&CP_V) printf(FILE_MOVED,source);
147 return RET_OK;
148 }
149 if (copy_file(source,dest)) return ERROR(NO_COPY,source,RET_FAIL);
150 if (flags&CP_V) printf(FILE_COPIED,source);
151 return RET_OK;
152 }
153 return 0; // not-reached
154}
155
156static void _cp_ask_overwrite2(string input, mixed *filedata,
157 int interactive,int flags,int move)
158{
159 if (!sizeof(input)) input=" ";
160 input=lower_case(input);
161 switch(input[0])
162 {
163 case 'q':
164 printf("%s abgebrochen!\n",move?"Bewegen":"Kopieren");
165 return;
166 case 'a':
167 flags|=CP_F;
168 if (!(flags&CP_I))
169 {
170 asynchron(filedata,#'cp_file,move,flags,0);
171 return;
172 }
173 case 'y':
174 case 'j':
175 if (!rm(filedata[0][DESTNAME]))
176 printf(DEST_NO_DELETE "Uebergehe Datei...\n",filedata[0][DESTNAME]);
177 else
178 {
179 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
180 if (move)
181 {
182 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
183 printf(NO_MOVE "Uebergehe Datei...\n",filedata[0][FULLNAME]);
184 }
185 else
186 {
187 if (copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]))
188 printf(NO_COPY "Uebergehe Datei...\n",filedata[0][FULLNAME]);
189 }
190 }
191 case 'n':
192 if (flags&CP_I)
193 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
194 else
195 asynchron(filedata[1+filedata[0][SUBDIRSIZE]..],
196 #'cp_file,move,flags,0);
197 return;
198 default:
199 printf("Kommando nicht verstanden.\n");
200 _cp_ask_overwrite(filedata,interactive,flags);
201 return;
202 }
203
204}
205
206static void _cp_ask_overwrite(mixed *filedata, int interactive, int flags)
207{
208 printf("Die Datei '%s' existiert schon.\n",
209 filedata[0][DESTNAME]);
210 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
211 filedata,interactive,flags,0);
212 return;
213}
214
215static void _mv_ask_overwrite(mixed *filedata, int interactive, int flags)
216{
217 printf("Die Datei '%s' existiert schon.",
218 filedata[0][DESTNAME]);
219 input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
220 filedata,interactive,flags,1);
221 return;
222}
223
224static void _cp_ask_copy2(string input,mixed *filedata,int mode,
225 int flags,int move)
226{
227 if (!sizeof(input)) input=" ";
228 input=lower_case(input);
229 switch(input[0])
230 {
231 case 'y':
232 case 'j':
233 if (mode==1)
234 {
235 if (!(flags&CP_F))
236 {
237 if (move) _mv_ask_overwrite(filedata,1,flags);
238 else _cp_ask_overwrite(filedata,1,flags);
239 return;
240 }
241 if (!rm(filedata[0][DESTNAME]))
242 {
243 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
244 filedata[0][DESTNAME]);
245 _cp_ask_copy(filedata[1..],move,flags);
246 return;
247 }
248 if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
249 }
250 if (mode<2)
251 {
252 if (move) rename(filedata[0][FULLNAME],filedata[0][DESTNAME]);
253 else copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]);
254 _cp_ask_copy(filedata[1..],move,flags);
255 return;
256 }
257 if (mode==2)
258 {
259 if (move)
260 {
261 if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
262 printf(NO_MOVE "Uebergehe Verzeichnis...\n",
263 filedata[0][FULLNAME]);
264 _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
265 return;
266 }
267 if (mkdir(filedata[0][DESTNAME]))
268 {
269 _cp_ask_copy(filedata[1..],0,flags);
270 return;
271 }
272 printf(NO_CREATE_DIR "Uebergehe Verzeichnis...\n",
273 filedata[0][DESTNAME]);
274 }
275 case 'n':
276 _cp_ask_copy(filedata[(1+filedata[0][SUBDIRSIZE])..],0,flags);
277 return;
278 case 'q':
279 printf("Kopieren abgebrochen!\n");
280 return;
281 case 'a':
282 flags&=~CP_I;
283 asynchron(filedata,#'cp_file,move,flags,0);
284 return;
285 default:
286 printf("Kommando nicht verstanden.\n");
287 _cp_ask_copy(filedata,0,flags);
288 return;
289 }
290}
291
292static void _cp_ask_copy(mixed *filedata,int move, int flags)
293{
294 mixed data;
295 string dest,source;
296 int delete_subs,jump;
297
298 if(!sizeof(filedata))
299 {
300 printf("%s: abgeschlossen.\n",move?"mv":"cp");
301 return;
302 }
303 dest=filedata[0][DESTNAME];
304 source=filedata[0][FULLNAME];
305 switch(0) // break wirkt damit wie ein goto end_of_switch
306 {
307 default:
308 case 0: // Sinnlos, aber er compiliert sonst nicht :(
309 jump=filedata[0][SUBDIRSIZE];
310 if (source==dest)
311 {
312 printf(SAME_FILE,source);
313 break;
314 }
315 if (!MAY_READ(source))
316 {
317 printf(NO_READ,source);
318 break;
319 }
320 if (!MAY_WRITE(dest))
321 {
322 printf(NO_WRITE,dest);
323 jump=0;
324 break;
325 }
Zesstra8fa30f92018-11-08 20:50:06 +0100326 if (filedata[0][FILESIZE]==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200327 {
328 printf(DOESNT_EXIST,source);
329 break;
330 }
Zesstra8fa30f92018-11-08 20:50:06 +0100331 if (filedata[0][FILESIZE]==FSIZE_DIR) // Quelle ist Verzeichnis
MG Mud User88f12472016-06-24 23:31:02 +0200332 {
Zesstra8fa30f92018-11-08 20:50:06 +0100333 if (file_size(dest)>FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200334 {
335 printf(NO_DIRS,dest);
336 break;
337 }
Zesstra8fa30f92018-11-08 20:50:06 +0100338 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200339 {
340 jump=0;
341 break;
342 }
343 printf("Verzeichnis '%s' %s?\n",source,
344 move?"bewegen":"kopieren");
345 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
346 filedata,2,flags,move);
347 return;
348 }
Zesstra8fa30f92018-11-08 20:50:06 +0100349 if (file_size(dest)==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200350 {
351 printf(DEST_IS_DIR,dest);
352 break;
353 }
354 printf("'%s' %s?\n",source,move?"bewegen":"kopieren");
355 input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
356 filedata,(file_size(dest)!=-1),flags,move);
357 return;
358 }
359 _cp_ask_copy(filedata[1+jump..],move,flags);
360 return;
361}
362
363
364static int _cp(string cmdline)
365{
366 mixed *args;
367 int flags;
368 string mask;
369 string dest,*dest2;
370 cmdline=_unparsed_args();
371 args=parseargs(cmdline,&flags,CP_OPTS,0);
372 if (flags==-1||!sizeof(args))
373 return USAGE(query_verb()+" [-" CP_OPTS
374 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
375 if (flags&CP_M)
376 {
377 mask=args[<1];
378 args=args[0..<2];
379 }
380 if (!dest=to_filename(args[<1]))
381 return USAGE(query_verb()+" [-" CP_OPTS
382 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
Zesstra8fa30f92018-11-08 20:50:06 +0100383 if (file_size(dest)==FSIZE_NOFILE)
MG Mud User88f12472016-06-24 23:31:02 +0200384 {
385 dest2=explode(dest,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100386 if (file_size(implode(dest2[0..<2],"/"))==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200387 {
388 if (dest2[<1]=="*")
389 dest=implode(dest2[0..<2],"/");
390 else
391 if (member(dest2[<1],'*')>-1||
392 member(dest2[<1],'?')>-1)
393 return notify_fail(
394 sprintf("%s: Keine * und ? im Zielnamen erlaubt.\n",query_verb())),0;
395 }
396 else
397 return notify_fail(
398 sprintf("%s: Der angegebene Zielpfad existiert nicht.\n",
399 query_verb())),0;
400 }
401 args=args[0..<2];
Zesstra8fa30f92018-11-08 20:50:06 +0100402 if (file_size(dest)!=FSIZE_DIR && sizeof(args)>1)
MG Mud User88f12472016-06-24 23:31:02 +0200403 return notify_fail(
404 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
405 "sein.\n",query_verb())),0;
406 if (!sizeof(args=map(args,#'to_filename)-({0})))
407 return USAGE(query_verb()+" [-" CP_OPTS
408 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
409 // DEBUG("DEST: " + dest + " : FLAGS: " + flags);
410 args=file_list(args,MODE_CP,(flags&CP_R),dest+"/",mask);
411 if (!sizeof(args))
412 return notify_fail(sprintf("%s: Keine passenden Dateien gefunden.\n",
413 query_verb())),0;
414
Zesstra8fa30f92018-11-08 20:50:06 +0100415 if (sizeof(args)>1&&(args[0][FILESIZE]>=0)&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200416 return notify_fail(
417 sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
418 "sein.\n",query_verb())),0;
Zesstra8fa30f92018-11-08 20:50:06 +0100419 if (sizeof(args)==1&&file_size(dest)!=FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200420 args[0][DESTNAME]=dest;
421 if (!(flags&CP_I))
422 {
423 asynchron(args,#'cp_file,(query_verb()=="mv"),flags,0);
424 return 1;
425 }
426 if (query_verb()=="cp")
427 _cp_ask_copy(args,0,flags);
428 else
429 _cp_ask_copy(args,1,flags);
430 return 1;
431}
432
433// #########
434//############################### RMDIR #################################
435// #########
436
437
438//
439// _rmdir: Verzeichnis loeschen
440// cmdline: Kommandozeilenargumente
441//
442
MG Mud User88f12472016-06-24 23:31:02 +0200443static int _rmdir(string cmdline)
444{
445 string dest,tmp;
446 int flags;
447 mixed *args;
448
449 cmdline=_unparsed_args();
450 args=parseargs(cmdline,&flags,RMDIR_OPTS,1);
451 if (flags==-1||!sizeof(args))
452 return USAGE("rmdir [-" RMDIR_OPTS "] <Verzeichnis>");
453 if (sizeof(args)>1)
454 return
455 notify_fail("Mit 'rmdir' kann nur jeweils EIN Verzeichnis geloescht "
456 "werden.\nDer Befehl 'rm' bietet erweiterte Moeglichkeiten.\n"),0;
457 dest=args[0];
458 if (dest!="/")
459 {
460 args=file_list(({dest}),MODE_RMDIR,0,"/");
Zesstra8fa30f92018-11-08 20:50:06 +0100461 args=filter(args,(: ($1[FILESIZE]==FSIZE_DIR) :));
MG Mud User88f12472016-06-24 23:31:02 +0200462 if (!sizeof(args))
463 return notify_fail(
464 sprintf("rmdir: %s: Kein solches Verzeichnis gefunden.\n",dest)),0;
465 if (sizeof(args)>1)
466 return notify_fail(
467 sprintf("rmdir: %s: Maske ist nicht eindeutig.\n",dest)),0;
468 dest=args[0][FULLNAME];
469 if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,1);
470 if (!rmdir(dest))
471 {
472 if (sizeof((get_dir(dest+"/*")||({}))-({".",".."})))
473 printf("rmdir: %s: Verzeichnis ist nicht leer.\n",dest);
474 }
475 else
476 {
477 if (flags&&RMDIR_V) printf(FILE_DELETED,dest);
478 }
479 return 1;
480 }
481 return ERROR(NO_DELETE,dest,1);
482}
483
484// #########
485//############################### MKDIR #################################
486// #########
487
488
489//
490// _mkdir: Verzeichnis erstellen
491// cmdline: Kommandozeilenargumente
492//
493
494static int _mkdir(string cmdline)
495{
496 string dest,tmp;
497 int flags,i;
498 string *args;
499
500 cmdline=_unparsed_args();
501 args=parseargs(cmdline,&flags,MKDIR_OPTS,1);
502 if (flags==-1) return 0;
503 if (!sizeof(args))
504 return USAGE("mkdir [-" MKDIR_OPTS "] <Verzeichnis>");
505 if (sizeof(args)>1)
506 return notify_fail("Mit 'mkdir' kann nur jeweils EIN Verzeichnis "
507 "erstellt werden.\n"),0;
508 dest=args[0];
509
510 if ((i=file_size(implode((args=explode(dest,"/"))[0..<2],"/")))==FSIZE_DIR)
511 {
512 if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,1);
513 if (flags&MKDIR_V) printf(DIR_CREATED,dest,1);
514 printf("mkdir: abgeschlossen.\n");
515 return 1;
516 }
517
518 if (i==FSIZE_NOFILE)
519 {
520 if (flags&MKDIR_R)
521 {
522 if (mkdirp(dest) != 1)
523 return ERROR(NO_CREATE_DIR,dest,1);
524 if (flags&MKDIR_V)
525 printf(DIR_CREATED,implode(args[0..i],"/"));
526 printf("mkdir: abgeschlossen.\n");
527 return 1;
528 }
529 return ERROR(DOESNT_EXIST,implode(args[0..<2],"/"),1);
530 }
531 return ERROR(ALREADY_EXISTS,dest,1);
532}
533
534// ######
535//################################ RM ###################################
536// ######
537
538private void _rm_ask_delete(mixed *filedata, int flags);
539
540static void _rm_ask_delete2(string input,mixed *filedata,int flags)
541{
542 int i;
543 if (!sizeof(input)) input=" ";
544 input=lower_case(input);
545 switch(input[0])
546 {
547 case 'q':
548 printf("Loeschen abgebrochen!\n");
549 return;
550 case 'y':
551 case 'j':
Zesstra8fa30f92018-11-08 20:50:06 +0100552 if (filedata[0][FILESIZE]==FSIZE_DIR)
MG Mud User88f12472016-06-24 23:31:02 +0200553 {
554 if (i=filedata[0][SUBDIRSIZE]) // Dir-Eintrag nach hinten schieben
555 {
556 mixed temp;
557 int j;
558 temp=filedata[0];
559 temp[SUBDIRSIZE]=0;
560 for(j=0;j<i;j++) filedata[j]=filedata[j+1];
561 filedata[j]=temp;
562 _rm_ask_delete(filedata,flags);
563 return;
564 }
565 if (!rmdir(filedata[0][FULLNAME]))
566 printf(NO_DELETE,filedata[0][FULLNAME]);
567 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
568 }
569 else // Datei existiert
570 {
571 if (!rm(filedata[0][FULLNAME]))
572 printf(DEST_NO_DELETE "Uebergehe Datei...\n",
573 filedata[0][FULLNAME]);
574 else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
575
576 }
577 case 'n':
578 _rm_ask_delete(filedata[1+filedata[0][SUBDIRSIZE]..],flags);
579 return;
580 default:
581 printf("Kommando nicht verstanden.\n");
582 _rm_ask_delete(filedata,flags);
583 return;
584 }
585 return;
586}
587
588private void _rm_ask_delete(mixed *filedata, int flags)
589{
590 int i;
591 mixed temp;
592 if (!sizeof(filedata))
593 {
594 printf("rm: abgeschlossen.\n");
595 return;
596 }
597 switch(filedata[0][FILESIZE])
598 {
Zesstra8fa30f92018-11-08 20:50:06 +0100599 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200600 if (flags&RM_V) printf(DOESNT_EXIST,filedata[0][FULLNAME]);
601 _rm_ask_delete(filedata[1..],flags);
602 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100603 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200604 if (i=filedata[0][SUBDIRSIZE])
605 printf("Ins Verzeichnis '%s' hinabsteigen?\n",
606 filedata[0][FULLNAME]);
607 else
608 printf("Verzeichnis '%s' loeschen?\n",
609 filedata[0][FULLNAME]);
610 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
611 filedata,flags);
612 return;
613 default:
614 printf("'%s' loeschen? (j,n,q)\n",
615 filedata[0][FULLNAME]);
616 input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
617 filedata,flags);
618 return;
619 }
620}
621
622
623private void rm_file(mixed filedata, mixed notused, int flags)
624{
625 string dest;
626 dest=filedata[FULLNAME];
627 if (!MAY_WRITE(dest))
628 {
629 printf(NO_WRITE,dest);
630 return;
631 }
632 switch(filedata[FILESIZE])
633 {
Zesstra8fa30f92018-11-08 20:50:06 +0100634 case FSIZE_NOFILE:
MG Mud User88f12472016-06-24 23:31:02 +0200635 if (flags&RM_V) printf(DOESNT_EXIST,dest);
636 return;
Zesstra8fa30f92018-11-08 20:50:06 +0100637 case FSIZE_DIR:
MG Mud User88f12472016-06-24 23:31:02 +0200638 if (!rmdir(dest)) printf(DEST_NO_DELETE,dest);
639 else
640 {
641 if (flags&RM_V) printf(FILE_DELETED,dest);
642 }
643 return;
644 default:
645 if (!rm(dest)) printf(DEST_NO_DELETE,dest);
646 else
647 {
648 if (flags&RM_V) printf(FILE_DELETED,dest);
649 }
650 return;
651 }
652}
653
654static int _rm(string cmdline)
655{
656 mixed *args,*args2;
657 int flags,i;
658 string mask;
659
660 cmdline=_unparsed_args();
661 args=parseargs(cmdline,&flags,RM_OPTS,0);
662 if (flags==-1||!sizeof(args))
663 return USAGE("rm [-" RM_OPTS
664 "] <datei/verz> [<datei2/verz2> ... ] [<maske>]");
665 if (flags&RM_M)
666 {
667 mask=args[<1];
668 args=args[0..<2];
669 }
670 args=map(args,#'to_filename)-({0});
671 args=file_list(args,MODE_RM,(flags&RM_R),"/",mask);
672 if (!(i=sizeof(args)))
673 return printf("Keine passende Datei gefunden.\n"),1;
674 if (!(flags&RM_I))
675 {
676 if (i>1) // Umdrehen
677 {
678 mixed temp;
679 i>>=1;
680 while(i)
681 {
682 temp=args[<(i--)];
683 args[<(i+1)]=args[i];
684 args[i]=temp;
685 }
686 }
687 asynchron(args,#'rm_file,args,flags,0);
688 return 1;
689 }
690 _rm_ask_delete(args,flags);
691 return 1;
692}