     1                                  ; ****************************************************************************
     2                                  ; rm386.s (rm0.s) - by Erdogan Tan - 25/04/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 - remove -- remove (unlink/delete) file(s)
     5                                  ;
     6                                  ; [ Last Modification: 27/04/2022 ]
     7                                  ;
     8                                  ; Derived from (original) UNIX v7 (& v7 x86) 'rm.c' source Code
     9                                  ; Ref:
    10                                  ; www.tuhs.org (https://minnie.tuhs.org)
    11                                  ; v7.tar.gz
    12                                  ; ****************************************************************************
    13                                  ; [ v7.tar - usr/src/cmd/rm.c (archive date: 10-1-1979) ]
    14                                  ;
    15                                  ; Assembler: NASM v2.15
    16                                  ; ((nasm rm0.s -l rm0.txt -o rm0 -Z error.txt))
    17                                  ;
    18                                  ; rm2.s - Retro UNIX 386 v1.2 (modified unix v7 inode)
    19                                  ; rm1.s - 26/04/2022 - Retro UNIX 386 v1.1
    20                                  ; rm0.s - 26/04/2022 - Retro UNIX 386 v1
    21                                  ; rm8086.s - Retro UNIX 8086 v1 (16 bit 'rm0.s') 
    22                                  
    23                                  ; 12/01/2022 (Retro UNIX 386 v1.2)
    24                                  ; 13/10/2015
    25                                  
    26                                  ; UNIX v1 system calls
    27                                  _rele 	equ 0
    28                                  _exit 	equ 1
    29                                  _fork 	equ 2
    30                                  _read 	equ 3
    31                                  _write	equ 4
    32                                  _open	equ 5
    33                                  _close 	equ 6
    34                                  _wait 	equ 7
    35                                  _creat 	equ 8
    36                                  _link 	equ 9
    37                                  _unlink	equ 10
    38                                  _exec	equ 11
    39                                  _chdir	equ 12
    40                                  _time 	equ 13
    41                                  _mkdir 	equ 14
    42                                  _chmod	equ 15
    43                                  _chown	equ 16
    44                                  _break	equ 17
    45                                  _stat	equ 18
    46                                  _seek	equ 19
    47                                  _tell 	equ 20
    48                                  _mount	equ 21
    49                                  _umount	equ 22
    50                                  _setuid	equ 23
    51                                  _getuid	equ 24
    52                                  _stime	equ 25
    53                                  _quit	equ 26	
    54                                  _intr	equ 27
    55                                  _fstat	equ 28
    56                                  _emt 	equ 29
    57                                  _mdate 	equ 30
    58                                  _stty 	equ 31
    59                                  _gtty	equ 32
    60                                  _ilgins	equ 33
    61                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    62                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    63                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    64                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    65                                  ; Retro UNIX 386 v2 system calls
    66                                  _setgid	equ 37
    67                                  _getgid	equ 38
    68                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    69                                  
    70                                  ;;;
    71                                  ESCKey equ 1Bh
    72                                  EnterKey equ 0Dh
    73                                  
    74                                  %macro sys 1-4
    75                                      ; 03/09/2015	
    76                                      ; 13/04/2015
    77                                      ; Retro UNIX 386 v1 system call.		
    78                                      %if %0 >= 2   
    79                                          mov ebx, %2
    80                                          %if %0 >= 3    
    81                                              mov ecx, %3
    82                                              ;%if %0 = 4
    83                                              %if	%0 >= 4 ; 11/03/2022
    84                                  		mov edx, %4   
    85                                              %endif
    86                                          %endif
    87                                      %endif
    88                                      mov eax, %1
    89                                      int 30h	   
    90                                  %endmacro
    91                                  
    92                                  ; Retro UNIX 386 v1 system call format:
    93                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    94                                  
    95                                  ; 11/03/2022
    96                                  ; Note: Above 'sys' macro has limitation about register positions;
    97                                  ;	ebx, ecx, edx registers must not be used after their
    98                                  ;	positions in sys macro.
    99                                  ; for example:
   100                                  ;	'sys _write, 1, msg, ecx' is defective, because
   101                                  ;	 ecx will be used/assigned before edx in 'sys' macro.
   102                                  ; correct order may be:
   103                                  ;	'sys _write, 1, msg, eax ; (eax = byte count)
   104                                  
   105                                  struc stat
   106                                  	; Note: This is for Retro UNIX v1.1 'sysstat' output !!!
   107                                  	; (34 bytes)
   108 00000000 ????                    	.inode:  resw 1	
   109 00000002 ????                    	.mode:	 resw 1
   110 00000004 ??                      	.nlinks: resb 1
   111 00000005 ??                      	.uid:	 resb 1
   112 00000006 ????                    	.size:	 resw 1
   113 00000008 <res 10h>               	.dskptr: resw 8
   114 00000018 ????????                	.ctime:	 resd 1
   115 0000001C ????????                	.mtime:	 resd 1
   116 00000020 ????                    	.rsvd:   resw 1
   117                                  	.strucsize:
   118                                  endstruc   
   119                                  
   120                                  ;struc stat
   121                                  ;	; Note: This is for Retro UNIX v1.2 'sysstat' output !!!
   122                                  ;	; (66 bytes)
   123                                  ;	.inode:  resw 1	
   124                                  ;	.mode:	 resw 1
   125                                  ;	.nlinks: resw 1 
   126                                  ;	.uid:	 resw 1
   127                                  ;	.gid:	 resb 1
   128                                  ;	.size_h: resb 1
   129                                  ;	.size:	 resd 1
   130                                  ;	.dskptr: resd 10
   131                                  ;	.atime:	 resd 1
   132                                  ;	.mtime:	 resd 1
   133                                  ;	.ctime:  resd 1
   134                                  ;	.strucsize:
   135                                  ;endstruc   
   136                                  
   137                                  ;S_IFMT   equ 0F000h ; /* type of file */
   138                                  ;S_IFDIR  equ 04000h ; /* directory */
   139                                  ;S_IFCHR  equ 02000h ; /* character special */
   140                                  ;S_IFBLK  equ 06000h ; /* block special */
   141                                  ;S_IFREG  equ 08000h ; /* regular */
   142                                  ;S_ISUID  equ 00800h ; /* set user id on execution */
   143                                  ;S_ISGID  equ 00400h ; /* set group id on execution */
   144                                  ;S_IREAD  equ 00100h ; /* read permission, owner */
   145                                  ;S_IWRITE equ 00080h ; /* write permission, owner */
   146                                  ;S_IEXEC  equ 00040h ; /* execute/search permission, owner */
   147                                  
   148                                  ; 24/04/2022
   149                                  ; 21/04/2022 - UNIX v1 inode
   150                                  ; byte 1
   151                                  S_ALLOC  equ 080h ; Allocated flag
   152                                  S_IFDIR  equ 040h ; Directory flag
   153                                  S_IFMDF  equ 020h ; File modified flag (always on)
   154                                  S_IFLRG  equ 010h ; Large File flag
   155                                  ; byte 0
   156                                  S_ISUID  equ 020h ; Set User ID On Execution flag
   157                                  S_IEXEC  equ 010h ; Executable File flag
   158                                  S_IREAD  equ 008h ; Owner's Read Permission flag
   159                                  S_IWRITE equ 004h ; Owner's Write Permission flag
   160                                  
   161                                  BSIZE equ 512
   162                                  
   163                                  ;26/04/2022
   164                                  ; Directory entry size
   165                                  DIRSIZ	equ 10	; Retro UNIX 386 v1
   166                                  ;DIRSIZ equ 16	; Retro UNIX 386 v1.1 & v1.2 
   167                                  
   168                                  ;-----------------------------------------------------------------
   169                                  ;  text - code
   170                                  ;-----------------------------------------------------------------
   171                                  
   172                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
   173                                  
   174                                  [ORG 0] 
   175                                  
   176                                  START_CODE:
   177                                  	; 27/04/2022
   178                                  	; 26/04/2022
   179                                  	; 25/04/2022
   180                                  	; main(argc, argv)
   181                                  
   182 00000000 58                      	pop	eax ; [esp] = argument count	
   183                                  	;mov	[argc], eax
   184 00000001 A2[12060000]            	mov	[argc], al
   185                                  	;dec	eax
   186 00000006 FEC8                    	dec	al
   187 00000008 7533                    	jnz	short rm_0 ; [argc] = 1
   188                                  
   189                                  	sys	_msg, program_msg, 255, 0Fh
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000000A BB[16060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000000F B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000014 BA0F000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000019 B823000000          <1>  mov eax, %1
    89 0000001E CD30                <1>  int 30h
   190                                  rm_usage:
   191                                     	; "Usage: rm [fri] file ..."
   192                                  	sys	_msg, usage_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000020 BB[4B060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000025 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000002A BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000002F B823000000          <1>  mov eax, %1
    89 00000034 CD30                <1>  int 30h
   193                                  rm_exit:
   194                                  	sys	_exit	; sys exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000036 B801000000          <1>  mov eax, %1
    89 0000003B CD30                <1>  int 30h
   195                                  ;hlt:
   196                                  ;	nop
   197                                  ;	nop
   198                                  ;	jmp	short hlt
   199                                  
   200                                  rm_0:
   201                                  	;if (isatty(0) == 0)
   202                                  	;	fflg++;
   203                                  
   204                                  	; set '-f' flag if standard input is not a terminal
   205                                  	sys	_fstat, 0, stbuf
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000003D BB00000000          <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000042 B9[3A070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000047 B81C000000          <1>  mov eax, %1
    89 0000004C CD30                <1>  int 30h
   206                                  	;jc	short rm_exit ; 27/04/2022
   207                                  
   208                                  	; 25/04/2022
   209                                  	; Retro UNIX v2 inode:
   210                                  	;	 regular file flag is mode bit 15
   211                                  	;
   212                                  	;test	[stbuf+stat.mode+1], S_IFREG
   213                                  	;jz	short rm_1 ; device file (terminal/console)
   214                                  
   215                                  	;inc	byte [fflg] 
   216                                  
   217                                  	; 25/04/2022
   218                                  	; Retro UNIX v1 inode:
   219                                  	;	regular file inode numbers are > 41
   220                                  	;
   221 0000004E 66833D[3A070000]29      	cmp	word [stbuf+stat.inode], 41
   222 00000056 7606                    	jna	short rm_1 ; device file (or root dir?)
   223                                  
   224                                  	; (if standard input is not a terminal)
   225                                  	; force removing (without question and 'y' answer)
   226 00000058 FE05[13060000]          	inc 	byte [fflg]
   227                                  rm_1: 
   228                                  	;if(argc>1 && argv[1][0]=='-') {
   229                                  	;	arg = *++argv;
   230                                  	;	argc--;
   231                                  	;
   232                                  
   233 0000005E 89E5                    	mov	ebp, esp ; 26/04/2022
   234 00000060 5E                      	pop	esi ; argv[0] ; executable file name (='rm')
   235                                  	;mov	[argv], esp
   236 00000061 8B3424                  	mov	esi, [esp] ; 26/04/2022
   237                                  			; argv[1] ; option (if it is used)
   238 00000064 AC                      	lodsb
   239 00000065 3C2D                    	cmp	al, '-'
   240 00000067 754E                    	jne	short rm_2
   241 00000069 89E5                    	mov	ebp, esp ; 26/04/2022
   242 0000006B FE0D[12060000]          	dec	byte [argc] ; ARGC - 2
   243                                  rm_28:
   244 00000071 AC                      	lodsb
   245 00000072 A8FF                    	test	al, 0FFh
   246 00000074 7441                    	jz	short rm_2
   247                                  	
   248                                  	;while(*++arg != '\0')
   249                                  	;	switch(*arg) {
   250                                  	;	case 'f':
   251                                  	;		fflg++;
   252                                  	;		break;
   253                                  	;	case 'i':
   254                                  	;		iflg++;
   255                                  	;		break;
   256                                  	;	case 'r':
   257                                  	;		rflg++;
   258                                  	;		break;
   259                                  	;	default:
   260                                  	;		printf("rm: unknown option %s\n", *argv);
   261                                  	;		exit(1);
   262                                  	;	}
   263                                  
   264 00000076 3C66                    	cmp	al, 'f'
   265 00000078 742D                    	je	short rm_1_f
   266 0000007A 3C69                    	cmp	al, 'i'
   267 0000007C 7431                    	je	short rm_1_i
   268 0000007E 3C72                    	cmp	al, 'r'
   269 00000080 741D                    	je	short rm_1_r
   270                                  rm_1_uop:
   271                                  	; "rm: unknown option '-x'"
   272 00000082 A2[81060000]            	mov	[uop], al
   273                                  	sys	_msg, unk_op_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000087 BB[6B060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000008C B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000091 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000096 B823000000          <1>  mov eax, %1
    89 0000009B CD30                <1>  int 30h
   274                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   275                                  	;sys	_exit, 1 ; (ebx = exit code = 1)
   276 0000009D EB97                    	jmp	short rm_exit	
   277                                  rm_1_r:
   278 0000009F FE05[15060000]          	inc	byte [rflg] ; rflg++;
   279                                  	;jmp	short rm_2
   280                                  	; 27/04/2022
   281 000000A5 EBCA                    	jmp	short rm_28 ; get next option char
   282                                  rm_1_f:
   283 000000A7 FE05[13060000]          	inc	byte [fflg] ; fflg++;
   284                                  	;jmp	short rm_2
   285                                  	; 27/04/2022
   286 000000AD EBC2                    	jmp	short rm_28 ; get next option char
   287                                  rm_1_i:
   288 000000AF FE05[14060000]          	inc	byte [iflg] ; iflg++
   289                                  	; 27/04/2022
   290 000000B5 EBBA                    	jmp	short rm_28 ; get next option char
   291                                  rm_2:
   292                                  	;while(--argc > 0) {
   293                                  	;	if(!strcmp(*++argv, "..")) {
   294                                  	;	  fprintf(stderr, "rm: cannot remove `..'\n");
   295                                  	;	  continue;
   296                                  	;	}
   297                                  	;	rm(*argv, fflg, rflg, iflg, 0);
   298                                  	;}
   299                                  
   300 000000B7 FE0D[12060000]          	dec	byte [argc]
   301 000000BD 7431                    	jz	short rm_4
   302                                  
   303                                  	;add	word ptr [argv], 4 ; ++argv	
   304                                  	;mov	esi, [argv]
   305 000000BF 83C504                  	add	ebp, 4 ; ++argv	
   306 000000C2 8B7500                  	mov	esi, [ebp]
   307 000000C5 66813E2E2E              	cmp	word [esi], '..' ; strcmp(*++argv, "..")
   308 000000CA 740E                    	je	short rm_3
   309                                  	; rm(*argv, fflg, rflg, iflg, 0);
   310 000000CC C605[5C070000]00        	mov	byte [level], 0
   311 000000D3 E823000000              	call	remove_file
   312 000000D8 EBDD                    	jmp	short rm_2
   313                                  rm_3:
   314                                  	; "rm: cannot remove '..'"
   315                                  	sys	_msg, cnr_dotdot_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000000DA BB[85060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000000DF B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000000E4 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000000E9 B823000000          <1>  mov eax, %1
    89 000000EE CD30                <1>  int 30h
   316                                  rm_4:
   317                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   318                                  	;sys	_exit, [errcode]
   319                                  	sys	_exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000000F0 B801000000          <1>  mov eax, %1
    89 000000F5 CD30                <1>  int 30h
   320                                  ;hang:
   321                                  ;	jmp	short hang
   322                                  
   323                                  _return:
   324                                  	; 27/04/2022
   325 000000F7 89EC                    	mov	esp, ebp ; add esp, 80 (add esp, 100)
   326 000000F9 5D                      	pop	ebp 
   327                                  	
   328 000000FA C3                      	retn
   329                                  	
   330                                  remove_file:	
   331                                  	; rm(arg, fflg, rflg, iflg, level)
   332                                  
   333                                  	; 27/04/2022
   334                                  	; 26/04/2022
   335                                  	; modified registers: eax, ebx, ecx, edx, edi
   336                                  
   337                                  	; INPUT:
   338                                  	;	   esi = *argv   ; [level] = 0 
   339                                  	;	or esi = namebuf ; [level] > 0 --
   340                                  	;	byte [fflg], [rflg], [iflg]
   341                                  	;	byte [level] = sub directory level
   342                                  
   343                                  	;if(stat(arg, &buf)) {
   344                                  	;	if (fflg==0) {
   345                                  	;	   printf("rm: %s nonexistent\n", arg);
   346                                  	;	   ++errcode;
   347                                  	;	}
   348                                  	;	return;
   349                                  	;}
   350                                  
   351                                  	; 27/04/2022
   352 000000FB 55                      	push	ebp
   353 000000FC 89E5                    	mov	ebp, esp
   354                                  	;sub	esp, 100 ; char name[100];
   355 000000FE 83EC50                  	sub	esp, 80 ; Retro UNIX 386 v1	
   356                                  
   357                                  	sys	_stat, esi, stbuf
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000101 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000103 B9[3A070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000108 B812000000          <1>  mov eax, %1
    89 0000010D CD30                <1>  int 30h
   358 0000010F 734A                    	jnc	short rm_5
   359                                  
   360 00000111 803D[13060000]00        	cmp	byte [fflg], 0
   361 00000118 77DD                    	ja	short _return
   362                                  
   363                                  	; "rm: <esi> non existent"
   364                                  	sys	_msg, rm_hdr_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000011A BB[A0060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000011F B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000124 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000129 B823000000          <1>  mov eax, %1
    89 0000012E CD30                <1>  int 30h
   365                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000130 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000132 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000137 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000013C B823000000          <1>  mov eax, %1
    89 00000141 CD30                <1>  int 30h
   366                                  	sys	_msg, nonex_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000143 BB[A7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000148 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000014D BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000152 B823000000          <1>  mov eax, %1
    89 00000157 CD30                <1>  int 30h
   367                                  	
   368                                  	;inc	dword [errcode] ; ++errcode;
   369                                  
   370 00000159 EB9C                    	jmp	short _return
   371                                  rm_5:	 
   372                                  	;if ((buf.st_mode&S_IFMT) == S_IFDIR) {
   373                                  	;	if(rflg) {
   374                                  
   375                                  	; Retro UNIX 386 v2 inode
   376                                  	;mov	al, [stbuf+stat.mode+1]
   377                                  	;and	al, S_IFREG | S_IFDIR
   378                                  	;cmp	al, S_IFREG | S_IFDIR
   379                                  	;;jne	short rm_17
   380                                  	; 27/04/2022
   381                                  	;je	short rm_24
   382                                  	;jmp	rm_17
   383                                  
   384                                  	; Retro UNIX 386 v1 (unix v1) inode
   385 0000015B F605[3D070000]40        	test	byte [stbuf+stat.mode+1], S_IFDIR
   386                                  	;jz	short rm_17
   387                                  	; 26/04/2022
   388 00000162 7505                    	jnz	short rm_24
   389 00000164 E9ED010000              	jmp	rm_17
   390                                  rm_24:
   391                                  	; Directory ! ('-r' option is required)
   392                                  	
   393                                  	;if(rflg) { ...
   394                                  	;	....
   395                                  	;} 
   396                                  	;printf("rm: %s directory\n", arg);
   397                                  	;	++errcode;
   398                                  	;	return;	
   399                                  
   400 00000169 803D[15060000]00        	cmp	byte [rflg], 0
   401                                  	;jna	short rm_9
   402                                  	; 26/04/2022
   403 00000170 7705                    	ja	short rm_25
   404 00000172 E907010000              	jmp	rm_9
   405                                  
   406                                  rm_25:
   407                                  	;if (access(arg, 02) < 0) {
   408                                  	;	if (fflg==0)
   409                                  	;	   printf("%s not changed\n", arg);
   410                                  	;	errcode++;
   411                                  	;	return;
   412                                  	;}
   413                                  
   414                                  	; dl = permission/mode value
   415                                  	;	(dl = 2 for Retro UNIX 386 v2 inode)
   416                                  	;	(dl = 1 for Retro UNIX 386 v1 inode)
   417                                  
   418                                  	;;mov	dl, 2
   419                                  	;mov	dl, 1
   420                                  
   421 00000177 E82E030000              	call	access
   422 0000017C 734D                    	jnc	short rm_7
   423                                  
   424 0000017E 803D[13060000]00        	cmp	byte [fflg], 0
   425 00000185 773F                    	ja	short rm_6
   426                                  
   427                                  	; esi = arg = *[argv]
   428                                  
   429                                  	; "<esi> not changed"
   430                                  	sys	_msg, nextline, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000187 BB[68060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000018C B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000191 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000196 B823000000          <1>  mov eax, %1
    89 0000019B CD30                <1>  int 30h
   431                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000019D 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000019F B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001A4 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001A9 B823000000          <1>  mov eax, %1
    89 000001AE CD30                <1>  int 30h
   432                                  	sys	_msg, nchd_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001B0 BB[B6060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001B5 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001BA BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001BF B823000000          <1>  mov eax, %1
    89 000001C4 CD30                <1>  int 30h
   433                                  rm_6:
   434                                  	;inc	dword [errcode] ; ++errcode;
   435 000001C6 E92CFFFFFF              	jmp	_return ; return;
   436                                  rm_7:
   437                                  	;if(iflg && level!=0) {
   438                                  	;	printf("directory %s: ", arg);
   439                                  	;	    if(!yes())
   440                                  	;	    return;
   441                                  	;}
   442                                  
   443 000001CB 803D[14060000]00        	cmp	byte [iflg], 0
   444 000001D2 764F                    	jna	short rm_8
   445 000001D4 803D[5C070000]00        	cmp	byte [level], 0
   446 000001DB 7646                    	jna	short rm_8
   447                                  
   448                                  	 ;"directory <ESI> : ? " 
   449                                  	sys	_msg, dir_hdr_msg, 255, 07h ; message row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001DD BB[C5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001E2 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001E7 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001EC B823000000          <1>  mov eax, %1
    89 000001F1 CD30                <1>  int 30h
   450                                  	sys	_msg, esi, 255, 07h	; directory name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001F3 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001F5 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001FA BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001FF B823000000          <1>  mov eax, %1
    89 00000204 CD30                <1>  int 30h
   451                                  	sys	_msg, qu_msg, 255, 07h	; question 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000206 BB[D2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000020B B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000210 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000215 B823000000          <1>  mov eax, %1
    89 0000021A CD30                <1>  int 30h
   452                                  
   453                                  	; get user input (answer)
   454                                  	; and write it (as answer) via sysmsg system call
   455 0000021C E8A9020000              	call	ifyes
   456 00000221 72A3                    	jc	short rm_6 ; no
   457                                  	; yes
   458                                  rm_8:
   459                                  	;if((d=open(arg, 0)) < 0) {
   460                                  	;	printf("rm: %s: cannot read\n", arg);
   461                                  	;	exit(1);
   462                                  	;}
   463                                  	
   464                                  	sys	_open, esi, 0 ; open directory for read
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000223 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000225 B900000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000022A B805000000          <1>  mov eax, %1
    89 0000022F CD30                <1>  int 30h
   465                                  	;jnc	short rm_10
   466                                  	; 26/04/2022
   467 00000231 7205                    	jc	short rm_26
   468 00000233 E98A000000              	jmp	rm_10
   469                                  rm_26:
   470                                  	 ;"rm: <esi> : cannot read" 
   471                                  	sys	_msg, rm_hdr_msg, 255, 07h ; msg row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000238 BB[A0060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000023D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000242 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000247 B823000000          <1>  mov eax, %1
    89 0000024C CD30                <1>  int 30h
   472                                  	sys	_msg, esi, 255, 07h	; directory name
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000024E 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000250 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000255 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000025A B823000000          <1>  mov eax, %1
    89 0000025F CD30                <1>  int 30h
   473                                  	sys	_msg, cnr_msg, 255, 07h ; 'cannot read'
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000261 BB[E2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000266 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000026B BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000270 B823000000          <1>  mov eax, %1
    89 00000275 CD30                <1>  int 30h
   474                                  
   475                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   476                                  	;sys	_exit, 1 ; (ebx = exit code = 1)
   477                                  	sys	_exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000277 B801000000          <1>  mov eax, %1
    89 0000027C CD30                <1>  int 30h
   478                                  ;here:
   479                                  ;	jmp	short here
   480                                  
   481                                  rm_9:
   482                                  	;printf("rm: %s directory\n", arg);
   483                                  	;	++errcode;
   484                                  	;	return;	
   485                                  
   486                                  	; "rm: <esi> directory"
   487                                  	sys	_msg, rm_hdr_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000027E BB[A0060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000283 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000288 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000028D B823000000          <1>  mov eax, %1
    89 00000292 CD30                <1>  int 30h
   488                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000294 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000296 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000029B BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002A0 B823000000          <1>  mov eax, %1
    89 000002A5 CD30                <1>  int 30h
   489                                  	sys	_msg, dir_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000002A7 BB[F2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000002AC B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000002B1 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002B6 B823000000          <1>  mov eax, %1
    89 000002BB CD30                <1>  int 30h
   490                                  
   491                                  	;inc	dword [errcode] ; ++errcode;
   492                                  
   493 000002BD E935FEFFFF              	jmp	_return ; return;
   494                                  
   495                                  rm_10:
   496                                  	;while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
   497                                  	;	if(direct.d_ino != 0 && !dotname(direct.d_name)) {
   498                                  	;	   sprintf(name, "%s/%.14s", arg, direct.d_name);
   499                                  	;	   rm(name, fflg, rflg, iflg, level+1);
   500                                  	;	}
   501                                  	;}
   502                                  	;
   503                                  	;close(d);
   504                                  	;errcode += rmdir(arg, iflg);
   505                                  	;return;
   506                                  
   507                                  	; 26/04/2022
   508 000002C2 A3[2C070000]            	mov	[_d_], eax ; file (directory) descriptor
   509                                  rm_29:
   510                                  	sys	_read, [_d_], direct, DIRSIZ
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000002C7 8B1D[2C070000]      <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000002CD B9[30070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000002D2 BA0A000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002D7 B803000000          <1>  mov eax, %1
    89 000002DC CD30                <1>  int 30h
   511 000002DE 725F                    	jc	short rm_15
   512 000002E0 83F80A                  	cmp	eax, DIRSIZ  ; 16 (runix v1.1&v1.2) or 10 (runix v1)
   513 000002E3 725A                    	jb	short rm_15  ; (jne short rm_14)
   514                                  
   515                                  	; 27/04/2022
   516                                  	; if(direct.d_ino != 0 ..
   517 000002E5 66833D[30070000]00      	cmp	word [direct], 0 ; is inode number > 0 ?
   518 000002ED 76D8                    	jna	short rm_29  ; no ; read next direntry ; 27/04/2022
   519                                  	; yes  	
   520                                  	; && !dotname(direct.d_name))
   521 000002EF BB[32070000]            	mov	ebx, direct+2
   522 000002F4 E823020000              	call	isdotname
   523 000002F9 74CC                    	jz	short rm_29  ; '.' or '..' 
   524                                  			     ; read next direntry ; 27/04/2022
   525                                  
   526                                  	; sprintf(name, "%s/%.14s", arg, direct.d_name);
   527                                  	; 27/04/2022
   528 000002FB 89E7                    	mov	edi, esp ; name ; 100 byte frame on stack
   529 000002FD 56                      	push	esi ; * ; save esi (arg, *argv)
   530                                  rm_11:
   531 000002FE AC                      	lodsb
   532 000002FF 08C0                    	or	al, al
   533 00000301 7403                    	jz	short rm_12 ; (end of the path)
   534 00000303 AA                      	stosb
   535 00000304 EBF8                    	jmp	short rm_11
   536                                  rm_12:
   537                                  	; add file name to the path
   538 00000306 B02F                    	mov	al, '/'
   539 00000308 AA                      	stosb
   540                                  	;mov	ecx, 14 ; max. 14 byte file name
   541 00000309 B908000000              	mov	ecx, DIRSIZ-2
   542 0000030E BE[32070000]            	mov	esi, direct+2 ; direct.d_name
   543                                  rm_13:
   544 00000313 AC                      	lodsb
   545 00000314 AA                      	stosb
   546 00000315 08C0                    	or	al, al
   547 00000317 7402                    	jz	short rm_14 ; end of the (full) path
   548 00000319 E2F8                    	loop	rm_13
   549                                  rm_14:
   550                                  	; rm(name, fflg, rflg, iflg, level+1);
   551                                  	; 27/04/2022
   552 0000031B 8D742404                	lea	esi, [esp+4] ; path name buffer (stack frame)
   553 0000031F FF35[2C070000]          	push	dword [_d_] ; save file (dir) descriptor 
   554 00000325 FE05[5C070000]          	inc	byte [level]
   555 0000032B E8CBFDFFFF              	call	remove_file ; ! call itself !
   556 00000330 FE0D[5C070000]          	dec	byte [level] ; (this may not be necessary)
   557 00000336 8F05[2C070000]          	pop	dword [_d_] ; restore file (dir) descriptor
   558 0000033C 5E                      	pop	esi ; *	; restore esi (arg, *argv)
   559 0000033D EB88                    	jmp	short rm_29
   560                                  rm_15:
   561                                  	sys	_close, [_d_] ; close(d);
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000033F 8B1D[2C070000]      <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000345 B806000000          <1>  mov eax, %1
    89 0000034A CD30                <1>  int 30h
   562                                  	; errcode += rmdir(arg, iflg);
   563                                  	; 27/04/2022
   564 0000034C E8DF010000              	call	rmdir
   565                                  	;jnc	short rm_16
   566                                  	;mov	byte [errcode], 1
   567                                  	;---- 
   568                                  	;NOTE:
   569                                  	; sysexit error code ((exit(errcode);)
   570                                  	; is not used by current Retro UNIX version
   571                                  	;----
   572                                  rm_16:	; 27/04/2022
   573 00000351 E9A1FDFFFF              	jmp	_return ; return;
   574                                  
   575                                  rm_17:
   576                                  	;if(iflg) {
   577                                  	;	printf("%s: ", arg);
   578                                  	;	if(!yes())
   579                                  	;		return;
   580                                  	;}
   581                                  	;else if(!fflg) {
   582                                  	;	if (access(arg, 02)<0) {
   583                                  	;	   printf("rm: %s %o mode ", arg, buf.st_mode&0777);
   584                                  	;	   if(!yes())
   585                                  	;		return;
   586                                  	;	}
   587                                  	;}
   588                                  	;	
   589                                  	;if(unlink(arg) && (fflg==0 || iflg)) {
   590                                  	;	printf("rm: %s not removed\n", arg);
   591                                  	;	++errcode;
   592                                  	;}
   593                                  
   594                                  	; 26/04/2022
   595 00000356 803D[14060000]00        	cmp	byte [iflg], 0
   596                                  	;jna	short rm_20
   597 0000035D 7705                    	ja	short rm_27
   598 0000035F E9A2000000              	jmp	rm_20
   599                                  rm_27:
   600                                  	sys	_msg, nextline, 255, 07h ; next (new) line
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000364 BB[68060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000369 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000036E BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000373 B823000000          <1>  mov eax, %1
    89 00000378 CD30                <1>  int 30h
   601                                  	sys	_msg, esi, 255, 07h	; file name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000037A 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000037C B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000381 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000386 B823000000          <1>  mov eax, %1
    89 0000038B CD30                <1>  int 30h
   602                                  	sys	_msg, qu_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000038D BB[D2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000392 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000397 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000039C B823000000          <1>  mov eax, %1
    89 000003A1 CD30                <1>  int 30h
   603 000003A3 E822010000              	call	ifyes  ; question 	
   604 000003A8 72A7                    	jc	short rm_16 ; answer = no (not 'y')
   605                                  rm_18:
   606                                  	sys	_unlink, esi
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003AA 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003AC B80A000000          <1>  mov eax, %1
    89 000003B1 CD30                <1>  int 30h
   607 000003B3 739C                    	jnc	short rm_16
   608                                  	;
   609 000003B5 A0[13060000]            	mov	al, [fflg]
   610 000003BA 0A05[14060000]          	or	al, [iflg]
   611 000003C0 748F                    	jz	short rm_16
   612                                  	; "rm: <esi> not removed"
   613                                  	sys	_msg, rm_hdr_msg, 255, 07h ; header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003C2 BB[A0060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003C7 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003CC BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003D1 B823000000          <1>  mov eax, %1
    89 000003D6 CD30                <1>  int 30h
   614                                  	sys	_msg, esi, 255, 07h	; file name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003D8 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003DA B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003DF BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003E4 B823000000          <1>  mov eax, %1
    89 000003E9 CD30                <1>  int 30h
   615                                  	sys	_msg, not_rmd_msg, 255, 07h ; 'not removed'
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003EB BB[FD060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003F0 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003F5 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003FA B823000000          <1>  mov eax, %1
    89 000003FF CD30                <1>  int 30h
   616                                  	;----
   617                                  	;Note:  Current Retro UNIX version
   618                                  	;	does not use error code return (to parent)
   619                                  	;----
   620                                  	;inc	byte [errcode]
   621                                  	; 27/04/2022
   622 00000401 E9F1FCFFFF              	jmp	_return ; return;
   623                                  rm_20:
   624 00000406 803D[13060000]00        	cmp	byte [fflg], 0
   625 0000040D 779B                    	ja	short rm_18
   626                                  	;
   627                                  	;if (access(arg, 02)<0) {
   628                                  	;   printf("rm: %s %o mode ", arg, buf.st_mode&0777);
   629                                  	;   if(!yes())
   630                                  	;	return;
   631                                  	;}
   632                                  	;
   633                                  	;;mov	dl, 2
   634                                  	;mov	dl, 1
   635 0000040F E896000000              	call	access
   636 00000414 7394                    	jnc	short rm_18
   637                                  	
   638                                  	; "rm: <esi> _octal_ mode"
   639 00000416 31C0                    	xor	eax, eax
   640 00000418 31DB                    	xor	ebx, ebx
   641 0000041A 89E1                    	mov	ecx, esp
   642 0000041C 66A1[3C070000]          	mov	ax, [stbuf+stat.mode]
   643                                  	;and	ax, 1FFh ; Retro UNIX 386 v2 inode
   644 00000422 6683E01F                	and	ax, 1Fh	 ; Retro UNIX 386 v1 inode
   645 00000426 B308                    	mov	bl, 8 ; divisor for octal number calculation
   646 00000428 BF[5D070000]            	mov	edi, octal
   647                                  rm_21:
   648 0000042D 31D2                    	xor	edx, edx
   649 0000042F F7F3                    	div 	ebx
   650 00000431 52                      	push	edx
   651 00000432 09C0                    	or	eax, eax
   652 00000434 75F7                    	jnz	short rm_21
   653                                  rm_22:
   654 00000436 58                      	pop	eax
   655 00000437 0430                    	add	al, '0'
   656 00000439 AA                      	stosb
   657 0000043A 39E1                    	cmp	ecx, esp
   658 0000043C 77F8                    	ja	short rm_22
   659 0000043E 28C0                    	sub	al, al
   660 00000440 AA                      	stosb
   661                                  
   662                                  	sys	_msg, rm_hdr_msg, 255, 07h ; header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000441 BB[A0060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000446 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000044B BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000450 B823000000          <1>  mov eax, %1
    89 00000455 CD30                <1>  int 30h
   663                                  	sys	_msg, octal, 255, 07h	; octal mode
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000457 BB[5D070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000045C B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000461 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000466 B823000000          <1>  mov eax, %1
    89 0000046B CD30                <1>  int 30h
   664                                  	sys	_msg, mode_msg, 255, 07h ; ' mode '
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000046D BB[0C070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000472 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000477 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000047C B823000000          <1>  mov eax, %1
    89 00000481 CD30                <1>  int 30h
   665                                  	sys	_msg, que_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000483 BB[D3060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000488 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000048D BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000492 B823000000          <1>  mov eax, %1
    89 00000497 CD30                <1>  int 30h
   666 00000499 E82C000000              	call	ifyes  ; question 	
   667 0000049E 7205                    	jc	short rm_23 ; answer = no (not 'y')
   668 000004A0 E905FFFFFF              	jmp	rm_18
   669                                  rm_23:	; 27/04/2022
   670 000004A5 E94DFCFFFF              	jmp	_return ; return;
   671                                  
   672                                  access:
   673                                  	; 26/04/2022
   674                                  	; INPUT:
   675                                  	; 	dl = permission/mode value
   676                                  	;		(dl = 2 for Retro UNIX 386 v2 inode)
   677                                  	;		(dl = 1 for Retro UNIX 386 v1 inode)
   678                                  	;
   679                                  	;	stbuf = status (sysstat output) buffer
   680                                  	;
   681                                  	; OUTPUT:
   682                                  	;	cf = 0 -> ok
   683                                  	;	cf = 1 -> error (denied)
   684                                  
   685                                  	;mov	dl, 2 ; retro unix v2 (write permit flag)
   686 000004AA B201                    	mov	dl, 1 ; unix v1 (write permit flag)
   687                                  
   688 000004AC 8A0D[3C070000]          	mov	cl, [stbuf+stat.mode] ; Retro UNIX 386 v1
   689                                  	;mov	cx, [stbuf+stat.mode] ; Retro UNIX 386 v2
   690                                  
   691                                  	; Retro UNIX 386 v1.2 (v2)
   692                                  	;sys	_getuid	; get user ID of current user
   693                                  	;mov	[uid], al ; ax = real user ID (<=255)
   694                                  	;sys	_getgid	; get group ID of current user
   695                                  	;mov	[gid], al ; al = real group ID (<=255)
   696                                  
   697                                  	; Retro UNIX 386 v1 (unix v1)
   698                                  	sys	_getuid	; get user ID of current user
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004B2 B818000000          <1>  mov eax, %1
    89 000004B7 CD30                <1>  int 30h
   699                                  	;mov	[uid], al ; al = user ID 
   700                                  
   701                                  	; dl = 2 -> write permission flag (retro unix v2)
   702                                  	; dl = 1 -> write permission flag (retro unix v1)
   703                                  
   704                                  	;mov	ax, [uid]
   705                                  	;cmp	ax, [stbuf+stat.uid] ; Retro UNIX v2 inode
   706 000004B9 3A05[3F070000]          	cmp	al, [stbuf+stat.uid] ; unix v1
   707 000004BF 7503                    	jne	short access_1
   708                                  
   709                                  	;; Retro UNIX 386 v1.2 note:
   710                                  	;; group permission flags will not be used for now!
   711                                  
   712                                  	;shr	cx, 6  ; Retro UNIX 386 v2 inode flags
   713                                  	; AL bit 1 -> write permission owner
   714                                  	
   715 000004C1 C0E902                  	shr	cl, 2  ; Retro UNIX 386 v1 inode flags
   716                                  	; AL bit 0 -> write permission owner
   717                                  access_1:
   718 000004C4 20D1                    	and	cl, dl
   719 000004C6 7501                    	jnz	short access_2
   720 000004C8 F9                      	stc
   721                                  access_2:
   722 000004C9 C3                      	retn
   723                                  
   724                                  ifyes:
   725                                  	; 26/04/2022
   726                                  	; check user input as yes or no
   727                                  	; write answer and return with carry if it is 'no'
   728                                  	sys	_read, 0, chr, 1 ; read standard input
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000004CA BB00000000          <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000004CF B9[61070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000004D4 BA01000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004D9 B803000000          <1>  mov eax, %1
    89 000004DE CD30                <1>  int 30h
   729 000004E0 A0[61070000]            	mov	al, [chr]
   730 000004E5 3C79                    	cmp	al, 'y'
   731 000004E7 741C                    	je	short ifyes_yes
   732 000004E9 3C59                    	cmp	al, 'Y'
   733 000004EB 7418                    	je	short ifyes_yes
   734                                  	; another character means 'no'
   735                                  ifyes_no:
   736                                  	; write 'no'
   737                                  	sys	_msg, no_msg, 255, 07h	; 'no' answer
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000004ED BB[DD060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000004F2 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000004F7 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004FC B823000000          <1>  mov eax, %1
    89 00000501 CD30                <1>  int 30h
   738 00000503 F9                      	stc
   739 00000504 C3                      	retn	; return
   740                                  ifyes_yes:
   741                                  	; write 'yes'
   742                                  	sys	_msg, yes_msg, 255, 07h	; 'yes' answer
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000505 BB[D7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000050A B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000050F BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000514 B823000000          <1>  mov eax, %1
    89 00000519 CD30                <1>  int 30h
   743                                  	;clc
   744 0000051B C3                      	retn
   745                                  
   746                                  ;isdotname:
   747                                  	; 27/04/2022
   748                                  	; 26/04/2022
   749                                  	; check if file name is dot ('.') or dotdot ('..')
   750                                  	; (return: zf=1 if it is dot or dotdot)
   751                                  	;mov	ax, [direct+2]  ; 1st 2 chars of file name
   752                                  isdotname:
   753                                  	; ebx = file (or directory) name address
   754 0000051C 668B03                  	mov	ax, [ebx]
   755 0000051F 3C2E                    	cmp	al, '.'
   756 00000521 750C                    	jne	short isdot_retn
   757 00000523 08E4                    	or	ah, ah ; 0 ?
   758 00000525 7408                    	jz	short isdot_retn ; '.'
   759 00000527 38E0                    	cmp	al, ah ; '..' ?
   760                                  	; 27/04/2022
   761 00000529 7504                    	jne	short isdot_retn
   762 0000052B 807B0200                	cmp	byte [ebx+2], 0
   763                                  	; zf = 1 if it is dotdot
   764                                  isdot_retn:
   765 0000052F C3                      	retn
   766                                  
   767                                  rmdir:
   768                                  	; 26/04/2022
   769                                  	; INPUT:
   770                                  	;	esi = directory name address (*argv)
   771                                  	;	[iflg] = interactive option
   772                                  	;
   773                                  	; OUTPUT:
   774                                  	;	none
   775                                  
   776                                  	;rmdir(f, iflg)
   777                                  	;char *f;
   778                                  	;{
   779                                  	;	int status, i;
   780                                  	;
   781                                  	;	if(dotname(f))
   782                                  	;		return(0);
   783                                  	;	if(iflg) {
   784                                  	;		printf("%s: ", f);
   785                                  	;		if(!yes())
   786                                  	;			return(0);
   787                                  	;}
   788                                  	
   789 00000530 89F3                    	mov	ebx, esi
   790 00000532 E8E5FFFFFF              	call	isdotname
   791 00000537 7464                    	jz	short rmdir_retn
   792                                  	
   793 00000539 803D[14060000]01        	cmp	byte [iflg], 1
   794 00000540 7246                    	jb	short rmdir_1
   795                                  
   796                                  	sys	_msg, dir_hdr_msg, 255, 07h ; message row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000542 BB[C5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000547 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000054C BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000551 B823000000          <1>  mov eax, %1
    89 00000556 CD30                <1>  int 30h
   797                                  	sys	_msg, esi, 255, 07h	; directory name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000558 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000055A B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000055F BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000564 B823000000          <1>  mov eax, %1
    89 00000569 CD30                <1>  int 30h
   798                                  	sys	_msg, qu_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000056B BB[D2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000570 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000575 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000057A B823000000          <1>  mov eax, %1
    89 0000057F CD30                <1>  int 30h
   799                                  	
   800 00000581 E844FFFFFF              	call	ifyes  ; question 	
   801 00000586 7215                    	jc	short rmdir_retn ; answer = no (not 'y')
   802                                  rmdir_1:
   803                                  	;while((i=fork()) == -1)
   804                                  	;	sleep(3);
   805                                  	;if(i) {
   806                                  	;	wait(&status);
   807                                  	;	return(status);
   808                                  	;}
   809                                  
   810 00000588 BB[9E050000]            	mov 	ebx, rmdir_2 ; ! Retro UNIX feature only !
   811                                  			; 'rmdir'child will continue from   
   812                                  	sys 	_fork
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000058D B802000000          <1>  mov eax, %1
    89 00000592 CD30                <1>  int 30h
   813 00000594 7207                    	jc 	short rmdir_retn
   814                                  
   815                                  	; parent process will continue to run from here 
   816                                  	; (from 'jc' after 'sys _fork')
   817                                  
   818                                  	; eax = child process ID
   819                                  
   820                                  	; ----
   821                                  	; Note: Current Retro Unix version does not use
   822                                  	;	status return -exit code from the child- 
   823                                  	; ----
   824                                  	
   825                                  	sys 	_wait	; wait untill the child exits
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000596 B807000000          <1>  mov eax, %1
    89 0000059B CD30                <1>  int 30h
   826                                  	;jc 	short rmdir_retn ; 27/04/2022
   827                                  
   828                                  	; eax = child process ID -which has been terminated-
   829                                  	; (ebx = status -may be used by retro unix later-)
   830                                  
   831                                  	; cf = 0 ; return(0)
   832                                  rmdir_retn:
   833                                  	; if cf = 0 -> return(0)
   834                                  	;    else (if cf = 1) -> return(1) 
   835                                  
   836 0000059D C3                      	retn
   837                                  
   838                                  rmdir_2:
   839                                  	; child process will continue to run from here
   840                                  	
   841                                  	;execl("/bin/rmdir", "rmdir", f, 0);
   842                                  	;execl("/usr/bin/rmdir", "rmdir", f, 0);
   843                                  	;printf("rm: can't find rmdir\n");
   844                                  	;exit(1);
   845                                  
   846                                  	; run 'rmdir' utility/program
   847                                  	; (it will/must not return here)
   848                                  
   849                                  	; set directory address as /bin/rmdir argument 1
   850 0000059E 8935[EA050000]          	mov	[binrmdira1], esi
   851                                  	;; set directory addr as /usr/bin/rmdir argument 1
   852                                  	;mov	[usrbinrmdira1], esi ; ((*))
   853                                  
   854                                  	sys	_exec, binrmdir, binrmdirp
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005A4 BB[F8050000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005A9 B9[E6050000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005AE B80B000000          <1>  mov eax, %1
    89 000005B3 CD30                <1>  int 30h
   855                                  	sys	_exec, usrbinrmdir, usrbinrmdirp
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005B5 BB[03060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005BA B9[E6050000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005BF B80B000000          <1>  mov eax, %1
    89 000005C4 CD30                <1>  int 30h
   856                                  
   857                                  	; ! error !
   858                                  	; if sysexec fails (would fail) to run 'rmdir'
   859                                  	; cpu will return here
   860                                  
   861                                  	; "rm: can't find rmdir"
   862                                  	sys	_msg, cnf_rd_msg, 255, 07h 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005C6 BB[12070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005CB B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000005D0 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005D5 B823000000          <1>  mov eax, %1
    89 000005DA CD30                <1>  int 30h
   863                                  
   864                                  	; ebx = exit code (if there is an error, it is > 0)  
   865                                  	;sys	_exit, 1
   866                                  	sys	_exit ; Current Retro UNIX version
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005DC B801000000          <1>  mov eax, %1
    89 000005E1 CD30                <1>  int 30h
   867                                  		      ; does not use exit code from child		
   868                                  hangemhigh:
   869 000005E3 90                      	nop
   870 000005E4 EBFD                    	jmp	short hangemhigh
   871                                  
   872                                  ;-----------------------------------------------------------------
   873                                  ;  data - initialized data
   874                                  ;-----------------------------------------------------------------
   875                                  
   876                                  ; 26/04/202
   877                                  
   878                                  binrmdirp: 
   879                                  usrbinrmdirp:
   880                                  	;dd bindrmdir
   881 000005E6 [F2050000]              	dd _rmdir_
   882                                  binrmdira1:
   883                                  usrbinrmdira1: ; ((*))
   884 000005EA 00000000                	dd 0 
   885                                  binrmdira2:
   886                                  usrbinrmdira2: ; ((*))
   887 000005EE 00000000                	dd 0
   888                                  ;usrbinrmdirp: 
   889                                  ;	;dd usrbindrmdir
   890                                  ;	dd _rmdir_
   891                                  ;usrbinrmdira1:
   892                                  ;	dd 0 
   893                                  ;usrbinrmdira2:
   894                                  ;	dd 0
   895                                  
   896                                  _rmdir_:
   897 000005F2 726D64697200            	db 'rmdir', 0
   898                                  binrmdir:
   899 000005F8 2F62696E2F726D6469-     	db '/bin/rmdir', 0
   899 00000601 7200               
   900                                  usrbinrmdir:
   901 00000603 2F7573722F62696E2F-     	db '/usr/bin/rmdir', 0
   901 0000060C 726D64697200       
   902                                  
   903                                  ;argc:	dd 0
   904 00000612 00                      argc:	db 0 ; argument count
   905 00000613 00                      fflg:	db 0 ; -f (forced) option
   906 00000614 00                      iflg:	db 0 ; -i (interactive) option
   907 00000615 00                      rflg:	db 0 ; -r (recursive) option
   908                                  ;argv:	dd 0 ; argument pointer (for argv[1])
   909                                  ;errcode: dd 0 ; error code (will be returned by sysexit)
   910                                  ;uid:	dw 0 ; user id
   911                                  ;;gid:	db 0 ; group id	
   912                                  ; 26/04/2022
   913                                  ;nameptr: dd namebuf
   914                                  
   915                                  ; ----------------------------------------------------------------
   916                                  
   917                                  program_msg:
   918 00000616 0D0A                    	db 0Dh, 0Ah
   919 00000618 526574726F20554E49-     	db "Retro UNIX 386 v1 RM by Erdogan TAN - 27/04/2022"
   919 00000621 582033383620763120-
   919 0000062A 524D20627920457264-
   919 00000633 6F67616E2054414E20-
   919 0000063C 2D2032372F30342F32-
   919 00000645 303232             
   920 00000648 0D0A00                  	db 0Dh, 0Ah, 0
   921                                  usage_msg:
   922 0000064B 0D0A                    	db 0Dh, 0Ah
   923 0000064D 55736167653A20726D-     	db "Usage: rm [ -fri ] file ..."
   923 00000656 205B202D667269205D-
   923 0000065F 2066696C65202E2E2E 
   924                                  nextline:
   925 00000668 0D0A00                  	db 0Dh, 0Ah, 0
   926                                  
   927                                  unk_op_msg:
   928 0000066B 0D0A                    	db 0Dh, 0Ah
   929 0000066D 726D3A20756E6B6E6F-     	db "rm: unknown option -"
   929 00000676 776E206F7074696F6E-
   929 0000067F 202D               
   930 00000681 78                      uop:	db "x"
   931 00000682 0D0A00                  	db 0Dh, 0Ah, 0
   932                                  
   933                                  cnr_dotdot_msg:
   934 00000685 0D0A                    	db 0Dh, 0Ah
   935 00000687 726D3A2063616E6E6F-     	db "rm: cannot remove '..'"
   935 00000690 742072656D6F766520-
   935 00000699 272E2E27           
   936 0000069D 0D0A00                  	db 0Dh, 0Ah, 0
   937                                  
   938                                  rm_hdr_msg:
   939 000006A0 0D0A                    	db 0Dh, 0Ah
   940 000006A2 726D3A20                	db "rm: "
   941 000006A6 00                      	db 0
   942                                  
   943                                  nonex_msg:
   944 000006A7 206E6F6E6578697374-     	db " nonexistent"
   944 000006B0 656E74             
   945 000006B3 0D0A00                  	db 0Dh, 0Ah, 0
   946                                  
   947                                  nchd_msg:
   948 000006B6 206E6F74206368616E-     	db " not changed"
   948 000006BF 676564             
   949 000006C2 0D0A00                  	db 0Dh, 0Ah, 0
   950                                  dir_hdr_msg:
   951 000006C5 0D0A                    	db 0Dh, 0Ah
   952 000006C7 6469726563746F7279-     	db "directory "
   952 000006D0 20                 
   953 000006D1 00                      	db 0
   954                                  
   955                                  qu_msg:
   956 000006D2 3A                      	db ":"
   957 000006D3 203F20                  que_msg: db " ? "
   958 000006D6 00                      	db 0 
   959                                  
   960                                  yes_msg:
   961 000006D7 796573                  	db "yes"
   962 000006DA 0D0A00                  	db 0Dh, 0Ah, 0
   963                                  no_msg:
   964 000006DD 6E6F                    	db "no"
   965 000006DF 0D0A00                  	db 0Dh, 0Ah, 0
   966                                  
   967                                  cnr_msg:
   968 000006E2 3A2063616E6E6F7420-     	db ": cannot read"
   968 000006EB 72656164           
   969 000006EF 0D0A00                  	db 0Dh, 0Ah, 0
   970                                  
   971                                  dir_msg:
   972 000006F2 206469726563746F72-     	db " directory"
   972 000006FB 79                 
   973 000006FC 00                      	db 0
   974                                  
   975                                  not_rmd_msg:
   976 000006FD 206E6F742072656D6F-     	db " not removed"
   976 00000706 766564             
   977 00000709 0D0A00                  	db 0Dh, 0Ah, 0
   978                                  
   979                                  mode_msg:
   980 0000070C 206D6F6465              	db " mode"
   981 00000711 00                      	db 0
   982                                  
   983                                  cnf_rd_msg:
   984 00000712 0D0A                    	db 0Dh, 0Ah
   985 00000714 726D3A2063616E2774-     	db "rm: can't find rmdir"
   985 0000071D 2066696E6420726D64-
   985 00000726 6972               
   986 00000728 0D0A00                  	db 0Dh, 0Ah, 0	
   987                                  
   988                                  ;-----------------------------------------------------------------
   989                                  ;  bss - uninitialized data
   990                                  ;-----------------------------------------------------------------
   991                                  
   992 0000072B 90                      align 2
   993                                  
   994                                  bss_start:
   995                                  
   996                                  ABSOLUTE bss_start
   997                                  
   998                                  ; 26/04/2022
   999 0000072C ????                    _d_:	resw 1  ; Sub directory's file descriptor
  1000 0000072E ????                    	resw 1
  1001                                  ;struct direct direct;
  1002 00000730 <res Ah>                direct:	resb DIRSIZ ; Directory entry buffer
  1003                                  
  1004                                  ; 25/04/2022
  1005                                  ;;struct stat buf;
  1006                                  ;stbuf: resb 66 ; for Retro UNIX 386 v1.2 (66 byte sysstat data)
  1007 0000073A <res 22h>               stbuf: resb 34 ; for Retro UNIX 386 v1.1 (34 byte sysstat data)
  1008                                  
  1009                                  ; 26/04/2022
  1010 0000075C ??                      level:	resb 1 ; (sub directory level)
  1011 0000075D ????????                octal:	resb 4 ; (asciiz octal mode number string)
  1012 00000761 ??                      chr:	resb 1 ; (sysread character buffer)	
  1013                                  ; 27/04/2022
  1014                                  ;char name[100];
  1015                                  ;namebuf: resb 100	
  1016                                  
  1017                                  
  1018                                  ; 25/04/2022
  1019                                  ;-----------------------------------------------------------------
  1020                                  ; Original UNIX v7 - rm (utility) c source code (rm.c)
  1021                                  ;-----------------------------------------------------------------
  1022                                  ;/* UNIX V7 source code: see www.tuhs.org for details. */;
  1023                                  ;
  1024                                  ;int	errcode;
  1025                                  ;
  1026                                  ;#include <stdio.h>
  1027                                  ;#include <sys/types.h>
  1028                                  ;#include <sys/stat.h>
  1029                                  ;#include <sys/dir.h>
  1030                                  ;
  1031                                  ;char	*sprintf();
  1032                                  ;
  1033                                  ;main(argc, argv)
  1034                                  ;char *argv[];
  1035                                  ;{
  1036                                  ;	register char *arg;
  1037                                  ;	int fflg, iflg, rflg;
  1038                                  ;
  1039                                  ;	fflg = 0;
  1040                                  ;	if (isatty(0) == 0)
  1041                                  ;		fflg++;
  1042                                  ;	iflg = 0;
  1043                                  ;	rflg = 0;
  1044                                  ;	if(argc>1 && argv[1][0]=='-') {
  1045                                  ;		arg = *++argv;
  1046                                  ;		argc--;
  1047                                  ;		while(*++arg != '\0')
  1048                                  ;			switch(*arg) {
  1049                                  ;			case 'f':
  1050                                  ;				fflg++;
  1051                                  ;				break;
  1052                                  ;			case 'i':
  1053                                  ;				iflg++;
  1054                                  ;				break;
  1055                                  ;			case 'r':
  1056                                  ;				rflg++;
  1057                                  ;				break;
  1058                                  ;			default:
  1059                                  ;				printf("rm: unknown option %s\n", *argv);
  1060                                  ;				exit(1);
  1061                                  ;			}
  1062                                  ;	}
  1063                                  ;	while(--argc > 0) {
  1064                                  ;		if(!strcmp(*++argv, "..")) {
  1065                                  ;			fprintf(stderr, "rm: cannot remove `..'\n");
  1066                                  ;			continue;
  1067                                  ;		}
  1068                                  ;		rm(*argv, fflg, rflg, iflg, 0);
  1069                                  ;	}
  1070                                  ;
  1071                                  ;	exit(errcode);
  1072                                  ;}
  1073                                  ;
  1074                                  ;rm(arg, fflg, rflg, iflg, level)
  1075                                  ;char arg[];
  1076                                  ;{
  1077                                  ;	struct stat buf;
  1078                                  ;	struct direct direct;
  1079                                  ;	char name[100];
  1080                                  ;	int d;
  1081                                  ;
  1082                                  ;	if(stat(arg, &buf)) {
  1083                                  ;		if (fflg==0) {
  1084                                  ;			printf("rm: %s nonexistent\n", arg);
  1085                                  ;			++errcode;
  1086                                  ;		}
  1087                                  ;		return;
  1088                                  ;	}
  1089                                  ;	if ((buf.st_mode&S_IFMT) == S_IFDIR) {
  1090                                  ;		if(rflg) {
  1091                                  ;			if (access(arg, 02) < 0) {
  1092                                  ;				if (fflg==0)
  1093                                  ;					printf("%s not changed\n", arg);
  1094                                  ;				errcode++;
  1095                                  ;				return;
  1096                                  ;			}
  1097                                  ;			if(iflg && level!=0) {
  1098                                  ;				printf("directory %s: ", arg);
  1099                                  ;				if(!yes())
  1100                                  ;					return;
  1101                                  ;			}
  1102                                  ;			if((d=open(arg, 0)) < 0) {
  1103                                  ;				printf("rm: %s: cannot read\n", arg);
  1104                                  ;				exit(1);
  1105                                  ;			}
  1106                                  ;			while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
  1107                                  ;				if(direct.d_ino != 0 && !dotname(direct.d_name)) {
  1108                                  ;					sprintf(name, "%s/%.14s", arg, direct.d_name);
  1109                                  ;					rm(name, fflg, rflg, iflg, level+1);
  1110                                  ;				}
  1111                                  ;			}
  1112                                  ;			close(d);
  1113                                  ;			errcode += rmdir(arg, iflg);
  1114                                  ;			return;
  1115                                  ;		}
  1116                                  ;		printf("rm: %s directory\n", arg);
  1117                                  ;		++errcode;
  1118                                  ;		return;
  1119                                  ;	}
  1120                                  ;
  1121                                  ;	if(iflg) {
  1122                                  ;		printf("%s: ", arg);
  1123                                  ;		if(!yes())
  1124                                  ;			return;
  1125                                  ;	}
  1126                                  ;	else if(!fflg) {
  1127                                  ;		if (access(arg, 02)<0) {
  1128                                  ;			printf("rm: %s %o mode ", arg, buf.st_mode&0777);
  1129                                  ;			if(!yes())
  1130                                  ;				return;
  1131                                  ;		}
  1132                                  ;	}
  1133                                  ;	if(unlink(arg) && (fflg==0 || iflg)) {
  1134                                  ;		printf("rm: %s not removed\n", arg);
  1135                                  ;		++errcode;
  1136                                  ;	}
  1137                                  ;}
  1138                                  ;
  1139                                  ;dotname(s)
  1140                                  ;char *s;
  1141                                  ;{
  1142                                  ;	if(s[0] == '.')
  1143                                  ;		if(s[1] == '.')
  1144                                  ;			if(s[2] == '\0')
  1145                                  ;				return(1);
  1146                                  ;			else
  1147                                  ;				return(0);
  1148                                  ;		else if(s[1] == '\0')
  1149                                  ;			return(1);
  1150                                  ;	return(0);
  1151                                  ;}
  1152                                  ;
  1153                                  ;rmdir(f, iflg)
  1154                                  ;char *f;
  1155                                  ;{
  1156                                  ;	int status, i;
  1157                                  ;
  1158                                  ;	if(dotname(f))
  1159                                  ;		return(0);
  1160                                  ;	if(iflg) {
  1161                                  ;		printf("%s: ", f);
  1162                                  ;		if(!yes())
  1163                                  ;			return(0);
  1164                                  ;	}
  1165                                  ;	while((i=fork()) == -1)
  1166                                  ;		sleep(3);
  1167                                  ;	if(i) {
  1168                                  ;		wait(&status);
  1169                                  ;		return(status);
  1170                                  ;	}
  1171                                  ;	execl("/bin/rmdir", "rmdir", f, 0);
  1172                                  ;	execl("/usr/bin/rmdir", "rmdir", f, 0);
  1173                                  ;	printf("rm: can't find rmdir\n");
  1174                                  ;	exit(1);
  1175                                  ;}
  1176                                  ;
  1177                                  ;yes()
  1178                                  ;{
  1179                                  ;	int i, b;
  1180                                  ;
  1181                                  ;	i = b = getchar();
  1182                                  ;	while(b != '\n' && b != EOF)
  1183                                  ;		b = getchar();
  1184                                  ;	return(i == 'y');
  1185                                  ;}
