chore: display kernel version
This commit is contained in:
		
							parent
							
								
									bd7468e69c
								
							
						
					
					
						commit
						cfeeea957c
					
				
					 12 changed files with 299 additions and 241 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -35,3 +35,4 @@ bochsrc.bxrc | |||
| *.mod | ||||
| webring.json | ||||
| webring.txt | ||||
| kernel/const.inc | ||||
|  |  | |||
|  | @ -17,6 +17,10 @@ SRCS	= kernel.asm \ | |||
| .PHONY: all | ||||
| all: $(KERNEL) | ||||
| 
 | ||||
| PHONY: const.inc | ||||
| const.inc: const.inc.in | ||||
| 	sh $(TOOLSDIR)/version.sh $< $@ | ||||
| 
 | ||||
| $(KERNEL): $(SRCS) | ||||
| 	$(AS) kernel.asm $@ | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,9 +7,11 @@ PSIZE = 0x1000 | |||
| STPDBOOT_MAGIC = 0x53545044 | ||||
| 
 | ||||
| ; --------- VERSION ------------- | ||||
| VERSION_MAJOR = 1 | ||||
| VERSION_MINOR = 0 | ||||
| VERSION_COMMIT = "@COMMIT@" | ||||
| VERSION_MAJOR  = @MAJOR@ | ||||
| VERSION_MINOR  = @MINOR@ | ||||
| VERSION_COMMIT equ "@COMMIT@" | ||||
| VERSION_FULL   equ "@FULLVERSION@" | ||||
| BUILD_DATE     equ "@DATE@" | ||||
| 
 | ||||
| ; ------------- OTHER ----------- | ||||
| CR   = 0x0D | ||||
|  | @ -16,7 +16,10 @@ vga_console_clear: | |||
| 	rep stosb | ||||
| 	ret | ||||
| 
 | ||||
| 	;; Function: vga_console_putc | ||||
| 	;; | ||||
| 	;; In: | ||||
| 	;;    AL - charactere to print | ||||
| vga_console_putc: | ||||
| 	 | ||||
| 	ret | ||||
| 
 | ||||
| 	ret | ||||
|  |  | |||
|  | @ -1,3 +0,0 @@ | |||
| irq_timer: | ||||
| 	iret  | ||||
| 
 | ||||
|  | @ -1,9 +1,15 @@ | |||
| 	;; File: isr.inc | ||||
| macro ISR [name,error] { | ||||
| forward | ||||
| 	dd isr_#name
 | ||||
| forward | ||||
| 	local szIntName | ||||
|  szIntName db  `name#, 0
 | ||||
| forward | ||||
| 	isr_#name#:
 | ||||
| 		cli | ||||
| 		mov esi, szIntName | ||||
| 		call klog | ||||
| 		if error eq 0 | ||||
| 		push 0 | ||||
| 		end if | ||||
|  | @ -25,6 +31,17 @@ idt_setup: | |||
| 	inc ecx | ||||
| 	cmp ecx, 32 | ||||
| 	jb @b | ||||
| @@: | ||||
| 	mov eax, irq_dummy | ||||
| 	mov [aInterruptGate + (ecx * 8)], ax | ||||
| 	mov [aInterruptGate + (ecx * 8) + 2], word 0x08 | ||||
| 
 | ||||
| 	mov [aInterruptGate + (ecx * 8) + 5], word 0x8E | ||||
| 	shr eax, 16 | ||||
| 	mov [aInterruptGate + (ecx * 8) + 6], ax | ||||
| 	inc ecx | ||||
| 	cmp ecx, 0x30 | ||||
| 	jb @b | ||||
| 
 | ||||
| 	mov ecx, 0x42 | ||||
| 	mov eax, isr_syscall | ||||
|  | @ -49,6 +66,9 @@ aInterruptGate: | |||
| .end: | ||||
| 
 | ||||
| 
 | ||||
| irq_dummy: | ||||
| 	iret | ||||
| 
 | ||||
| isr_common: | ||||
| 	pusha | ||||
| 
 | ||||
|  | @ -61,6 +81,9 @@ isr_common: | |||
| 	mov fs, ax | ||||
| 	mov gs, ax | ||||
| 
 | ||||
| 	mov eax, [esp+IntFrame.intno] | ||||
| 	push eax | ||||
| 
 | ||||
| 	mov esi, szMsgInterrupt | ||||
| 	call klog  | ||||
| 
 | ||||
|  | @ -110,4 +133,4 @@ ISR \ | |||
| 	security_exception, 0, \ | ||||
| 	reserved31, 0 | ||||
| 
 | ||||
| szMsgInterrupt db "Interrupt", 0 | ||||
| szMsgInterrupt db "Interrupt (int: %x)", 0 | ||||
|  |  | |||
|  | @ -63,7 +63,7 @@ kmain: | |||
| 
 | ||||
| 	call idt_setup | ||||
| 
 | ||||
| 	int 0x42 | ||||
| 	;int 0x42 | ||||
| 
 | ||||
| .halt: | ||||
| 	hlt | ||||
|  | @ -84,7 +84,7 @@ kmain: | |||
| 	include 'pic.inc' | ||||
| 
 | ||||
| 
 | ||||
| szMsgKernelAlive db "Kernel is alive", 0 | ||||
| szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0 | ||||
| szErrorBootProtocol db "Error: wrong magic number", 0 | ||||
| 
 | ||||
| boot_structure BootInfo | ||||
|  |  | |||
|  | @ -50,6 +50,20 @@ pic_init: | |||
| 
 | ||||
| 	ret | ||||
| 
 | ||||
| 	;; Function: pic_eoi | ||||
| 	;; | ||||
| 	;; In: | ||||
| 	;;    EAX - irq | ||||
| pic_eoi: | ||||
| 	cmp eax, 8 | ||||
| 	jb @f | ||||
| 	mov al, PIC_EOI | ||||
| 	out PIC2_COMMAND, al | ||||
| @@: | ||||
| 	mov al, PIC_EOI | ||||
| 	out PIC1_COMMAND, al | ||||
| 	ret | ||||
| 
 | ||||
| pic_disable: | ||||
| 	mov al, 0xFF | ||||
| 	out PIC1_DATA, al | ||||
|  |  | |||
|  | @ -133,7 +133,7 @@ struc IDTGate { | |||
| 	;; > +--------------- |----------------+-----------------|-----------------+ | ||||
| 
 | ||||
| 
 | ||||
| struc intframe { | ||||
| struc IntFrame { | ||||
| 	;; registers | ||||
| 	.edi dd ? | ||||
| 	.esi dd ? | ||||
|  | @ -161,3 +161,7 @@ struc intframe { | |||
| 	.useresp  dd ? | ||||
| 	.ss       dd ? | ||||
| } | ||||
| virtual at 0 | ||||
|   IntFrame IntFrame | ||||
|   sizeof.IntFrame: | ||||
| end virtual | ||||
|  |  | |||
|  | @ -1,5 +1,7 @@ | |||
| SYSCALL_EXIT = 0x01 | ||||
| SYSCALL_FORK = 0x02 | ||||
| SYSCALL_EXIT  = 0x01 | ||||
| SYSCALL_FORK  = 0x02 | ||||
| SYSCALL_READ  = 0x03 | ||||
| SYSCALL_WRITE = 0x04 | ||||
| 
 | ||||
| isr_syscall: | ||||
| 	push eax | ||||
|  |  | |||
							
								
								
									
										452
									
								
								tools/fat.c
									
										
									
									
									
								
							
							
						
						
									
										452
									
								
								tools/fat.c
									
										
									
									
									
								
							|  | @ -1,226 +1,226 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
| #include <stdarg.h> | ||||
| #include <libgen.h> | ||||
| #include <errno.h> | ||||
| 
 | ||||
| typedef struct | ||||
| { | ||||
|   uint8_t jmp[3]; | ||||
|   uint8_t OEM[8]; | ||||
|   uint16_t bytes_per_sector; | ||||
|   uint8_t sectors_per_cluster; | ||||
|   uint16_t reserved_sectors; | ||||
|   uint8_t number_of_FATs; | ||||
|   uint16_t root_entries; | ||||
|   uint16_t logical_sectors; | ||||
|   uint8_t media_descriptor; | ||||
|   uint16_t sectors_per_FAT; | ||||
|   uint16_t sectors_per_track; | ||||
|   uint16_t heads_per_cylinder; | ||||
|   uint32_t hidden_sectors; | ||||
|   uint32_t total_sectors; | ||||
| 
 | ||||
|   /* EBPB */ | ||||
|   uint8_t drive_number; | ||||
|   uint8_t flags; | ||||
|   uint8_t signature; | ||||
|   uint32_t serial; | ||||
|   uint8_t label[11]; | ||||
|   uint8_t fs_type[8]; | ||||
| } __attribute__((packed)) BiosParamBlock; | ||||
| 
 | ||||
| typedef struct | ||||
| { | ||||
|   uint8_t  name[8]; | ||||
|   uint8_t  ext[3]; | ||||
|   uint8_t  attr; | ||||
|   uint16_t reserved0; | ||||
|   uint16_t creation_time; | ||||
|   uint16_t creation_date; | ||||
|   uint16_t access_date; | ||||
|   uint16_t reserved1; | ||||
|   uint16_t mod_time; | ||||
|   uint16_t mod_date; | ||||
|   uint16_t start; | ||||
|   uint32_t size; | ||||
| } __attribute__((packed)) Entry; | ||||
| 
 | ||||
| static const char *prg_name; | ||||
| static int sector_size = 512; | ||||
| 
 | ||||
| static void | ||||
| fatal(const char *str, ...) | ||||
| { | ||||
|   va_list ap; | ||||
| 
 | ||||
|   fprintf(stderr, "%s: ", prg_name); | ||||
|   va_start(ap, str); | ||||
|   vfprintf(stderr, str, ap); | ||||
|   va_end(ap); | ||||
|   fprintf(stderr, "\n"); | ||||
| 
 | ||||
|   exit(EXIT_FAILURE); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| read_sector(uint8_t *dest, int sect, FILE *fp) | ||||
| { | ||||
|   if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect; | ||||
|   if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect; | ||||
| 
 | ||||
|   return; | ||||
| 
 | ||||
|  fatal_sect: | ||||
|   fatal("Can't read sector %d", sect); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump_bpb(BiosParamBlock *bpb) | ||||
| { | ||||
|   char label[12]; | ||||
| 
 | ||||
|   printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector); | ||||
|   sector_size = bpb->bytes_per_sector; | ||||
|   printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster); | ||||
|   printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors); | ||||
|   printf("Number of FATs: %d\n", bpb->number_of_FATs); | ||||
|   printf("Root directory entries: %hd\n", bpb->root_entries); | ||||
|   printf("Total logical sectors: %hd\n", bpb->logical_sectors); | ||||
|   printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT); | ||||
|   printf("Serial: %X\n", bpb->serial); | ||||
|   memset(label, 0, 12); | ||||
|   strncpy(label, bpb->label, 11); | ||||
|   printf("Label: '%s'\n", label); | ||||
|   printf("signature: %X\n", bpb->signature); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump_entry(Entry *entry) | ||||
| { | ||||
|   char filename[9]; | ||||
|   char ext[4]; | ||||
|   int i; | ||||
| 
 | ||||
|   if (entry->name[0] == 0x0) return; | ||||
| 
 | ||||
|   memset(filename, 0, 9); | ||||
|   strncpy(filename, entry->name, 8); | ||||
|   memset(ext, 0, 4); | ||||
|   strncpy(ext, entry->ext, 3); | ||||
|   for (i = 7; i > 0; i--) | ||||
|     { | ||||
|       if (filename[i] == ' ') | ||||
| 	{ | ||||
| 	  filename[i] = '\0'; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  break; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   printf("%s.%s\n", filename, ext); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump(const char *img) | ||||
| { | ||||
|   FILE *fp; | ||||
|   BiosParamBlock *bpb; | ||||
|   uint8_t buffer[512]; | ||||
|   int root_start; | ||||
|   int root_size; | ||||
|   int i; | ||||
|   int j; | ||||
| 
 | ||||
|   fp = fopen(img, "rb"); | ||||
|   if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno)); | ||||
| 
 | ||||
|   read_sector(buffer, 0, fp); | ||||
|   if (buffer[511] != 0xAA || buffer[510] != 0x55) | ||||
|     { | ||||
|       fatal("MBR not found"); | ||||
|     } | ||||
| 
 | ||||
|   bpb = (BiosParamBlock *)buffer; | ||||
| 
 | ||||
|   dump_bpb(bpb); | ||||
| 
 | ||||
|   root_start = bpb->sectors_per_FAT * bpb->number_of_FATs; | ||||
|   root_start += bpb->reserved_sectors; | ||||
| 
 | ||||
|   root_size = bpb->root_entries / (sector_size >> 0x5); | ||||
| 
 | ||||
|   for (i = 0; i < root_size; i++) | ||||
|     { | ||||
|       read_sector(buffer, root_start + i, fp); | ||||
|       for (j = 0; j < sector_size; j+=32) | ||||
| 	{ | ||||
| 	  dump_entry((Entry *)(buffer + j)); | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   fclose(fp); | ||||
|   exit(EXIT_SUCCESS); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| usage(int retcode) | ||||
| { | ||||
|   if (retcode == EXIT_FAILURE) | ||||
|     { | ||||
|       fprintf(stderr, "Try '%s -h' form more information.\n", prg_name); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name); | ||||
|       printf("\t-h\tdisplay this help and exit\n"); | ||||
|       printf("\t-V\toutput version information\n"); | ||||
|       printf("\t-D IMG\tdump fs information from IMG\n"); | ||||
| 
 | ||||
|       printf("\nReport bugs to <%s>\n", MK_BUGREPORT); | ||||
|     } | ||||
|   exit(retcode); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| version(void) | ||||
| { | ||||
|   printf("%s commit %s\n", prg_name, MK_COMMIT); | ||||
|   exit(EXIT_SUCCESS); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
|   prg_name = argv[0]; | ||||
| 
 | ||||
|   while ((argc > 1) && (argv[1][0] == '-')) | ||||
|     { | ||||
|       switch (argv[1][1]) | ||||
| 	{ | ||||
| 	case 'h': | ||||
| 	  usage(EXIT_SUCCESS); | ||||
| 	  break; | ||||
| 	case 'V': | ||||
| 	  version(); | ||||
| 	  break; | ||||
| 	case 'D': | ||||
| 	  argv++; | ||||
| 	  argc--; | ||||
| 	  if (argc <= 1) usage(EXIT_FAILURE); | ||||
| 	  dump(argv[1]); | ||||
| 	  break; | ||||
| 	default: | ||||
| 	  usage(EXIT_FAILURE); | ||||
| 	  break; | ||||
| 	} | ||||
| 
 | ||||
|       argv++; | ||||
|       argc--; | ||||
|     } | ||||
|   return (EXIT_SUCCESS); | ||||
| } | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
| #include <stdarg.h> | ||||
| #include <libgen.h> | ||||
| #include <errno.h> | ||||
| 
 | ||||
| typedef struct | ||||
| { | ||||
|   uint8_t jmp[3]; | ||||
|   uint8_t OEM[8]; | ||||
|   uint16_t bytes_per_sector; | ||||
|   uint8_t sectors_per_cluster; | ||||
|   uint16_t reserved_sectors; | ||||
|   uint8_t number_of_FATs; | ||||
|   uint16_t root_entries; | ||||
|   uint16_t logical_sectors; | ||||
|   uint8_t media_descriptor; | ||||
|   uint16_t sectors_per_FAT; | ||||
|   uint16_t sectors_per_track; | ||||
|   uint16_t heads_per_cylinder; | ||||
|   uint32_t hidden_sectors; | ||||
|   uint32_t total_sectors; | ||||
| 
 | ||||
|   /* EBPB */ | ||||
|   uint8_t drive_number; | ||||
|   uint8_t flags; | ||||
|   uint8_t signature; | ||||
|   uint32_t serial; | ||||
|   uint8_t label[11]; | ||||
|   uint8_t fs_type[8]; | ||||
| } __attribute__((packed)) BiosParamBlock; | ||||
| 
 | ||||
| typedef struct | ||||
| { | ||||
|   uint8_t  name[8]; | ||||
|   uint8_t  ext[3]; | ||||
|   uint8_t  attr; | ||||
|   uint16_t reserved0; | ||||
|   uint16_t creation_time; | ||||
|   uint16_t creation_date; | ||||
|   uint16_t access_date; | ||||
|   uint16_t reserved1; | ||||
|   uint16_t mod_time; | ||||
|   uint16_t mod_date; | ||||
|   uint16_t start; | ||||
|   uint32_t size; | ||||
| } __attribute__((packed)) Entry; | ||||
| 
 | ||||
| static const char *prg_name; | ||||
| static int sector_size = 512; | ||||
| 
 | ||||
| static void | ||||
| fatal(const char *str, ...) | ||||
| { | ||||
|   va_list ap; | ||||
| 
 | ||||
|   fprintf(stderr, "%s: ", prg_name); | ||||
|   va_start(ap, str); | ||||
|   vfprintf(stderr, str, ap); | ||||
|   va_end(ap); | ||||
|   fprintf(stderr, "\n"); | ||||
| 
 | ||||
|   exit(EXIT_FAILURE); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| read_sector(uint8_t *dest, int sect, FILE *fp) | ||||
| { | ||||
|   if (fseek(fp, sect*sector_size, SEEK_SET) != 0) goto fatal_sect; | ||||
|   if (fread(dest, 1, sector_size, fp) != sector_size) goto fatal_sect; | ||||
| 
 | ||||
|   return; | ||||
| 
 | ||||
|  fatal_sect: | ||||
|   fatal("Can't read sector %d", sect); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump_bpb(BiosParamBlock *bpb) | ||||
| { | ||||
|   char label[12]; | ||||
| 
 | ||||
|   printf("Bytes per logical sector: %hd\n", bpb->bytes_per_sector); | ||||
|   sector_size = bpb->bytes_per_sector; | ||||
|   printf("Logical sectors per cluster: %d\n", bpb->sectors_per_cluster); | ||||
|   printf("Reserved logical sectors: %hd\n", bpb->reserved_sectors); | ||||
|   printf("Number of FATs: %d\n", bpb->number_of_FATs); | ||||
|   printf("Root directory entries: %hd\n", bpb->root_entries); | ||||
|   printf("Total logical sectors: %hd\n", bpb->logical_sectors); | ||||
|   printf("Logical sectors per FAT: %hd\n", bpb->sectors_per_FAT); | ||||
|   printf("Serial: %X\n", bpb->serial); | ||||
|   memset(label, 0, 12); | ||||
|   strncpy(label, bpb->label, 11); | ||||
|   printf("Label: '%s'\n", label); | ||||
|   printf("signature: %X\n", bpb->signature); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump_entry(Entry *entry) | ||||
| { | ||||
|   char filename[9]; | ||||
|   char ext[4]; | ||||
|   int i; | ||||
| 
 | ||||
|   if (entry->name[0] == 0x0) return; | ||||
| 
 | ||||
|   memset(filename, 0, 9); | ||||
|   strncpy(filename, entry->name, 8); | ||||
|   memset(ext, 0, 4); | ||||
|   strncpy(ext, entry->ext, 3); | ||||
|   for (i = 7; i > 0; i--) | ||||
|     { | ||||
|       if (filename[i] == ' ') | ||||
| 	{ | ||||
| 	  filename[i] = '\0'; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  break; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   printf("%s.%s\n", filename, ext); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| dump(const char *img) | ||||
| { | ||||
|   FILE *fp; | ||||
|   BiosParamBlock *bpb; | ||||
|   uint8_t buffer[512]; | ||||
|   int root_start; | ||||
|   int root_size; | ||||
|   int i; | ||||
|   int j; | ||||
| 
 | ||||
|   fp = fopen(img, "rb"); | ||||
|   if (fp == NULL) fatal("Can't open '%s': %s", img, strerror(errno)); | ||||
| 
 | ||||
|   read_sector(buffer, 0, fp); | ||||
|   if (buffer[511] != 0xAA || buffer[510] != 0x55) | ||||
|     { | ||||
|       fatal("MBR not found"); | ||||
|     } | ||||
| 
 | ||||
|   bpb = (BiosParamBlock *)buffer; | ||||
| 
 | ||||
|   dump_bpb(bpb); | ||||
| 
 | ||||
|   root_start = bpb->sectors_per_FAT * bpb->number_of_FATs; | ||||
|   root_start += bpb->reserved_sectors; | ||||
| 
 | ||||
|   root_size = bpb->root_entries / (sector_size >> 0x5); | ||||
| 
 | ||||
|   for (i = 0; i < root_size; i++) | ||||
|     { | ||||
|       read_sector(buffer, root_start + i, fp); | ||||
|       for (j = 0; j < sector_size; j+=32) | ||||
| 	{ | ||||
| 	  dump_entry((Entry *)(buffer + j)); | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   fclose(fp); | ||||
|   exit(EXIT_SUCCESS); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| usage(int retcode) | ||||
| { | ||||
|   if (retcode == EXIT_FAILURE) | ||||
|     { | ||||
|       fprintf(stderr, "Try '%s -h' form more information.\n", prg_name); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       printf("Usage: %s [-hV] [-D IMG] [-b BIN]\n", prg_name); | ||||
|       printf("\t-h\tdisplay this help and exit\n"); | ||||
|       printf("\t-V\toutput version information\n"); | ||||
|       printf("\t-D IMG\tdump fs information from IMG\n"); | ||||
| 
 | ||||
|       printf("\nReport bugs to <%s>\n", MK_BUGREPORT); | ||||
|     } | ||||
|   exit(retcode); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| version(void) | ||||
| { | ||||
|   printf("%s commit %s\n", prg_name, MK_COMMIT); | ||||
|   exit(EXIT_SUCCESS); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
|   prg_name = argv[0]; | ||||
| 
 | ||||
|   while ((argc > 1) && (argv[1][0] == '-')) | ||||
|     { | ||||
|       switch (argv[1][1]) | ||||
| 	{ | ||||
| 	case 'h': | ||||
| 	  usage(EXIT_SUCCESS); | ||||
| 	  break; | ||||
| 	case 'V': | ||||
| 	  version(); | ||||
| 	  break; | ||||
| 	case 'D': | ||||
| 	  argv++; | ||||
| 	  argc--; | ||||
| 	  if (argc <= 1) usage(EXIT_FAILURE); | ||||
| 	  dump(argv[1]); | ||||
| 	  break; | ||||
| 	default: | ||||
| 	  usage(EXIT_FAILURE); | ||||
| 	  break; | ||||
| 	} | ||||
| 
 | ||||
|       argv++; | ||||
|       argc--; | ||||
|     } | ||||
|   return (EXIT_SUCCESS); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										10
									
								
								tools/git-version → tools/version.sh
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										10
									
								
								tools/git-version → tools/version.sh
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -6,6 +6,9 @@ if [ ! -n "$vers" ]; then | |||
| 	vers="0.0" | ||||
| fi | ||||
| 
 | ||||
| major="$(echo -n "${vers}" | cut -d. -f1)" | ||||
| minor="$(echo -n "${vers}" | cut -d. -f1)" | ||||
| 
 | ||||
| commit="$(git rev-parse --short HEAD)" | ||||
| 
 | ||||
| full_vers="${vers}-${commit}" | ||||
|  | @ -13,4 +16,9 @@ if [ -n "$(git status)" ]; then | |||
| 	full_vers="${full_vers}-dirty" | ||||
| fi | ||||
| 
 | ||||
| echo -n "${full_vers}" | ||||
| sed -e "s/@MAJOR@/${major}/g" \ | ||||
| 	-e "s/@MINOR@/${minor}/g" \ | ||||
| 	-e "s/@COMMIT@/${commit}/g"\ | ||||
| 	-e "s/@FULLVERSION@/${full_vers}/g" \ | ||||
| 	-e "s/@DATE@/$(date)/g" \ | ||||
| 	"$1" > "$2" | ||||
		Loading…
	
	Add table
		
		Reference in a new issue