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