Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-35' of git://repo.or.cz/linux-kbuild

* 'for-35' of git://repo.or.cz/linux-kbuild: (81 commits)
kbuild: Revert part of e8d400a to resolve a conflict
kbuild: Fix checking of scm-identifier variable
gconfig: add support to show hidden options that have prompts
menuconfig: add support to show hidden options which have prompts
gconfig: remove show_debug option
gconfig: remove dbg_print_ptype() and dbg_print_stype()
kconfig: fix zconfdump()
kconfig: some small fixes
add random binaries to .gitignore
kbuild: Include gen_initramfs_list.sh and the file list in the .d file
kconfig: recalc symbol value before showing search results
.gitignore: ignore *.lzo files
headerdep: perlcritic warning
scripts/Makefile.lib: Align the output of LZO
kbuild: Generate modules.builtin in make modules_install
Revert "kbuild: specify absolute paths for cscope"
kbuild: Do not unnecessarily regenerate modules.builtin
headers_install: use local file handles
headers_check: fix perl warnings
export_report: fix perl warnings
...

+3023 -538
+1
.gitignore
··· 28 28 *.gz 29 29 *.bz2 30 30 *.lzma 31 + *.lzo 31 32 *.patch 32 33 *.gcno 33 34
+7
Documentation/.gitignore
··· 1 + filesystems/dnotify_test 2 + laptops/dslm 3 + timers/hpet_example 4 + vm/hugepage-mmap 5 + vm/hugepage-shm 6 + vm/map_hugetlb 7 +
+5 -1
Documentation/kbuild/kbuild.txt
··· 65 65 Specify an optional fixed part of the binutils filename. 66 66 CROSS_COMPILE can be a part of the filename or the full path. 67 67 68 - CROSS_COMPILE is also used for ccache is some setups. 68 + CROSS_COMPILE is also used for ccache in some setups. 69 69 70 70 CF 71 71 -------------------------------------------------- ··· 162 162 to be included in the databases, separated by blank space. E.g.: 163 163 164 164 $ make ALLSOURCE_ARCHS="x86 mips arm" tags 165 + 166 + To get all available archs you can also specify all. E.g.: 167 + 168 + $ make ALLSOURCE_ARCHS=all tags
+2 -2
Documentation/mutex-design.txt
··· 66 66 67 67 c0377ccb <mutex_lock>: 68 68 c0377ccb: f0 ff 08 lock decl (%eax) 69 - c0377cce: 78 0e js c0377cde <.text.lock.mutex> 69 + c0377cce: 78 0e js c0377cde <.text..lock.mutex> 70 70 c0377cd0: c3 ret 71 71 72 72 the unlocking fastpath is equally tight: 73 73 74 74 c0377cd1 <mutex_unlock>: 75 75 c0377cd1: f0 ff 00 lock incl (%eax) 76 - c0377cd4: 7e 0f jle c0377ce5 <.text.lock.mutex+0x7> 76 + c0377cd4: 7e 0f jle c0377ce5 <.text..lock.mutex+0x7> 77 77 c0377cd6: c3 ret 78 78 79 79 - 'struct mutex' semantics are well-defined and are enforced if
+4 -1
MAINTAINERS
··· 3242 3242 S: Maintained 3243 3243 F: fs/autofs4/ 3244 3244 3245 - KERNEL BUILD 3245 + KERNEL BUILD + files below scripts/ (unless maintained elsewhere) 3246 3246 M: Michal Marek <mmarek@suse.cz> 3247 3247 T: git git://repo.or.cz/linux-kbuild.git for-next 3248 3248 T: git git://repo.or.cz/linux-kbuild.git for-linus ··· 3251 3251 F: Documentation/kbuild/ 3252 3252 F: Makefile 3253 3253 F: scripts/Makefile.* 3254 + F: scripts/basic/ 3255 + F: scripts/mk* 3256 + F: scripts/package/ 3254 3257 3255 3258 KERNEL JANITORS 3256 3259 L: kernel-janitors@vger.kernel.org
+40 -25
Makefile
··· 183 183 # CROSS_COMPILE can be set on the command line 184 184 # make CROSS_COMPILE=ia64-linux- 185 185 # Alternatively CROSS_COMPILE can be set in the environment. 186 + # A third alternative is to store a setting in .config so that plain 187 + # "make" in the configured kernel build directory always uses that. 186 188 # Default value for CROSS_COMPILE is not to prefix executables 187 189 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile 188 190 export KBUILD_BUILDHOST := $(SUBARCH) 189 191 ARCH ?= $(SUBARCH) 190 192 CROSS_COMPILE ?= 193 + CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) 191 194 192 195 # Architecture as present in compile.h 193 196 UTS_MACHINE := $(ARCH) ··· 579 576 # disable invalid "can't wrap" optimizations for signed / pointers 580 577 KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow) 581 578 582 - # revert to pre-gcc-4.4 behaviour of .eh_frame 583 - KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm) 584 - 585 579 # conserve stack if available 586 580 KBUILD_CFLAGS += $(call cc-option,-fconserve-stack) 587 581 ··· 882 882 PHONY += $(vmlinux-dirs) 883 883 $(vmlinux-dirs): prepare scripts 884 884 $(Q)$(MAKE) $(build)=$@ 885 - ifdef CONFIG_MODULES 886 - $(Q)$(MAKE) $(modbuiltin)=$@ 887 - endif 888 885 889 886 # Build the kernel release string 890 887 # ··· 904 907 # $(localver) 905 908 # localversion* (files without backups, containing '~') 906 909 # $(CONFIG_LOCALVERSION) (from kernel config setting) 907 - # $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set) 908 - # ./scripts/setlocalversion (SCM tag, if one exists) 909 - # $(LOCALVERSION) (from make command line if provided) 910 + # $(LOCALVERSION) (from make command line, if provided) 911 + # $(localver-extra) 912 + # $(scm-identifier) (unique SCM tag, if one exists) 913 + # ./scripts/setlocalversion (only with CONFIG_LOCALVERSION_AUTO) 914 + # .scmversion (only with CONFIG_LOCALVERSION_AUTO) 915 + # + (only without CONFIG_LOCALVERSION_AUTO 916 + # and without LOCALVERSION= and 917 + # repository is at non-tagged commit) 910 918 # 911 - # Note how the final $(localver-auto) string is included *only* if the 912 - # kernel config option CONFIG_LOCALVERSION_AUTO is selected. Also, at the 913 - # moment, only git is supported but other SCMs can edit the script 914 - # scripts/setlocalversion and add the appropriate checks as needed. 919 + # For kernels without CONFIG_LOCALVERSION_AUTO compiled from an SCM that has 920 + # been revised beyond a tagged commit, `+' is appended to the version string 921 + # when not overridden by using "make LOCALVERSION=". This indicates that the 922 + # kernel is not a vanilla release version and has been modified. 915 923 916 924 pattern = ".*/localversion[^~]*" 917 925 string = $(shell cat /dev/null \ ··· 925 923 localver = $(subst $(space),, $(string) \ 926 924 $(patsubst "%",%,$(CONFIG_LOCALVERSION))) 927 925 928 - # If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called 929 - # and if the SCM is know a tag from the SCM is appended. 930 - # The appended tag is determined by the SCM used. 926 + # scripts/setlocalversion is called to create a unique identifier if the source 927 + # is managed by a known SCM and the repository has been revised since the last 928 + # tagged (release) commit. The format of the identifier is determined by the 929 + # SCM's implementation. 931 930 # 932 931 # .scmversion is used when generating rpm packages so we do not loose 933 932 # the version information from the SCM when we do the build of the kernel 934 933 # from the copied source 935 - ifdef CONFIG_LOCALVERSION_AUTO 936 - 937 934 ifeq ($(wildcard .scmversion),) 938 - _localver-auto = $(shell $(CONFIG_SHELL) \ 935 + scm-identifier = $(shell $(CONFIG_SHELL) \ 939 936 $(srctree)/scripts/setlocalversion $(srctree)) 940 937 else 941 - _localver-auto = $(shell cat .scmversion 2> /dev/null) 938 + scm-identifier = $(shell cat .scmversion 2> /dev/null) 942 939 endif 943 940 944 - localver-auto = $(LOCALVERSION)$(_localver-auto) 941 + ifdef CONFIG_LOCALVERSION_AUTO 942 + localver-extra = $(scm-identifier) 943 + else 944 + ifneq ($(scm-identifier),) 945 + ifeq ($(LOCALVERSION),) 946 + localver-extra = + 947 + endif 948 + endif 945 949 endif 946 950 947 - localver-full = $(localver)$(localver-auto) 951 + localver-full = $(localver)$(LOCALVERSION)$(localver-extra) 948 952 949 953 # Store (new) KERNELRELASE string in include/config/kernel.release 950 954 kernelrelease = $(KERNELVERSION)$(localver-full) ··· 1097 1089 PHONY += modules 1098 1090 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) 1099 1091 $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order 1100 - $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin 1101 1092 @$(kecho) ' Building modules, stage 2.'; 1102 1093 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 1103 1094 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild 1095 + 1096 + modules.builtin: $(vmlinux-dirs:%=%/modules.builtin) 1097 + $(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin 1098 + 1099 + %/modules.builtin: include/config/auto.conf 1100 + $(Q)$(MAKE) $(modbuiltin)=$* 1104 1101 1105 1102 1106 1103 # Target to prepare building external modules ··· 1117 1104 modules_install: _modinst_ _modinst_post 1118 1105 1119 1106 PHONY += _modinst_ 1120 - _modinst_: 1107 + _modinst_: modules.builtin 1121 1108 @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ 1122 1109 echo "Warning: you may need to install module-init-tools"; \ 1123 1110 echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\ ··· 1260 1247 @echo ' firmware_install- Install all firmware to INSTALL_FW_PATH' 1261 1248 @echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)' 1262 1249 @echo ' dir/ - Build all files in dir and below' 1263 - @echo ' dir/file.[ois] - Build specified target only' 1250 + @echo ' dir/file.[oisS] - Build specified target only' 1251 + @echo ' dir/file.lst - Build specified mixed source/assembly target only' 1252 + @echo ' (requires a recent binutils and recent build (System.map))' 1264 1253 @echo ' dir/file.ko - Build module including final link' 1265 1254 @echo ' modules_prepare - Set up for building external modules' 1266 1255 @echo ' tags/TAGS - Generate tags file for editors'
+2 -2
arch/frv/kernel/break.S
··· 21 21 # 22 22 # the break handler has its own stack 23 23 # 24 - .section .bss.stack 24 + .section .bss..stack 25 25 .globl __break_user_context 26 26 .balign THREAD_SIZE 27 27 __break_stack: ··· 63 63 # entry point for Break Exceptions/Interrupts 64 64 # 65 65 ############################################################################### 66 - .section .text.break 66 + .section .text..break 67 67 .balign 4 68 68 .globl __entry_break 69 69 __entry_break:
+1 -1
arch/frv/kernel/entry.S
··· 38 38 39 39 #define nr_syscalls ((syscall_table_size)/4) 40 40 41 - .section .text.entry 41 + .section .text..entry 42 42 .balign 4 43 43 44 44 .macro LEDS val
+1 -1
arch/frv/kernel/head.S
··· 542 542 .size _boot, .-_boot 543 543 544 544 # provide a point for GDB to place a break 545 - .section .text.start,"ax" 545 + .section .text..start,"ax" 546 546 .globl _start 547 547 .balign 4 548 548 _start:
+5 -5
arch/frv/kernel/vmlinux.lds.S
··· 57 57 _text = .; 58 58 _stext = .; 59 59 .text : { 60 - *(.text.start) 61 - *(.text.entry) 62 - *(.text.break) 63 - *(.text.tlbmiss) 60 + *(.text..start) 61 + *(.text..entry) 62 + *(.text..break) 63 + *(.text..tlbmiss) 64 64 TEXT_TEXT 65 65 SCHED_TEXT 66 66 LOCK_TEXT ··· 114 114 115 115 .sbss : { *(.sbss .sbss.*) } 116 116 .bss : { *(.bss .bss.*) } 117 - .bss.stack : { *(.bss) } 117 + .bss..stack : { *(.bss) } 118 118 119 119 __bss_stop = .; 120 120 _end = . ;
+1 -1
arch/frv/mm/tlb-miss.S
··· 15 15 #include <asm/pgtable.h> 16 16 #include <asm/spr-regs.h> 17 17 18 - .section .text.tlbmiss 18 + .section .text..tlbmiss 19 19 .balign 4 20 20 21 21 .globl __entry_insn_mmu_miss
+1 -1
arch/h8300/boot/compressed/head.S
··· 9 9 10 10 #define SRAM_START 0xff4000 11 11 12 - .section .text.startup 12 + .section .text..startup 13 13 .global startup 14 14 startup: 15 15 mov.l #SRAM_START+0x8000, sp
+1 -1
arch/h8300/boot/compressed/vmlinux.lds
··· 4 4 { 5 5 __stext = . ; 6 6 __text = .; 7 - *(.text.startup) 7 + *(.text..startup) 8 8 *(.text) 9 9 __etext = . ; 10 10 }
+6 -6
arch/ia64/include/asm/asmmacro.h
··· 70 70 * path (ivt.S - TLB miss processing) or in places where it might not be 71 71 * safe to use a "tpa" instruction (mca_asm.S - error recovery). 72 72 */ 73 - .section ".data.patch.vtop", "a" // declare section & section attributes 73 + .section ".data..patch.vtop", "a" // declare section & section attributes 74 74 .previous 75 75 76 76 #define LOAD_PHYSICAL(pr, reg, obj) \ 77 77 [1:](pr)movl reg = obj; \ 78 - .xdata4 ".data.patch.vtop", 1b-. 78 + .xdata4 ".data..patch.vtop", 1b-. 79 79 80 80 /* 81 81 * For now, we always put in the McKinley E9 workaround. On CPUs that don't need it, ··· 84 84 #define DO_MCKINLEY_E9_WORKAROUND 85 85 86 86 #ifdef DO_MCKINLEY_E9_WORKAROUND 87 - .section ".data.patch.mckinley_e9", "a" 87 + .section ".data..patch.mckinley_e9", "a" 88 88 .previous 89 89 /* workaround for Itanium 2 Errata 9: */ 90 90 # define FSYS_RETURN \ 91 - .xdata4 ".data.patch.mckinley_e9", 1f-.; \ 91 + .xdata4 ".data..patch.mckinley_e9", 1f-.; \ 92 92 1:{ .mib; \ 93 93 nop.m 0; \ 94 94 mov r16=ar.pfs; \ ··· 107 107 * If physical stack register size is different from DEF_NUM_STACK_REG, 108 108 * dynamically patch the kernel for correct size. 109 109 */ 110 - .section ".data.patch.phys_stack_reg", "a" 110 + .section ".data..patch.phys_stack_reg", "a" 111 111 .previous 112 112 #define LOAD_PHYS_STACK_REG_SIZE(reg) \ 113 113 [1:] adds reg=IA64_NUM_PHYS_STACK_REG*8+8,r0; \ 114 - .xdata4 ".data.patch.phys_stack_reg", 1b-. 114 + .xdata4 ".data..patch.phys_stack_reg", 1b-. 115 115 116 116 /* 117 117 * Up until early 2004, use of .align within a function caused bad unwind info.
+1 -1
arch/ia64/include/asm/cache.h
··· 24 24 # define SMP_CACHE_BYTES (1 << 3) 25 25 #endif 26 26 27 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 27 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 28 28 29 29 #endif /* _ASM_IA64_CACHE_H */
+1 -1
arch/ia64/include/asm/percpu.h
··· 31 31 32 32 #endif /* SMP */ 33 33 34 - #define PER_CPU_BASE_SECTION ".data.percpu" 34 + #define PER_CPU_BASE_SECTION ".data..percpu" 35 35 36 36 /* 37 37 * Be extremely careful when taking the address of this variable! Due to virtual
+1 -1
arch/ia64/kernel/Makefile.gate
··· 21 21 $(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE 22 22 $(call if_changed,gate) 23 23 24 - # gate-data.o contains the gate DSO image as data in section .data.gate. 24 + # gate-data.o contains the gate DSO image as data in section .data..gate. 25 25 # We must build gate.so before we can assemble it. 26 26 # Note: kbuild does not track this dependency due to usage of .incbin 27 27 $(obj)/gate-data.o: $(obj)/gate.so
+1 -1
arch/ia64/kernel/gate-data.S
··· 1 - .section .data.gate, "aw" 1 + .section .data..gate, "aw" 2 2 3 3 .incbin "arch/ia64/kernel/gate.so"
+4 -4
arch/ia64/kernel/gate.S
··· 21 21 * to targets outside the shared object) and to avoid multi-phase kernel builds, we 22 22 * simply create minimalistic "patch lists" in special ELF sections. 23 23 */ 24 - .section ".data.patch.fsyscall_table", "a" 24 + .section ".data..patch.fsyscall_table", "a" 25 25 .previous 26 26 #define LOAD_FSYSCALL_TABLE(reg) \ 27 27 [1:] movl reg=0; \ 28 - .xdata4 ".data.patch.fsyscall_table", 1b-. 28 + .xdata4 ".data..patch.fsyscall_table", 1b-. 29 29 30 - .section ".data.patch.brl_fsys_bubble_down", "a" 30 + .section ".data..patch.brl_fsys_bubble_down", "a" 31 31 .previous 32 32 #define BRL_COND_FSYS_BUBBLE_DOWN(pr) \ 33 33 [1:](pr)brl.cond.sptk 0; \ 34 34 ;; \ 35 - .xdata4 ".data.patch.brl_fsys_bubble_down", 1b-. 35 + .xdata4 ".data..patch.brl_fsys_bubble_down", 1b-. 36 36 37 37 GLOBAL_ENTRY(__kernel_syscall_via_break) 38 38 .prologue
+5 -5
arch/ia64/kernel/gate.lds.S
··· 33 33 */ 34 34 . = GATE_ADDR + 0x600; 35 35 36 - .data.patch : { 36 + .data..patch : { 37 37 __paravirt_start_gate_mckinley_e9_patchlist = .; 38 - *(.data.patch.mckinley_e9) 38 + *(.data..patch.mckinley_e9) 39 39 __paravirt_end_gate_mckinley_e9_patchlist = .; 40 40 41 41 __paravirt_start_gate_vtop_patchlist = .; 42 - *(.data.patch.vtop) 42 + *(.data..patch.vtop) 43 43 __paravirt_end_gate_vtop_patchlist = .; 44 44 45 45 __paravirt_start_gate_fsyscall_patchlist = .; 46 - *(.data.patch.fsyscall_table) 46 + *(.data..patch.fsyscall_table) 47 47 __paravirt_end_gate_fsyscall_patchlist = .; 48 48 49 49 __paravirt_start_gate_brl_fsys_bubble_down_patchlist = .; 50 - *(.data.patch.brl_fsys_bubble_down) 50 + *(.data..patch.brl_fsys_bubble_down) 51 51 __paravirt_end_gate_brl_fsys_bubble_down_patchlist = .; 52 52 } :readable 53 53
+1 -1
arch/ia64/kernel/init_task.c
··· 23 23 * Initial task structure. 24 24 * 25 25 * We need to make sure that this is properly aligned due to the way process stacks are 26 - * handled. This is done by having a special ".data.init_task" section... 26 + * handled. This is done by having a special ".data..init_task" section... 27 27 */ 28 28 #define init_thread_info init_task_mem.s.thread_info 29 29
+1 -1
arch/ia64/kernel/ivt.S
··· 82 82 mov r19=n;; /* prepare to save predicates */ \ 83 83 br.sptk.many dispatch_to_fault_handler 84 84 85 - .section .text.ivt,"ax" 85 + .section .text..ivt,"ax" 86 86 87 87 .align 32768 // align on 32KB boundary 88 88 .global ia64_ivt
+2 -2
arch/ia64/kernel/minstate.h
··· 16 16 #define ACCOUNT_SYS_ENTER 17 17 #endif 18 18 19 - .section ".data.patch.rse", "a" 19 + .section ".data..patch.rse", "a" 20 20 .previous 21 21 22 22 /* ··· 215 215 (pUStk) extr.u r17=r18,3,6; \ 216 216 (pUStk) sub r16=r18,r22; \ 217 217 [1:](pKStk) br.cond.sptk.many 1f; \ 218 - .xdata4 ".data.patch.rse",1b-. \ 218 + .xdata4 ".data..patch.rse",1b-. \ 219 219 ;; \ 220 220 cmp.ge p6,p7 = 33,r17; \ 221 221 ;; \
+1 -1
arch/ia64/kernel/paravirtentry.S
··· 28 28 #include "entry.h" 29 29 30 30 #define DATA8(sym, init_value) \ 31 - .pushsection .data.read_mostly ; \ 31 + .pushsection .data..read_mostly ; \ 32 32 .align 8 ; \ 33 33 .global sym ; \ 34 34 sym: ; \
+14 -14
arch/ia64/kernel/vmlinux.lds.S
··· 8 8 9 9 #define IVT_TEXT \ 10 10 VMLINUX_SYMBOL(__start_ivt_text) = .; \ 11 - *(.text.ivt) \ 11 + *(.text..ivt) \ 12 12 VMLINUX_SYMBOL(__end_ivt_text) = .; 13 13 14 14 OUTPUT_FORMAT("elf64-ia64-little") ··· 54 54 .text2 : AT(ADDR(.text2) - LOAD_OFFSET) 55 55 { *(.text2) } 56 56 #ifdef CONFIG_SMP 57 - .text.lock : AT(ADDR(.text.lock) - LOAD_OFFSET) 58 - { *(.text.lock) } 57 + .text..lock : AT(ADDR(.text..lock) - LOAD_OFFSET) 58 + { *(.text..lock) } 59 59 #endif 60 60 _etext = .; 61 61 ··· 75 75 __stop___mca_table = .; 76 76 } 77 77 78 - .data.patch.phys_stack_reg : AT(ADDR(.data.patch.phys_stack_reg) - LOAD_OFFSET) 78 + .data..patch.phys_stack_reg : AT(ADDR(.data..patch.phys_stack_reg) - LOAD_OFFSET) 79 79 { 80 80 __start___phys_stack_reg_patchlist = .; 81 - *(.data.patch.phys_stack_reg) 81 + *(.data..patch.phys_stack_reg) 82 82 __end___phys_stack_reg_patchlist = .; 83 83 } 84 84 ··· 110 110 INIT_TEXT_SECTION(PAGE_SIZE) 111 111 INIT_DATA_SECTION(16) 112 112 113 - .data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET) 113 + .data..patch.vtop : AT(ADDR(.data..patch.vtop) - LOAD_OFFSET) 114 114 { 115 115 __start___vtop_patchlist = .; 116 - *(.data.patch.vtop) 116 + *(.data..patch.vtop) 117 117 __end___vtop_patchlist = .; 118 118 } 119 119 120 - .data.patch.rse : AT(ADDR(.data.patch.rse) - LOAD_OFFSET) 120 + .data..patch.rse : AT(ADDR(.data..patch.rse) - LOAD_OFFSET) 121 121 { 122 122 __start___rse_patchlist = .; 123 - *(.data.patch.rse) 123 + *(.data..patch.rse) 124 124 __end___rse_patchlist = .; 125 125 } 126 126 127 - .data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET) 127 + .data..patch.mckinley_e9 : AT(ADDR(.data..patch.mckinley_e9) - LOAD_OFFSET) 128 128 { 129 129 __start___mckinley_e9_bundles = .; 130 - *(.data.patch.mckinley_e9) 130 + *(.data..patch.mckinley_e9) 131 131 __end___mckinley_e9_bundles = .; 132 132 } 133 133 ··· 175 175 . = ALIGN(PAGE_SIZE); 176 176 __init_end = .; 177 177 178 - .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) 178 + .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) 179 179 { 180 180 PAGE_ALIGNED_DATA(PAGE_SIZE) 181 181 . = ALIGN(PAGE_SIZE); 182 182 __start_gate_section = .; 183 - *(.data.gate) 183 + *(.data..gate) 184 184 __stop_gate_section = .; 185 185 #ifdef CONFIG_XEN 186 186 . = ALIGN(PAGE_SIZE); 187 187 __xen_start_gate_section = .; 188 - *(.data.gate.xen) 188 + *(.data..gate.xen) 189 189 __xen_stop_gate_section = .; 190 190 #endif 191 191 }
+1 -1
arch/ia64/kvm/vmm_ivt.S
··· 104 104 br.call.sptk.many b6=vmm_panic_handler; 105 105 END(kvm_vmm_panic) 106 106 107 - .section .text.ivt,"ax" 107 + .section .text..ivt,"ax" 108 108 109 109 .align 32768 // align on 32KB boundary 110 110 .global kvm_ia64_ivt
+1 -1
arch/ia64/scripts/unwcheck.py
··· 1 - #!/usr/bin/env python 1 + #!/usr/bin/python 2 2 # 3 3 # Usage: unwcheck.py FILE 4 4 #
+1 -1
arch/ia64/xen/gate-data.S
··· 1 - .section .data.gate.xen, "aw" 1 + .section .data..gate.xen, "aw" 2 2 3 3 .incbin "arch/ia64/xen/gate.so"
+1 -1
arch/ia64/xen/xensetup.S
··· 14 14 #include <linux/init.h> 15 15 #include <xen/interface/elfnote.h> 16 16 17 - .section .data.read_mostly 17 + .section .data..read_mostly 18 18 .align 8 19 19 .global xen_domain_type 20 20 xen_domain_type:
+2 -2
arch/m68knommu/kernel/vmlinux.lds.S
··· 57 57 .romvec : { 58 58 __rom_start = . ; 59 59 _romvec = .; 60 - *(.data.initvect) 60 + *(.data..initvect) 61 61 } > romvec 62 62 #endif 63 63 ··· 68 68 TEXT_TEXT 69 69 SCHED_TEXT 70 70 LOCK_TEXT 71 - *(.text.lock) 71 + *(.text..lock) 72 72 73 73 . = ALIGN(16); /* Exception table */ 74 74 __start___ex_table = .;
+1 -1
arch/m68knommu/platform/68360/head-ram.S
··· 280 280 * and then overwritten as needed. 281 281 */ 282 282 283 - .section ".data.initvect","awx" 283 + .section ".data..initvect","awx" 284 284 .long RAMEND /* Reset: Initial Stack Pointer - 0. */ 285 285 .long _start /* Reset: Initial Program Counter - 1. */ 286 286 .long buserr /* Bus Error - 2. */
+1 -1
arch/m68knommu/platform/68360/head-rom.S
··· 291 291 * and then overwritten as needed. 292 292 */ 293 293 294 - .section ".data.initvect","awx" 294 + .section ".data..initvect","awx" 295 295 .long RAMEND /* Reset: Initial Stack Pointer - 0. */ 296 296 .long _start /* Reset: Initial Program Counter - 1. */ 297 297 .long buserr /* Bus Error - 2. */
+1 -1
arch/mips/lasat/image/head.S
··· 1 1 #include <asm/lasat/head.h> 2 2 3 3 .text 4 - .section .text.start, "ax" 4 + .section .text..start, "ax" 5 5 .set noreorder 6 6 .set mips3 7 7
+1 -1
arch/mips/lasat/image/romscript.normal
··· 4 4 { 5 5 .text : 6 6 { 7 - *(.text.start) 7 + *(.text..start) 8 8 } 9 9 10 10 /* Data in ROM */
+1 -1
arch/parisc/include/asm/cache.h
··· 28 28 29 29 #define SMP_CACHE_BYTES L1_CACHE_BYTES 30 30 31 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 31 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 32 32 33 33 void parisc_cache_init(void); /* initializes cache-flushing */ 34 34 void disable_sr_hashing_asm(int); /* low level support for above */
+1 -1
arch/parisc/include/asm/system.h
··· 174 174 }) 175 175 176 176 #ifdef CONFIG_SMP 177 - # define __lock_aligned __attribute__((__section__(".data.lock_aligned"))) 177 + # define __lock_aligned __attribute__((__section__(".data..lock_aligned"))) 178 178 #endif 179 179 180 180 #define arch_align_stack(x) (x)
+1 -1
arch/parisc/kernel/head.S
··· 345 345 ENDPROC(stext) 346 346 347 347 #ifndef CONFIG_64BIT 348 - .section .data.read_mostly 348 + .section .data..read_mostly 349 349 350 350 .align 4 351 351 .export $global$,data
+3 -3
arch/parisc/kernel/init_task.c
··· 53 53 * guarantee that global objects will be laid out in memory in the same order 54 54 * as the order of declaration, so put these in different sections and use 55 55 * the linker script to order them. */ 56 - pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((__section__ (".data.vm0.pmd"), aligned(PAGE_SIZE))); 56 + pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((__section__ (".data..vm0.pmd"), aligned(PAGE_SIZE))); 57 57 #endif 58 58 59 - pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((__section__ (".data.vm0.pgd"), aligned(PAGE_SIZE))); 60 - pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data.vm0.pte"), aligned(PAGE_SIZE))); 59 + pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((__section__ (".data..vm0.pgd"), aligned(PAGE_SIZE))); 60 + pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data..vm0.pte"), aligned(PAGE_SIZE))); 61 61 62 62 /* 63 63 * Initial task structure.
+6 -6
arch/parisc/kernel/vmlinux.lds.S
··· 94 94 95 95 /* PA-RISC locks requires 16-byte alignment */ 96 96 . = ALIGN(16); 97 - .data.lock_aligned : { 98 - *(.data.lock_aligned) 97 + .data..lock_aligned : { 98 + *(.data..lock_aligned) 99 99 } 100 100 101 101 /* End of data section */ ··· 105 105 __bss_start = .; 106 106 /* page table entries need to be PAGE_SIZE aligned */ 107 107 . = ALIGN(PAGE_SIZE); 108 - .data.vmpages : { 109 - *(.data.vm0.pmd) 110 - *(.data.vm0.pgd) 111 - *(.data.vm0.pte) 108 + .data..vmpages : { 109 + *(.data..vm0.pmd) 110 + *(.data..vm0.pgd) 111 + *(.data..vm0.pte) 112 112 } 113 113 .bss : { 114 114 *(.bss)
+5
arch/powerpc/Makefile
··· 112 112 # kernel considerably. 113 113 KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time) 114 114 115 + # FIXME: the module load should be taught about the additional relocs 116 + # generated by this. 117 + # revert to pre-gcc-4.4 behaviour of .eh_frame 118 + KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm) 119 + 115 120 # Never use string load/store instructions as they are 116 121 # often slow when they are implemented at all 117 122 KBUILD_CFLAGS += -mno-string
+1 -1
arch/powerpc/include/asm/cache.h
··· 42 42 #endif /* __powerpc64__ && ! __ASSEMBLY__ */ 43 43 44 44 #if !defined(__ASSEMBLY__) 45 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 45 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 46 46 #endif 47 47 48 48 #endif /* __KERNEL__ */
-8
arch/powerpc/include/asm/page_64.h
··· 162 162 163 163 #endif /* !CONFIG_HUGETLB_PAGE */ 164 164 165 - #ifdef MODULE 166 - #define __page_aligned __attribute__((__aligned__(PAGE_SIZE))) 167 - #else 168 - #define __page_aligned \ 169 - __attribute__((__aligned__(PAGE_SIZE), \ 170 - __section__(".data.page_aligned"))) 171 - #endif 172 - 173 165 #define VM_DATA_DEFAULT_FLAGS \ 174 166 (test_thread_flag(TIF_32BIT) ? \ 175 167 VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
+4 -6
arch/powerpc/kernel/vmlinux.lds.S
··· 223 223 #endif 224 224 225 225 /* The initial task and kernel stack */ 226 - .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { 227 - INIT_TASK_DATA(THREAD_SIZE) 228 - } 226 + INIT_TASK_DATA_SECTION(THREAD_SIZE) 229 227 230 - .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { 228 + .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) { 231 229 PAGE_ALIGNED_DATA(PAGE_SIZE) 232 230 } 233 231 234 - .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { 232 + .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) { 235 233 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) 236 234 } 237 235 238 - .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { 236 + .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) { 239 237 READ_MOSTLY_DATA(L1_CACHE_BYTES) 240 238 } 241 239
+1 -1
arch/s390/include/asm/cache.h
··· 14 14 #define L1_CACHE_BYTES 256 15 15 #define L1_CACHE_SHIFT 8 16 16 17 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 17 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 18 18 19 19 #endif
+1 -1
arch/s390/kernel/swsusp_asm64.S
··· 264 264 lghi %r2,0 265 265 br %r14 266 266 267 - .section .data.nosave,"aw",@progbits 267 + .section .data..nosave,"aw",@progbits 268 268 .align 8 269 269 .Ldisabled_wait_31: 270 270 .long 0x000a0000,0x00000000
+1 -1
arch/sh/boot/compressed/vmlinux.scr
··· 1 1 SECTIONS 2 2 { 3 - .rodata.compressed : { 3 + .rodata..compressed : { 4 4 input_len = .; 5 5 LONG(input_data_end - input_data) input_data = .; 6 6 *(.data)
+1 -1
arch/sh/include/asm/cache.h
··· 14 14 15 15 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) 16 16 17 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 17 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 18 18 19 19 #ifndef __ASSEMBLY__ 20 20 struct cache_info {
+1 -1
arch/sparc/boot/btfixupprep.c
··· 325 325 (*rr)->next = NULL; 326 326 } 327 327 printf("! Generated by btfixupprep. Do not edit.\n\n"); 328 - printf("\t.section\t\".data.init\",#alloc,#write\n\t.align\t4\n\n"); 328 + printf("\t.section\t\".data..init\",#alloc,#write\n\t.align\t4\n\n"); 329 329 printf("\t.global\t___btfixup_start\n___btfixup_start:\n\n"); 330 330 for (i = 0; i < last; i++) { 331 331 f = array + i;
+1 -1
arch/sparc/include/asm/cache.h
··· 21 21 22 22 #define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT) 23 23 24 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 24 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 25 25 26 26 #ifdef CONFIG_SPARC32 27 27 #include <asm/asi.h>
+1 -1
arch/um/kernel/dyn.lds.S
··· 94 94 .data : { 95 95 INIT_TASK_DATA(KERNEL_STACK_SIZE) 96 96 . = ALIGN(KERNEL_STACK_SIZE); 97 - *(.data.init_irqstack) 97 + *(.data..init_irqstack) 98 98 DATA_DATA 99 99 *(.data.* .gnu.linkonce.d.*) 100 100 SORT(CONSTRUCTORS)
+1 -1
arch/um/kernel/init_task.c
··· 34 34 { INIT_THREAD_INFO(init_task) }; 35 35 36 36 union thread_union cpu0_irqstack 37 - __attribute__((__section__(".data.init_irqstack"))) = 37 + __attribute__((__section__(".data..init_irqstack"))) = 38 38 { INIT_THREAD_INFO(init_task) };
+1 -1
arch/um/kernel/uml.lds.S
··· 50 50 { 51 51 INIT_TASK_DATA(KERNEL_STACK_SIZE) 52 52 . = ALIGN(KERNEL_STACK_SIZE); 53 - *(.data.init_irqstack) 53 + *(.data..init_irqstack) 54 54 DATA_DATA 55 55 *(.gnu.linkonce.d*) 56 56 CONSTRUCTORS
+3
arch/x86/.gitignore
··· 1 + boot/compressed/vmlinux 2 + tools/test_get_len 3 +
+1 -1
arch/x86/boot/compressed/mkpiggy.c
··· 77 77 offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */ 78 78 offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ 79 79 80 - printf(".section \".rodata.compressed\",\"a\",@progbits\n"); 80 + printf(".section \".rodata..compressed\",\"a\",@progbits\n"); 81 81 printf(".globl z_input_len\n"); 82 82 printf("z_input_len = %lu\n", ilen); 83 83 printf(".globl z_output_len\n");
+2 -2
arch/x86/boot/compressed/vmlinux.lds.S
··· 26 26 HEAD_TEXT 27 27 _ehead = . ; 28 28 } 29 - .rodata.compressed : { 30 - *(.rodata.compressed) 29 + .rodata..compressed : { 30 + *(.rodata..compressed) 31 31 } 32 32 .text : { 33 33 _text = .; /* Text */
+1 -1
arch/x86/include/asm/cache.h
··· 7 7 #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) 8 8 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) 9 9 10 - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) 10 + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) 11 11 12 12 #define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT 13 13 #define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT)
+1 -1
arch/x86/kernel/acpi/wakeup_32.S
··· 1 - .section .text.page_aligned 1 + .section .text..page_aligned 2 2 #include <linux/linkage.h> 3 3 #include <asm/segment.h> 4 4 #include <asm/page_types.h>
+1 -1
arch/x86/kernel/init_task.c
··· 34 34 /* 35 35 * per-CPU TSS segments. Threads are completely 'soft' on Linux, 36 36 * no more per-task TSS's. The TSS size is kept cacheline-aligned 37 - * so they are allowed to end up in the .data.cacheline_aligned 37 + * so they are allowed to end up in the .data..cacheline_aligned 38 38 * section. Since TSS's are completely CPU-local, we want them 39 39 * on exact cacheline boundaries, to eliminate cacheline ping-pong. 40 40 */
+1 -1
arch/x86/kernel/setup_percpu.c
··· 247 247 #endif 248 248 #endif 249 249 /* 250 - * Up to this point, the boot CPU has been using .data.init 250 + * Up to this point, the boot CPU has been using .init.data 251 251 * area. Reload any changed state for the boot CPU. 252 252 */ 253 253 if (cpu == boot_cpu_id)
+2 -2
arch/x86/kernel/vmlinux.lds.S
··· 97 97 HEAD_TEXT 98 98 #ifdef CONFIG_X86_32 99 99 . = ALIGN(PAGE_SIZE); 100 - *(.text.page_aligned) 100 + *(.text..page_aligned) 101 101 #endif 102 102 . = ALIGN(8); 103 103 _stext = .; ··· 305 305 . = ALIGN(PAGE_SIZE); 306 306 .bss : AT(ADDR(.bss) - LOAD_OFFSET) { 307 307 __bss_start = .; 308 - *(.bss.page_aligned) 308 + *(.bss..page_aligned) 309 309 *(.bss) 310 310 . = ALIGN(4); 311 311 __bss_stop = .;
+5 -5
include/asm-generic/percpu.h
··· 80 80 81 81 #ifndef PER_CPU_BASE_SECTION 82 82 #ifdef CONFIG_SMP 83 - #define PER_CPU_BASE_SECTION ".data.percpu" 83 + #define PER_CPU_BASE_SECTION ".data..percpu" 84 84 #else 85 85 #define PER_CPU_BASE_SECTION ".data" 86 86 #endif ··· 92 92 #define PER_CPU_SHARED_ALIGNED_SECTION "" 93 93 #define PER_CPU_ALIGNED_SECTION "" 94 94 #else 95 - #define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned" 96 - #define PER_CPU_ALIGNED_SECTION ".shared_aligned" 95 + #define PER_CPU_SHARED_ALIGNED_SECTION "..shared_aligned" 96 + #define PER_CPU_ALIGNED_SECTION "..shared_aligned" 97 97 #endif 98 - #define PER_CPU_FIRST_SECTION ".first" 98 + #define PER_CPU_FIRST_SECTION "..first" 99 99 100 100 #else 101 101 102 102 #define PER_CPU_SHARED_ALIGNED_SECTION "" 103 - #define PER_CPU_ALIGNED_SECTION ".shared_aligned" 103 + #define PER_CPU_ALIGNED_SECTION "..shared_aligned" 104 104 #define PER_CPU_FIRST_SECTION "" 105 105 106 106 #endif
+19 -19
include/asm-generic/vmlinux.lds.h
··· 175 175 #define NOSAVE_DATA \ 176 176 . = ALIGN(PAGE_SIZE); \ 177 177 VMLINUX_SYMBOL(__nosave_begin) = .; \ 178 - *(.data.nosave) \ 178 + *(.data..nosave) \ 179 179 . = ALIGN(PAGE_SIZE); \ 180 180 VMLINUX_SYMBOL(__nosave_end) = .; 181 181 182 182 #define PAGE_ALIGNED_DATA(page_align) \ 183 183 . = ALIGN(page_align); \ 184 - *(.data.page_aligned) 184 + *(.data..page_aligned) 185 185 186 186 #define READ_MOSTLY_DATA(align) \ 187 187 . = ALIGN(align); \ 188 - *(.data.read_mostly) 188 + *(.data..read_mostly) 189 189 190 190 #define CACHELINE_ALIGNED_DATA(align) \ 191 191 . = ALIGN(align); \ 192 - *(.data.cacheline_aligned) 192 + *(.data..cacheline_aligned) 193 193 194 194 #define INIT_TASK_DATA(align) \ 195 195 . = ALIGN(align); \ 196 - *(.data.init_task) 196 + *(.data..init_task) 197 197 198 198 /* 199 199 * Read only Data ··· 435 435 */ 436 436 #define INIT_TASK_DATA_SECTION(align) \ 437 437 . = ALIGN(align); \ 438 - .data.init_task : { \ 438 + .data..init_task : { \ 439 439 INIT_TASK_DATA(align) \ 440 440 } 441 441 ··· 499 499 #define BSS(bss_align) \ 500 500 . = ALIGN(bss_align); \ 501 501 .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 502 - *(.bss.page_aligned) \ 502 + *(.bss..page_aligned) \ 503 503 *(.dynbss) \ 504 504 *(.bss) \ 505 505 *(COMMON) \ ··· 666 666 */ 667 667 #define PERCPU_VADDR(vaddr, phdr) \ 668 668 VMLINUX_SYMBOL(__per_cpu_load) = .; \ 669 - .data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 669 + .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ 670 670 - LOAD_OFFSET) { \ 671 671 VMLINUX_SYMBOL(__per_cpu_start) = .; \ 672 - *(.data.percpu.first) \ 673 - *(.data.percpu.page_aligned) \ 674 - *(.data.percpu) \ 675 - *(.data.percpu.shared_aligned) \ 672 + *(.data..percpu..first) \ 673 + *(.data..percpu..page_aligned) \ 674 + *(.data..percpu) \ 675 + *(.data..percpu..shared_aligned) \ 676 676 VMLINUX_SYMBOL(__per_cpu_end) = .; \ 677 677 } phdr \ 678 - . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu); 678 + . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); 679 679 680 680 /** 681 681 * PERCPU - define output section for percpu area, simple version ··· 687 687 * 688 688 * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except 689 689 * that __per_cpu_load is defined as a relative symbol against 690 - * .data.percpu which is required for relocatable x86_32 690 + * .data..percpu which is required for relocatable x86_32 691 691 * configuration. 692 692 */ 693 693 #define PERCPU(align) \ 694 694 . = ALIGN(align); \ 695 - .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ 695 + .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 696 696 VMLINUX_SYMBOL(__per_cpu_load) = .; \ 697 697 VMLINUX_SYMBOL(__per_cpu_start) = .; \ 698 - *(.data.percpu.first) \ 699 - *(.data.percpu.page_aligned) \ 700 - *(.data.percpu) \ 701 - *(.data.percpu.shared_aligned) \ 698 + *(.data..percpu..first) \ 699 + *(.data..percpu..page_aligned) \ 700 + *(.data..percpu) \ 701 + *(.data..percpu..shared_aligned) \ 702 702 VMLINUX_SYMBOL(__per_cpu_end) = .; \ 703 703 } 704 704
+1 -1
include/linux/cache.h
··· 31 31 #ifndef __cacheline_aligned 32 32 #define __cacheline_aligned \ 33 33 __attribute__((__aligned__(SMP_CACHE_BYTES), \ 34 - __section__(".data.cacheline_aligned"))) 34 + __section__(".data..cacheline_aligned"))) 35 35 #endif /* __cacheline_aligned */ 36 36 37 37 #ifndef __cacheline_aligned_in_smp
+1 -1
include/linux/init.h
··· 301 301 #endif 302 302 303 303 /* Data marked not to be saved by software suspend */ 304 - #define __nosavedata __section(.data.nosave) 304 + #define __nosavedata __section(.data..nosave) 305 305 306 306 /* This means "can be init if no module support, otherwise module load 307 307 may call it." */
+1 -1
include/linux/init_task.h
··· 183 183 } 184 184 185 185 /* Attach to the init_task data structure for proper alignment */ 186 - #define __init_task_data __attribute__((__section__(".data.init_task"))) 186 + #define __init_task_data __attribute__((__section__(".data..init_task"))) 187 187 188 188 189 189 #endif
+4 -4
include/linux/linkage.h
··· 18 18 # define asmregparm 19 19 #endif 20 20 21 - #define __page_aligned_data __section(.data.page_aligned) __aligned(PAGE_SIZE) 22 - #define __page_aligned_bss __section(.bss.page_aligned) __aligned(PAGE_SIZE) 21 + #define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE) 22 + #define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE) 23 23 24 24 /* 25 25 * For assembly routines. ··· 27 27 * Note when using these that you must specify the appropriate 28 28 * alignment directives yourself 29 29 */ 30 - #define __PAGE_ALIGNED_DATA .section ".data.page_aligned", "aw" 31 - #define __PAGE_ALIGNED_BSS .section ".bss.page_aligned", "aw" 30 + #define __PAGE_ALIGNED_DATA .section ".data..page_aligned", "aw" 31 + #define __PAGE_ALIGNED_BSS .section ".bss..page_aligned", "aw" 32 32 33 33 /* 34 34 * This is used by architectures to keep arguments on the stack
+2 -2
include/linux/percpu-defs.h
··· 131 131 * Declaration/definition used for per-CPU variables that must be page aligned. 132 132 */ 133 133 #define DECLARE_PER_CPU_PAGE_ALIGNED(type, name) \ 134 - DECLARE_PER_CPU_SECTION(type, name, ".page_aligned") \ 134 + DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \ 135 135 __aligned(PAGE_SIZE) 136 136 137 137 #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ 138 - DEFINE_PER_CPU_SECTION(type, name, ".page_aligned") \ 138 + DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \ 139 139 __aligned(PAGE_SIZE) 140 140 141 141 /*
+1 -1
include/linux/spinlock.h
··· 60 60 /* 61 61 * Must define these before including other files, inline functions need them 62 62 */ 63 - #define LOCK_SECTION_NAME ".text.lock."KBUILD_BASENAME 63 + #define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME 64 64 65 65 #define LOCK_SECTION_START(extra) \ 66 66 ".subsection 1\n\t" \
+8
init/Kconfig
··· 76 76 variables passed to init from the kernel command line. 77 77 78 78 79 + config CROSS_COMPILE 80 + string "Cross-compiler tool prefix" 81 + help 82 + Same as running 'make CROSS_COMPILE=prefix-' but stored for 83 + default make runs in this kernel build directory. You don't 84 + need to set this unless you want the configured kernel build 85 + directory to select the cross-compiler automatically. 86 + 79 87 config LOCALVERSION 80 88 string "Local version - append to kernel release" 81 89 help
+1 -1
kernel/module.c
··· 403 403 Elf_Shdr *sechdrs, 404 404 const char *secstrings) 405 405 { 406 - return find_sec(hdr, sechdrs, secstrings, ".data.percpu"); 406 + return find_sec(hdr, sechdrs, secstrings, ".data..percpu"); 407 407 } 408 408 409 409 static void percpu_modcopy(struct module *mod,
+1 -1
scripts/Makefile.build
··· 82 82 lib-target := $(obj)/lib.a 83 83 endif 84 84 85 - ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),) 85 + ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),) 86 86 builtin-target := $(obj)/built-in.o 87 87 endif 88 88
+1 -1
scripts/Makefile.lib
··· 241 241 lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ 242 242 (rm -f $@ ; false) 243 243 244 - quiet_cmd_lzo = LZO $@ 244 + quiet_cmd_lzo = LZO $@ 245 245 cmd_lzo = (cat $(filter-out FORCE,$^) | \ 246 246 lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ 247 247 (rm -f $@ ; false)
+14 -10
scripts/checkincludes.pl
··· 11 11 # you do have real dups and do not have them under #ifdef's. You 12 12 # could also just review the results. 13 13 14 + use strict; 15 + 14 16 sub usage { 15 17 print "Usage: checkincludes.pl [-r]\n"; 16 18 print "By default we just warn of duplicates\n"; ··· 37 35 } 38 36 } 39 37 40 - foreach $file (@ARGV) { 41 - open(FILE, $file) or die "Cannot open $file: $!.\n"; 38 + foreach my $file (@ARGV) { 39 + open(my $f, '<', $file) 40 + or die "Cannot open $file: $!.\n"; 42 41 43 42 my %includedfiles = (); 44 43 my @file_lines = (); 45 44 46 - while (<FILE>) { 45 + while (<$f>) { 47 46 if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { 48 47 ++$includedfiles{$1}; 49 48 } 50 49 push(@file_lines, $_); 51 50 } 52 51 53 - close(FILE); 52 + close($f); 54 53 55 54 if (!$remove) { 56 - foreach $filename (keys %includedfiles) { 55 + foreach my $filename (keys %includedfiles) { 57 56 if ($includedfiles{$filename} > 1) { 58 57 print "$file: $filename is included more than once.\n"; 59 58 } ··· 62 59 next; 63 60 } 64 61 65 - open(FILE,">$file") || die("Cannot write to $file: $!"); 62 + open($f, '>', $file) 63 + or die("Cannot write to $file: $!"); 66 64 67 65 my $dups = 0; 68 66 foreach (@file_lines) { 69 67 if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) { 70 - foreach $filename (keys %includedfiles) { 68 + foreach my $filename (keys %includedfiles) { 71 69 if ($1 eq $filename) { 72 70 if ($includedfiles{$filename} > 1) { 73 71 $includedfiles{$filename}--; 74 72 $dups++; 75 73 } else { 76 - print FILE $_; 74 + print {$f} $_; 77 75 } 78 76 } 79 77 } 80 78 } else { 81 - print FILE $_; 79 + print {$f} $_; 82 80 } 83 81 } 84 82 if ($dups > 0) { 85 83 print "$file: removed $dups duplicate includes\n"; 86 84 } 87 - close(FILE); 85 + close($f); 88 86 }
+6 -10
scripts/checkstack.pl
··· 21 21 # 22 22 # TODO : Port to all architectures (one regex per arch) 23 23 24 + use strict; 25 + 24 26 # check for arch 25 27 # 26 28 # $re is used for two matches: ··· 106 104 } 107 105 } 108 106 109 - sub bysize($) { 110 - my ($asize, $bsize); 111 - ($asize = $a) =~ s/.*: *(.*)$/$1/; 112 - ($bsize = $b) =~ s/.*: *(.*)$/$1/; 113 - $bsize <=> $asize 114 - } 115 - 116 107 # 117 108 # main() 118 109 # 119 110 my $funcre = qr/^$x* <(.*)>:$/; 120 - my $func; 121 - my $file, $lastslash; 111 + my ($func, $file, $lastslash); 122 112 123 113 while (my $line = <STDIN>) { 124 114 if ($line =~ m/$funcre/) { ··· 167 173 } 168 174 } 169 175 170 - print sort bysize @stack; 176 + # Sort output by size (last field) 177 + print sort { ($b =~ /:\t*(\d+)$/)[0] <=> ($a =~ /:\t*(\d+)$/)[0] } @stack; 178 +
+11 -12
scripts/checkversion.pl
··· 5 5 # including <linux/version.h> that don't need it. 6 6 # Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net> 7 7 8 + use strict; 9 + 8 10 $| = 1; 9 11 10 - my $debugging = 0; 12 + my $debugging; 11 13 12 - foreach $file (@ARGV) 13 - { 14 + foreach my $file (@ARGV) { 14 15 # Open this file. 15 - open(FILE, $file) || die "Can't open $file: $!\n"; 16 + open( my $f, '<', $file ) 17 + or die "Can't open $file: $!\n"; 16 18 17 19 # Initialize variables. 18 - my $fInComment = 0; 19 - my $fInString = 0; 20 - my $fUseVersion = 0; 20 + my ($fInComment, $fInString, $fUseVersion); 21 21 my $iLinuxVersion = 0; 22 22 23 - LINE: while ( <FILE> ) 24 - { 23 + while (<$f>) { 25 24 # Strip comments. 26 25 $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next); 27 26 m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1))); ··· 42 43 # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE 43 44 if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) { 44 45 $fUseVersion = 1; 45 - last LINE if $iLinuxVersion; 46 - } 46 + last if $iLinuxVersion; 47 + } 47 48 } 48 49 49 50 # Report used version IDs without include? ··· 66 67 } 67 68 } 68 69 69 - close(FILE); 70 + close($f); 70 71 }
+35 -13
scripts/decodecode
··· 7 7 # AFLAGS=--32 decodecode < 386.oops 8 8 9 9 cleanup() { 10 - rm -f $T $T.s $T.o $T.oo $T.aa $T.aaa 10 + rm -f $T $T.s $T.o $T.oo $T.aa $T.dis 11 11 exit 1 12 12 } 13 13 ··· 39 39 echo $code 40 40 code=`echo $code | sed -e 's/.*Code: //'` 41 41 42 + width=`expr index "$code" ' '` 43 + width=$[($width-1)/2] 44 + case $width in 45 + 1) type=byte ;; 46 + 2) type=2byte ;; 47 + 4) type=4byte ;; 48 + esac 49 + 50 + disas() { 51 + ${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s &> /dev/null 52 + 53 + if [ "$ARCH" == "arm" ]; then 54 + if [ $width == 2 ]; then 55 + OBJDUMPFLAGS="-M force-thumb" 56 + fi 57 + 58 + ${CROSS_COMPILE}strip $1.o 59 + fi 60 + 61 + ${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \ 62 + grep -v "/tmp\|Disassembly\|\.text\|^$" &> $1.dis 63 + } 64 + 42 65 marker=`expr index "$code" "\<"` 43 66 if [ $marker -eq 0 ]; then 44 67 marker=`expr index "$code" "\("` ··· 72 49 echo All code >> $T.oo 73 50 echo ======== >> $T.oo 74 51 beforemark=`echo "$code"` 75 - echo -n " .byte 0x" > $T.s 76 - echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s 77 - as $AFLAGS -o $T.o $T.s &> /dev/null 78 - objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo 79 - cat $T.ooo >> $T.oo 80 - rm -f $T.o $T.s $T.ooo 52 + echo -n " .$type 0x" > $T.s 53 + echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s 54 + disas $T 55 + cat $T.dis >> $T.oo 56 + rm -f $T.o $T.s $T.dis 81 57 82 58 # and fix code at-and-after marker 83 59 code=`echo "$code" | cut -c$((${marker} + 1))-` 84 60 fi 85 61 echo Code starting with the faulting instruction > $T.aa 86 62 echo =========================================== >> $T.aa 87 - code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'` 88 - echo -n " .byte 0x" > $T.s 63 + code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'` 64 + echo -n " .$type 0x" > $T.s 89 65 echo $code >> $T.s 90 - as $AFLAGS -o $T.o $T.s &> /dev/null 91 - objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa 92 - cat $T.aaa >> $T.aa 66 + disas $T 67 + cat $T.dis >> $T.aa 93 68 94 - faultline=`cat $T.aaa | head -1 | cut -d":" -f2` 69 + faultline=`cat $T.dis | head -1 | cut -d":" -f2` 70 + faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` 95 71 96 72 cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g" 97 73 echo
+20 -17
scripts/export_report.pl
··· 49 49 } 50 50 51 51 sub collectcfiles { 52 - my @file = `cat .tmp_versions/*.mod | grep '.*\.ko\$'`; 53 - @file = grep {s/\.ko/.mod.c/} @file; 54 - chomp @file; 55 - return @file; 52 + my @file 53 + = `cat .tmp_versions/*.mod | grep '.*\.ko\$' | sed s/\.ko$/.mod.c/`; 54 + chomp @file; 55 + return @file; 56 56 } 57 57 58 58 my (%SYMBOL, %MODULE, %opt, @allcfiles); ··· 71 71 $opt{'k'} = "Module.symvers"; 72 72 } 73 73 74 - unless (open(MODULE_SYMVERS, $opt{'k'})) { 75 - die "Sorry, cannot open $opt{'k'}: $!\n"; 76 - } 74 + open (my $module_symvers, '<', $opt{'k'}) 75 + or die "Sorry, cannot open $opt{'k'}: $!\n"; 77 76 78 77 if (defined $opt{'o'}) { 79 - unless (open(OUTPUT_HANDLE, ">$opt{'o'}")) { 80 - die "Sorry, cannot open $opt{'o'} $!\n"; 81 - } 82 - select OUTPUT_HANDLE; 78 + open (my $out, '>', $opt{'o'}) 79 + or die "Sorry, cannot open $opt{'o'} $!\n"; 80 + 81 + select $out; 83 82 } 83 + 84 84 # 85 85 # collect all the symbols and their attributes from the 86 86 # Module.symvers file 87 87 # 88 - while ( <MODULE_SYMVERS> ) { 88 + while ( <$module_symvers> ) { 89 89 chomp; 90 90 my (undef, $symbol, $module, $gpl) = split; 91 91 $SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl]; 92 92 } 93 - close(MODULE_SYMVERS); 93 + close($module_symvers); 94 94 95 95 # 96 96 # collect the usage count of each symbol. 97 97 # 98 98 foreach my $thismod (@allcfiles) { 99 - unless (open(MODULE_MODULE, $thismod)) { 100 - print "Sorry, cannot open $thismod: $!\n"; 99 + my $module; 100 + 101 + unless (open ($module, '<', $thismod)) { 102 + warn "Sorry, cannot open $thismod: $!\n"; 101 103 next; 102 104 } 105 + 103 106 my $state=0; 104 - while ( <MODULE_MODULE> ) { 107 + while ( <$module> ) { 105 108 chomp; 106 109 if ($state == 0) { 107 110 $state = 1 if ($_ =~ /static const struct modversion_info/); ··· 127 124 if ($state != 2) { 128 125 print "WARNING:$thismod is not built with CONFIG_MODVERSION enabled\n"; 129 126 } 130 - close(MODULE_MODULE); 127 + close($module); 131 128 } 132 129 133 130 print "\tThis file reports the exported symbols usage patterns by in-tree\n",
+2 -1
scripts/gen_initramfs_list.sh
··· 202 202 print_mtime "$1" >> ${output} 203 203 cat "$1" >> ${output} 204 204 else 205 + echo "$1 \\" 205 206 cat "$1" | while read type dir file perm ; do 206 207 if [ "$type" == "file" ]; then 207 208 echo "$file \\"; ··· 232 231 case "$arg" in 233 232 "-l") # files included in initramfs - used by kbuild 234 233 dep_list="list_" 235 - echo "deps_initramfs := \\" 234 + echo "deps_initramfs := $0 \\" 236 235 shift 237 236 ;; 238 237 "-o") # generate compressed cpio image named $1
+3 -1
scripts/genksyms/genksyms.c
··· 758 758 /* setlinebuf(debugfile); */ 759 759 } 760 760 761 - if (flag_reference) 761 + if (flag_reference) { 762 762 read_reference(ref_file); 763 + fclose(ref_file); 764 + } 763 765 764 766 yyparse(); 765 767
+1 -2
scripts/headerdep.pl
··· 80 80 my $path = "$i/$filename"; 81 81 return $path if -f $path; 82 82 } 83 - 84 - return undef; 83 + return; 85 84 } 86 85 87 86 sub parse_all {
+6 -5
scripts/headers_check.pl
··· 28 28 my $filename; 29 29 30 30 foreach my $file (@files) { 31 - local *FH; 32 31 $filename = $file; 33 - open(FH, "<$filename") or die "$filename: $!\n"; 32 + 33 + open(my $fh, '<', $filename) 34 + or die "$filename: $!\n"; 34 35 $lineno = 0; 35 - while ($line = <FH>) { 36 + while ($line = <$fh>) { 36 37 $lineno++; 37 38 &check_include(); 38 39 &check_asm_types(); ··· 41 40 &check_declarations(); 42 41 # Dropped for now. Too much noise &check_config(); 43 42 } 44 - close FH; 43 + close $fh; 45 44 } 46 45 exit $ret; 47 46 ··· 79 78 } 80 79 81 80 my $linux_asm_types; 82 - sub check_asm_types() 81 + sub check_asm_types 83 82 { 84 83 if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) { 85 84 return;
+10 -9
scripts/headers_install.pl
··· 23 23 my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__"; 24 24 25 25 foreach my $file (@files) { 26 - local *INFILE; 27 - local *OUTFILE; 28 26 my $tmpfile = "$installdir/$file.tmp"; 29 - open(INFILE, "<$readdir/$file") 30 - or die "$readdir/$file: $!\n"; 31 - open(OUTFILE, ">$tmpfile") or die "$tmpfile: $!\n"; 32 - while (my $line = <INFILE>) { 27 + 28 + open(my $in, '<', "$readdir/$file") 29 + or die "$readdir/$file: $!\n"; 30 + open(my $out, '>', $tmpfile) 31 + or die "$tmpfile: $!\n"; 32 + while (my $line = <$in>) { 33 33 $line =~ s/([\s(])__user\s/$1/g; 34 34 $line =~ s/([\s(])__force\s/$1/g; 35 35 $line =~ s/([\s(])__iomem\s/$1/g; ··· 39 39 $line =~ s/(^|\s)(inline)\b/$1__$2__/g; 40 40 $line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g; 41 41 $line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g; 42 - printf OUTFILE "%s", $line; 42 + printf {$out} "%s", $line; 43 43 } 44 - close OUTFILE; 45 - close INFILE; 44 + close $out; 45 + close $in; 46 + 46 47 system $unifdef . " $tmpfile > $installdir/$file"; 47 48 unlink $tmpfile; 48 49 }
+4 -2
scripts/kallsyms.c
··· 108 108 rc = fscanf(in, "%llx %c %499s\n", &s->addr, &stype, str); 109 109 if (rc != 3) { 110 110 if (rc != EOF) { 111 - /* skip line */ 112 - fgets(str, 500, in); 111 + /* skip line. sym is used as dummy to 112 + * shut of "warn_unused_result" warning. 113 + */ 114 + sym = fgets(str, 500, in); 113 115 } 114 116 return -1; 115 117 }
+14 -2
scripts/kconfig/Makefile
··· 23 23 config: $(obj)/conf 24 24 $< $(Kconfig) 25 25 26 + nconfig: $(obj)/nconf 27 + $< $(Kconfig) 28 + 26 29 oldconfig: $(obj)/conf 27 30 $< -o $(Kconfig) 28 31 ··· 123 120 # Help text used by make help 124 121 help: 125 122 @echo ' config - Update current config utilising a line-oriented program' 123 + @echo ' nconfig - Update current config utilising a ncurses menu based program' 126 124 @echo ' menuconfig - Update current config utilising a menu based program' 127 125 @echo ' xconfig - Update current config utilising a QT based front-end' 128 126 @echo ' gconfig - Update current config utilising a GTK based front-end' ··· 151 147 # =========================================================================== 152 148 # Shared Makefile for the various kconfig executables: 153 149 # conf: Used for defconfig, oldconfig and related targets 150 + # nconf: Used for the nconfig target. 151 + # Utilizes ncurses 154 152 # mconf: Used for the menuconfig target 155 153 # Utilizes the lxdialog package 156 154 # qconf: Used for the xconfig target ··· 165 159 lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o 166 160 167 161 conf-objs := conf.o zconf.tab.o 168 - mconf-objs := mconf.o zconf.tab.o $(lxdialog) 162 + mconf-objs := mconf.o zconf.tab.o $(lxdialog) 163 + nconf-objs := nconf.o zconf.tab.o nconf.gui.o 169 164 kxgettext-objs := kxgettext.o zconf.tab.o 170 165 171 166 hostprogs-y := conf qconf gconf kxgettext 167 + 168 + ifeq ($(MAKECMDGOALS),nconfig) 169 + hostprogs-y += nconf 170 + endif 172 171 173 172 ifeq ($(MAKECMDGOALS),menuconfig) 174 173 hostprogs-y += mconf ··· 198 187 199 188 clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \ 200 189 .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h 201 - clean-files += mconf qconf gconf 190 + clean-files += mconf qconf gconf nconf 202 191 clean-files += config.pot linux.pot 203 192 204 193 # Check that we have the required ncurses stuff installed for lxdialog (menuconfig) ··· 223 212 HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \ 224 213 -D LKC_DIRECT_LINK 225 214 215 + HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses 226 216 $(obj)/qconf.o: $(obj)/.tmp_qtcheck 227 217 228 218 ifeq ($(qconf-target),1)
+25 -2
scripts/kconfig/expr.c
··· 1097 1097 1098 1098 static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) 1099 1099 { 1100 - str_append((struct gstr*)data, str); 1100 + struct gstr *gs = (struct gstr*)data; 1101 + const char *sym_str = NULL; 1102 + 1101 1103 if (sym) 1102 - str_printf((struct gstr*)data, " [=%s]", sym_get_string_value(sym)); 1104 + sym_str = sym_get_string_value(sym); 1105 + 1106 + if (gs->max_width) { 1107 + unsigned extra_length = strlen(str); 1108 + const char *last_cr = strrchr(gs->s, '\n'); 1109 + unsigned last_line_length; 1110 + 1111 + if (sym_str) 1112 + extra_length += 4 + strlen(sym_str); 1113 + 1114 + if (!last_cr) 1115 + last_cr = gs->s; 1116 + 1117 + last_line_length = strlen(gs->s) - (last_cr - gs->s); 1118 + 1119 + if ((last_line_length + extra_length) > gs->max_width) 1120 + str_append(gs, "\\\n"); 1121 + } 1122 + 1123 + str_append(gs, str); 1124 + if (sym) 1125 + str_printf(gs, " [=%s]", sym_str); 1103 1126 } 1104 1127 1105 1128 void expr_gstr_print(struct expr *e, struct gstr *gs)
+2 -3
scripts/kconfig/expr.h
··· 86 86 struct expr_value rev_dep; 87 87 }; 88 88 89 - #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) 89 + #define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) 90 90 91 91 #define SYMBOL_CONST 0x0001 /* symbol is const */ 92 92 #define SYMBOL_CHECK 0x0008 /* used during dependency checking */ ··· 108 108 #define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */ 109 109 110 110 #define SYMBOL_MAXLENGTH 256 111 - #define SYMBOL_HASHSIZE 257 112 - #define SYMBOL_HASHMASK 0xff 111 + #define SYMBOL_HASHSIZE 9973 113 112 114 113 /* A property represent the config options that can be associated 115 114 * with a config "symbol".
+38 -77
scripts/kconfig/gconf.c
··· 30 30 SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW 31 31 }; 32 32 33 + enum { 34 + OPT_NORMAL, OPT_ALL, OPT_PROMPT 35 + }; 36 + 33 37 static gint view_mode = FULL_VIEW; 34 38 static gboolean show_name = TRUE; 35 39 static gboolean show_range = TRUE; 36 40 static gboolean show_value = TRUE; 37 - static gboolean show_all = FALSE; 38 - static gboolean show_debug = FALSE; 39 41 static gboolean resizeable = FALSE; 42 + static int opt_mode = OPT_NORMAL; 40 43 41 44 GtkWidget *main_wnd = NULL; 42 45 GtkWidget *tree1_w = NULL; // left frame ··· 79 76 80 77 /* Helping/Debugging Functions */ 81 78 82 - 83 - const char *dbg_print_stype(int val) 84 - { 85 - static char buf[256]; 86 - 87 - bzero(buf, 256); 88 - 89 - if (val == S_UNKNOWN) 90 - strcpy(buf, "unknown"); 91 - if (val == S_BOOLEAN) 92 - strcpy(buf, "boolean"); 93 - if (val == S_TRISTATE) 94 - strcpy(buf, "tristate"); 95 - if (val == S_INT) 96 - strcpy(buf, "int"); 97 - if (val == S_HEX) 98 - strcpy(buf, "hex"); 99 - if (val == S_STRING) 100 - strcpy(buf, "string"); 101 - if (val == S_OTHER) 102 - strcpy(buf, "other"); 103 - 104 - #ifdef DEBUG 105 - printf("%s", buf); 106 - #endif 107 - 108 - return buf; 109 - } 110 - 111 - const char *dbg_print_flags(int val) 79 + const char *dbg_sym_flags(int val) 112 80 { 113 81 static char buf[256]; 114 82 ··· 105 131 strcat(buf, "auto/"); 106 132 107 133 buf[strlen(buf) - 1] = '\0'; 108 - #ifdef DEBUG 109 - printf("%s", buf); 110 - #endif 111 134 112 135 return buf; 113 136 } 114 - 115 - const char *dbg_print_ptype(int val) 116 - { 117 - static char buf[256]; 118 - 119 - bzero(buf, 256); 120 - 121 - if (val == P_UNKNOWN) 122 - strcpy(buf, "unknown"); 123 - if (val == P_PROMPT) 124 - strcpy(buf, "prompt"); 125 - if (val == P_COMMENT) 126 - strcpy(buf, "comment"); 127 - if (val == P_MENU) 128 - strcpy(buf, "menu"); 129 - if (val == P_DEFAULT) 130 - strcpy(buf, "default"); 131 - if (val == P_CHOICE) 132 - strcpy(buf, "choice"); 133 - 134 - #ifdef DEBUG 135 - printf("%s", buf); 136 - #endif 137 - 138 - return buf; 139 - } 140 - 141 137 142 138 void replace_button_icon(GladeXML * xml, GdkDrawable * window, 143 139 GtkStyle * style, gchar * btn_name, gchar ** xpm) ··· 641 697 642 698 643 699 void 644 - on_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data) 700 + on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data) 645 701 { 646 - show_all = GTK_CHECK_MENU_ITEM(menuitem)->active; 647 - 702 + opt_mode = OPT_NORMAL; 648 703 gtk_tree_store_clear(tree2); 649 - display_tree(&rootmenu); // instead of update_tree to speed-up 704 + display_tree(&rootmenu); /* instead of update_tree to speed-up */ 650 705 } 651 706 652 707 653 708 void 654 - on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data) 709 + on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data) 655 710 { 656 - show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active; 657 - update_tree(&rootmenu, NULL); 711 + opt_mode = OPT_ALL; 712 + gtk_tree_store_clear(tree2); 713 + display_tree(&rootmenu); /* instead of update_tree to speed-up */ 714 + } 715 + 716 + 717 + void 718 + on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data) 719 + { 720 + opt_mode = OPT_PROMPT; 721 + gtk_tree_store_clear(tree2); 722 + display_tree(&rootmenu); /* instead of update_tree to speed-up */ 658 723 } 659 724 660 725 ··· 1116 1163 g_strdup_printf("%s %s", _(menu_get_prompt(menu)), 1117 1164 sym && sym_has_value(sym) ? "(NEW)" : ""); 1118 1165 1119 - if (show_all && !menu_is_visible(menu)) 1166 + if (opt_mode == OPT_ALL && !menu_is_visible(menu)) 1167 + row[COL_COLOR] = g_strdup("DarkGray"); 1168 + else if (opt_mode == OPT_PROMPT && 1169 + menu_has_prompt(menu) && !menu_is_visible(menu)) 1120 1170 row[COL_COLOR] = g_strdup("DarkGray"); 1121 1171 else 1122 1172 row[COL_COLOR] = g_strdup("Black"); ··· 1342 1386 menu2 ? menu_get_prompt(menu2) : "nil"); 1343 1387 #endif 1344 1388 1345 - if (!menu_is_visible(child1) && !show_all) { // remove node 1389 + if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) || 1390 + (opt_mode == OPT_PROMPT && !menu_has_prompt(child1))) { 1391 + 1392 + /* remove node */ 1346 1393 if (gtktree_iter_find_node(dst, menu1) != NULL) { 1347 1394 memcpy(&tmp, child2, sizeof(GtkTreeIter)); 1348 1395 valid = gtk_tree_model_iter_next(model2, 1349 1396 child2); 1350 1397 gtk_tree_store_remove(tree2, &tmp); 1351 1398 if (!valid) 1352 - return; // next parent 1399 + return; /* next parent */ 1353 1400 else 1354 - goto reparse; // next child 1401 + goto reparse; /* next child */ 1355 1402 } else 1356 1403 continue; 1357 1404 } ··· 1423 1464 && (tree == tree2)) 1424 1465 continue; 1425 1466 1426 - if (menu_is_visible(child) || show_all) 1467 + if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) || 1468 + (opt_mode == OPT_PROMPT && menu_has_prompt(child)) || 1469 + (opt_mode == OPT_ALL)) 1427 1470 place_node(child, fill_row(child)); 1428 1471 #ifdef DEBUG 1429 1472 printf("%*c%s: ", indent, ' ', menu_get_prompt(child)); 1430 1473 printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : ""); 1431 - dbg_print_ptype(ptype); 1474 + printf("%s", prop_get_type_name(ptype)); 1432 1475 printf(" | "); 1433 1476 if (sym) { 1434 - dbg_print_stype(sym->type); 1477 + printf("%s", sym_type_name(sym->type)); 1435 1478 printf(" | "); 1436 - dbg_print_flags(sym->flags); 1479 + printf("%s", dbg_sym_flags(sym->flags)); 1437 1480 printf("\n"); 1438 1481 } else 1439 1482 printf("\n");
+20 -6
scripts/kconfig/gconf.glade
··· 190 190 </child> 191 191 192 192 <child> 193 - <widget class="GtkCheckMenuItem" id="show_all_options1"> 193 + <widget class="GtkRadioMenuItem" id="set_option_mode1"> 194 + <property name="visible">True</property> 195 + <property name="tooltip" translatable="yes">Show normal options</property> 196 + <property name="label" translatable="yes">Show normal options</property> 197 + <property name="use_underline">True</property> 198 + <property name="active">True</property> 199 + <signal name="activate" handler="on_set_option_mode1_activate"/> 200 + </widget> 201 + </child> 202 + 203 + <child> 204 + <widget class="GtkRadioMenuItem" id="set_option_mode2"> 194 205 <property name="visible">True</property> 195 206 <property name="tooltip" translatable="yes">Show all options</property> 196 207 <property name="label" translatable="yes">Show all _options</property> 197 208 <property name="use_underline">True</property> 198 209 <property name="active">False</property> 199 - <signal name="activate" handler="on_show_all_options1_activate"/> 210 + <property name="group">set_option_mode1</property> 211 + <signal name="activate" handler="on_set_option_mode2_activate"/> 200 212 </widget> 201 213 </child> 202 214 203 215 <child> 204 - <widget class="GtkCheckMenuItem" id="show_debug_info1"> 216 + <widget class="GtkRadioMenuItem" id="set_option_mode3"> 205 217 <property name="visible">True</property> 206 - <property name="tooltip" translatable="yes">Show masked options</property> 207 - <property name="label" translatable="yes">Show _debug info</property> 218 + <property name="tooltip" translatable="yes">Show all options with prompts</property> 219 + <property name="label" translatable="yes">Show all prompt options</property> 208 220 <property name="use_underline">True</property> 209 221 <property name="active">False</property> 210 - <signal name="activate" handler="on_show_debug_info1_activate"/> 222 + <property name="group">set_option_mode1</property> 223 + <signal name="activate" handler="on_set_option_mode3_activate"/> 211 224 </widget> 212 225 </child> 226 + 213 227 </widget> 214 228 </child> 215 229 </widget>
+6 -1
scripts/kconfig/lkc.h
··· 84 84 void kconfig_load(void); 85 85 86 86 /* menu.c */ 87 - void menu_init(void); 87 + void _menu_init(void); 88 88 void menu_warn(struct menu *menu, const char *fmt, ...); 89 89 struct menu *menu_add_menu(void); 90 90 void menu_end_menu(void); ··· 106 106 struct gstr { 107 107 size_t len; 108 108 char *s; 109 + /* 110 + * when max_width is not zero long lines in string s (if any) get 111 + * wrapped not to exceed the max_width value 112 + */ 113 + int max_width; 109 114 }; 110 115 struct gstr str_new(void); 111 116 struct gstr str_assign(const char *s);
+4 -2
scripts/kconfig/lkc_proto.h
··· 11 11 /* menu.c */ 12 12 P(rootmenu,struct menu,); 13 13 14 - P(menu_is_visible,bool,(struct menu *menu)); 14 + P(menu_is_visible, bool, (struct menu *menu)); 15 + P(menu_has_prompt, bool, (struct menu *menu)); 15 16 P(menu_get_prompt,const char *,(struct menu *menu)); 16 17 P(menu_get_root_menu,struct menu *,(struct menu *menu)); 17 18 P(menu_get_parent_menu,struct menu *,(struct menu *menu)); 18 19 P(menu_has_help,bool,(struct menu *menu)); 19 20 P(menu_get_help,const char *,(struct menu *menu)); 20 - P(get_symbol_str,void,(struct gstr *r, struct symbol *sym)); 21 + P(get_symbol_str, void, (struct gstr *r, struct symbol *sym)); 22 + P(get_relations_str, struct gstr, (struct symbol **sym_arr)); 21 23 P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); 22 24 23 25 /* symbol.c */
+2 -2
scripts/kconfig/lxdialog/inputbox.c
··· 180 180 case KEY_LEFT: 181 181 switch (button) { 182 182 case -1: 183 - button = 1; /* Indicates "Cancel" button is selected */ 183 + button = 1; /* Indicates "Help" button is selected */ 184 184 print_buttons(dialog, height, width, 1); 185 185 break; 186 186 case 0: ··· 204 204 print_buttons(dialog, height, width, 0); 205 205 break; 206 206 case 0: 207 - button = 1; /* Indicates "Cancel" button is selected */ 207 + button = 1; /* Indicates "Help" button is selected */ 208 208 print_buttons(dialog, height, width, 1); 209 209 break; 210 210 case 1:
+11 -11
scripts/kconfig/lxdialog/menubox.c
··· 383 383 case 'n': 384 384 case 'm': 385 385 case '/': 386 + case 'h': 387 + case '?': 388 + case 'z': 389 + case '\n': 386 390 /* save scroll info */ 387 391 *s_scroll = scroll; 388 392 delwin(menu); ··· 394 390 item_set(scroll + choice); 395 391 item_set_selected(1); 396 392 switch (key) { 393 + case 'h': 394 + case '?': 395 + return 2; 397 396 case 's': 398 - return 3; 399 397 case 'y': 400 398 return 3; 401 399 case 'n': ··· 408 402 return 6; 409 403 case '/': 410 404 return 7; 405 + case 'z': 406 + return 8; 407 + case '\n': 408 + return button; 411 409 } 412 410 return 0; 413 - case 'h': 414 - case '?': 415 - button = 2; 416 - case '\n': 417 - *s_scroll = scroll; 418 - delwin(menu); 419 - delwin(dialog); 420 - item_set(scroll + choice); 421 - item_set_selected(1); 422 - return button; 423 411 case 'e': 424 412 case 'x': 425 413 key = KEY_ESC;
+18 -16
scripts/kconfig/mconf.c
··· 67 67 " there is a delayed response which you may find annoying.\n" 68 68 "\n" 69 69 " Also, the <TAB> and cursor keys will cycle between <Select>,\n" 70 - " <Exit> and <Help>\n" 70 + " <Exit> and <Help>.\n" 71 71 "\n" 72 72 "o To get help with an item, use the cursor keys to highlight <Help>\n" 73 - " and Press <ENTER>.\n" 73 + " and press <ENTER>.\n" 74 74 "\n" 75 75 " Shortcut: Press <H> or <?>.\n" 76 + "\n" 77 + "o To show hidden options, press <Z>.\n" 76 78 "\n" 77 79 "\n" 78 80 "Radiolists (Choice lists)\n" ··· 274 272 static struct menu *current_menu; 275 273 static int child_count; 276 274 static int single_menu_mode; 275 + static int show_all_options; 277 276 278 277 static void conf(struct menu *menu); 279 278 static void conf_choice(struct menu *menu); ··· 284 281 static void show_textbox(const char *title, const char *text, int r, int c); 285 282 static void show_helptext(const char *title, const char *text); 286 283 static void show_help(struct menu *menu); 287 - 288 - static struct gstr get_relations_str(struct symbol **sym_arr) 289 - { 290 - struct symbol *sym; 291 - struct gstr res = str_new(); 292 - int i; 293 - 294 - for (i = 0; sym_arr && (sym = sym_arr[i]); i++) 295 - get_symbol_str(&res, sym); 296 - if (!i) 297 - str_append(&res, _("No matches found.\n")); 298 - return res; 299 - } 300 284 301 285 static char filename[PATH_MAX+1]; 302 286 static void set_config_filename(const char *config_filename) ··· 349 359 int type, tmp, doint = 2; 350 360 tristate val; 351 361 char ch; 362 + bool visible; 352 363 353 - if (!menu_is_visible(menu)) 364 + /* 365 + * note: menu_is_visible() has side effect that it will 366 + * recalc the value of the symbol. 367 + */ 368 + visible = menu_is_visible(menu); 369 + if (show_all_options && !menu_has_prompt(menu)) 370 + return; 371 + else if (!show_all_options && !visible) 354 372 return; 355 373 356 374 sym = menu->sym; ··· 617 619 case 7: 618 620 search_conf(); 619 621 break; 622 + case 8: 623 + show_all_options = !show_all_options; 624 + break; 620 625 } 621 626 } 622 627 } ··· 639 638 { 640 639 struct gstr help = str_new(); 641 640 641 + help.max_width = getmaxx(stdscr) - 10; 642 642 menu_get_ext_help(menu, &help); 643 643 644 644 show_helptext(_(menu_get_prompt(menu)), str_get(&help));
+26 -2
scripts/kconfig/menu.c
··· 38 38 va_end(ap); 39 39 } 40 40 41 - void menu_init(void) 41 + void _menu_init(void) 42 42 { 43 43 current_entry = current_menu = &rootmenu; 44 44 last_entry_ptr = &rootmenu.list; ··· 197 197 if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && 198 198 prop->expr->type != E_SYMBOL) 199 199 prop_warn(prop, 200 - "default for config symbol '%'" 200 + "default for config symbol '%s'" 201 201 " must be a single symbol", sym->name); 202 202 break; 203 203 case P_SELECT: ··· 390 390 } 391 391 } 392 392 393 + bool menu_has_prompt(struct menu *menu) 394 + { 395 + if (!menu->prompt) 396 + return false; 397 + return true; 398 + } 399 + 393 400 bool menu_is_visible(struct menu *menu) 394 401 { 395 402 struct menu *child; ··· 405 398 406 399 if (!menu->prompt) 407 400 return false; 401 + 408 402 sym = menu->sym; 409 403 if (sym) { 410 404 sym_calc_value(sym); ··· 415 407 416 408 if (visible != no) 417 409 return true; 410 + 418 411 if (!sym || sym_get_tristate_value(menu->sym) == no) 419 412 return false; 420 413 421 414 for (child = menu->list; child; child = child->next) 422 415 if (menu_is_visible(child)) 423 416 return true; 417 + 424 418 return false; 425 419 } 426 420 ··· 524 514 } 525 515 str_append(r, "\n\n"); 526 516 } 517 + 518 + struct gstr get_relations_str(struct symbol **sym_arr) 519 + { 520 + struct symbol *sym; 521 + struct gstr res = str_new(); 522 + int i; 523 + 524 + for (i = 0; sym_arr && (sym = sym_arr[i]); i++) 525 + get_symbol_str(&res, sym); 526 + if (!i) 527 + str_append(&res, _("No matches found.\n")); 528 + return res; 529 + } 530 + 527 531 528 532 void menu_get_ext_help(struct menu *menu, struct gstr *help) 529 533 {
+1568
scripts/kconfig/nconf.c
··· 1 + /* 2 + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com? 3 + * Released under the terms of the GNU GPL v2.0. 4 + * 5 + * Derived from menuconfig. 6 + * 7 + */ 8 + #define LKC_DIRECT_LINK 9 + #include "lkc.h" 10 + #include "nconf.h" 11 + 12 + static const char nconf_readme[] = N_( 13 + "Overview\n" 14 + "--------\n" 15 + "Some kernel features may be built directly into the kernel.\n" 16 + "Some may be made into loadable runtime modules. Some features\n" 17 + "may be completely removed altogether. There are also certain\n" 18 + "kernel parameters which are not really features, but must be\n" 19 + "entered in as decimal or hexadecimal numbers or possibly text.\n" 20 + "\n" 21 + "Menu items beginning with following braces represent features that\n" 22 + " [ ] can be built in or removed\n" 23 + " < > can be built in, modularized or removed\n" 24 + " { } can be built in or modularized (selected by other feature)\n" 25 + " - - are selected by other feature,\n" 26 + " XXX cannot be selected. use Symbol Info to find out why,\n" 27 + "while *, M or whitespace inside braces means to build in, build as\n" 28 + "a module or to exclude the feature respectively.\n" 29 + "\n" 30 + "To change any of these features, highlight it with the cursor\n" 31 + "keys and press <Y> to build it in, <M> to make it a module or\n" 32 + "<N> to removed it. You may also press the <Space Bar> to cycle\n" 33 + "through the available options (ie. Y->N->M->Y).\n" 34 + "\n" 35 + "Some additional keyboard hints:\n" 36 + "\n" 37 + "Menus\n" 38 + "----------\n" 39 + "o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" 40 + " you wish to change use <Enter> or <Space>. Goto submenu by \n" 41 + " pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n" 42 + " Submenus are designated by \"--->\".\n" 43 + "\n" 44 + " Shortcut: Press the option's highlighted letter (hotkey).\n" 45 + " Pressing a hotkey more than once will sequence\n" 46 + " through all visible items which use that hotkey.\n" 47 + "\n" 48 + " You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" 49 + " unseen options into view.\n" 50 + "\n" 51 + "o To exit a menu use the just press <ESC> <F5> <F8> or <left-arrow>.\n" 52 + "\n" 53 + "o To get help with an item, press <F1>\n" 54 + " Shortcut: Press <h> or <?>.\n" 55 + "\n" 56 + "\n" 57 + "Radiolists (Choice lists)\n" 58 + "-----------\n" 59 + "o Use the cursor keys to select the option you wish to set and press\n" 60 + " <S> or the <SPACE BAR>.\n" 61 + "\n" 62 + " Shortcut: Press the first letter of the option you wish to set then\n" 63 + " press <S> or <SPACE BAR>.\n" 64 + "\n" 65 + "o To see available help for the item, press <F1>\n" 66 + " Shortcut: Press <H> or <?>.\n" 67 + "\n" 68 + "\n" 69 + "Data Entry\n" 70 + "-----------\n" 71 + "o Enter the requested information and press <ENTER>\n" 72 + " If you are entering hexadecimal values, it is not necessary to\n" 73 + " add the '0x' prefix to the entry.\n" 74 + "\n" 75 + "o For help, press <F1>.\n" 76 + "\n" 77 + "\n" 78 + "Text Box (Help Window)\n" 79 + "--------\n" 80 + "o Use the cursor keys to scroll up/down/left/right. The VI editor\n" 81 + " keys h,j,k,l function here as do <SPACE BAR> for those\n" 82 + " who are familiar with less and lynx.\n" 83 + "\n" 84 + "o Press <Enter>, <F1>, <F5>, <F7> or <Esc> to exit.\n" 85 + "\n" 86 + "\n" 87 + "Alternate Configuration Files\n" 88 + "-----------------------------\n" 89 + "nconfig supports the use of alternate configuration files for\n" 90 + "those who, for various reasons, find it necessary to switch\n" 91 + "between different kernel configurations.\n" 92 + "\n" 93 + "At the end of the main menu you will find two options. One is\n" 94 + "for saving the current configuration to a file of your choosing.\n" 95 + "The other option is for loading a previously saved alternate\n" 96 + "configuration.\n" 97 + "\n" 98 + "Even if you don't use alternate configuration files, but you\n" 99 + "find during a nconfig session that you have completely messed\n" 100 + "up your settings, you may use the \"Load Alternate...\" option to\n" 101 + "restore your previously saved settings from \".config\" without\n" 102 + "restarting nconfig.\n" 103 + "\n" 104 + "Other information\n" 105 + "-----------------\n" 106 + "If you use nconfig in an XTERM window make sure you have your\n" 107 + "$TERM variable set to point to a xterm definition which supports color.\n" 108 + "Otherwise, nconfig will look rather bad. nconfig will not\n" 109 + "display correctly in a RXVT window because rxvt displays only one\n" 110 + "intensity of color, bright.\n" 111 + "\n" 112 + "nconfig will display larger menus on screens or xterms which are\n" 113 + "set to display more than the standard 25 row by 80 column geometry.\n" 114 + "In order for this to work, the \"stty size\" command must be able to\n" 115 + "display the screen's current row and column geometry. I STRONGLY\n" 116 + "RECOMMEND that you make sure you do NOT have the shell variables\n" 117 + "LINES and COLUMNS exported into your environment. Some distributions\n" 118 + "export those variables via /etc/profile. Some ncurses programs can\n" 119 + "become confused when those variables (LINES & COLUMNS) don't reflect\n" 120 + "the true screen size.\n" 121 + "\n" 122 + "Optional personality available\n" 123 + "------------------------------\n" 124 + "If you prefer to have all of the kernel options listed in a single\n" 125 + "menu, rather than the default multimenu hierarchy, run the nconfig\n" 126 + "with NCONFIG_MODE environment variable set to single_menu. Example:\n" 127 + "\n" 128 + "make NCONFIG_MODE=single_menu nconfig\n" 129 + "\n" 130 + "<Enter> will then unroll the appropriate category, or enfold it if it\n" 131 + "is already unrolled.\n" 132 + "\n" 133 + "Note that this mode can eventually be a little more CPU expensive\n" 134 + "(especially with a larger number of unrolled categories) than the\n" 135 + "default mode.\n" 136 + "\n"), 137 + menu_no_f_instructions[] = N_( 138 + " You do not have function keys support. Please follow the\n" 139 + " following instructions:\n" 140 + " Arrow keys navigate the menu.\n" 141 + " <Enter> or <right-arrow> selects submenus --->.\n" 142 + " Capital Letters are hotkeys.\n" 143 + " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n" 144 + " Pressing SpaceBar toggles between the above options\n" 145 + " Press <Esc> or <left-arrow> to go back one menu, \n" 146 + " <?> or <h> for Help, </> for Search.\n" 147 + " <1> is interchangable with <F1>, <2> with <F2>, etc.\n" 148 + " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 149 + " <Esc> always leaves the current window\n"), 150 + menu_instructions[] = N_( 151 + " Arrow keys navigate the menu.\n" 152 + " <Enter> or <right-arrow> selects submenus --->.\n" 153 + " Capital Letters are hotkeys.\n" 154 + " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n" 155 + " Pressing SpaceBar toggles between the above options\n" 156 + " Press <Esc>, <F3> or <left-arrow> to go back one menu, \n" 157 + " <?>, <F1> or <h> for Help, </> for Search.\n" 158 + " <1> is interchangable with <F1>, <2> with <F2>, etc.\n" 159 + " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n" 160 + " <Esc> always leaves the current window\n"), 161 + radiolist_instructions[] = N_( 162 + " Use the arrow keys to navigate this window or\n" 163 + " press the hotkey of the item you wish to select\n" 164 + " followed by the <SPACE BAR>.\n" 165 + " Press <?>, <F1> or <h> for additional information about this option.\n"), 166 + inputbox_instructions_int[] = N_( 167 + "Please enter a decimal value.\n" 168 + "Fractions will not be accepted.\n" 169 + "Press <RETURN> to accept, <ESC> to cancel."), 170 + inputbox_instructions_hex[] = N_( 171 + "Please enter a hexadecimal value.\n" 172 + "Press <RETURN> to accept, <ESC> to cancel."), 173 + inputbox_instructions_string[] = N_( 174 + "Please enter a string value.\n" 175 + "Press <RETURN> to accept, <ESC> to cancel."), 176 + setmod_text[] = N_( 177 + "This feature depends on another which\n" 178 + "has been configured as a module.\n" 179 + "As a result, this feature will be built as a module."), 180 + nohelp_text[] = N_( 181 + "There is no help available for this kernel option.\n"), 182 + load_config_text[] = N_( 183 + "Enter the name of the configuration file you wish to load.\n" 184 + "Accept the name shown to restore the configuration you\n" 185 + "last retrieved. Leave blank to abort."), 186 + load_config_help[] = N_( 187 + "\n" 188 + "For various reasons, one may wish to keep several different kernel\n" 189 + "configurations available on a single machine.\n" 190 + "\n" 191 + "If you have saved a previous configuration in a file other than the\n" 192 + "kernel's default, entering the name of the file here will allow you\n" 193 + "to modify that configuration.\n" 194 + "\n" 195 + "If you are uncertain, then you have probably never used alternate\n" 196 + "configuration files. You should therefor leave this blank to abort.\n"), 197 + save_config_text[] = N_( 198 + "Enter a filename to which this configuration should be saved\n" 199 + "as an alternate. Leave blank to abort."), 200 + save_config_help[] = N_( 201 + "\n" 202 + "For various reasons, one may wish to keep different kernel\n" 203 + "configurations available on a single machine.\n" 204 + "\n" 205 + "Entering a file name here will allow you to later retrieve, modify\n" 206 + "and use the current configuration as an alternate to whatever\n" 207 + "configuration options you have selected at that time.\n" 208 + "\n" 209 + "If you are uncertain what all this means then you should probably\n" 210 + "leave this blank.\n"), 211 + search_help[] = N_( 212 + "\n" 213 + "Search for CONFIG_ symbols and display their relations.\n" 214 + "Regular expressions are allowed.\n" 215 + "Example: search for \"^FOO\"\n" 216 + "Result:\n" 217 + "-----------------------------------------------------------------\n" 218 + "Symbol: FOO [ = m]\n" 219 + "Prompt: Foo bus is used to drive the bar HW\n" 220 + "Defined at drivers/pci/Kconfig:47\n" 221 + "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" 222 + "Location:\n" 223 + " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" 224 + " -> PCI support (PCI [ = y])\n" 225 + " -> PCI access mode (<choice> [ = y])\n" 226 + "Selects: LIBCRC32\n" 227 + "Selected by: BAR\n" 228 + "-----------------------------------------------------------------\n" 229 + "o The line 'Prompt:' shows the text used in the menu structure for\n" 230 + " this CONFIG_ symbol\n" 231 + "o The 'Defined at' line tell at what file / line number the symbol\n" 232 + " is defined\n" 233 + "o The 'Depends on:' line tell what symbols needs to be defined for\n" 234 + " this symbol to be visible in the menu (selectable)\n" 235 + "o The 'Location:' lines tell where in the menu structure this symbol\n" 236 + " is located\n" 237 + " A location followed by a [ = y] indicate that this is a selectable\n" 238 + " menu item - and current value is displayed inside brackets.\n" 239 + "o The 'Selects:' line tell what symbol will be automatically\n" 240 + " selected if this symbol is selected (y or m)\n" 241 + "o The 'Selected by' line tell what symbol has selected this symbol\n" 242 + "\n" 243 + "Only relevant lines are shown.\n" 244 + "\n\n" 245 + "Search examples:\n" 246 + "Examples: USB = > find all CONFIG_ symbols containing USB\n" 247 + " ^USB => find all CONFIG_ symbols starting with USB\n" 248 + " USB$ => find all CONFIG_ symbols ending with USB\n" 249 + "\n"); 250 + 251 + struct mitem { 252 + char str[256]; 253 + char tag; 254 + void *usrptr; 255 + int is_hot; 256 + int is_visible; 257 + }; 258 + 259 + #define MAX_MENU_ITEMS 4096 260 + static int show_all_items; 261 + static int indent; 262 + static struct menu *current_menu; 263 + static int child_count; 264 + static int single_menu_mode; 265 + /* the window in which all information appears */ 266 + static WINDOW *main_window; 267 + /* the largest size of the menu window */ 268 + static int mwin_max_lines; 269 + static int mwin_max_cols; 270 + /* the window in which we show option buttons */ 271 + static MENU *curses_menu; 272 + static ITEM *curses_menu_items[MAX_MENU_ITEMS]; 273 + static struct mitem k_menu_items[MAX_MENU_ITEMS]; 274 + static int items_num; 275 + static int global_exit; 276 + /* the currently selected button */ 277 + const char *current_instructions = menu_instructions; 278 + /* this array is used to implement hot keys. it is updated in item_make and 279 + * resetted in clean_items. It would be better to use a hash, but lets keep it 280 + * simple... */ 281 + #define MAX_SAME_KEY MAX_MENU_ITEMS 282 + struct { 283 + int count; 284 + int ptrs[MAX_MENU_ITEMS]; 285 + } hotkeys[1<<(sizeof(char)*8)]; 286 + 287 + static void conf(struct menu *menu); 288 + static void conf_choice(struct menu *menu); 289 + static void conf_string(struct menu *menu); 290 + static void conf_load(void); 291 + static void conf_save(void); 292 + static void show_help(struct menu *menu); 293 + static int do_exit(void); 294 + static void setup_windows(void); 295 + 296 + typedef void (*function_key_handler_t)(int *key, struct menu *menu); 297 + static void handle_f1(int *key, struct menu *current_item); 298 + static void handle_f2(int *key, struct menu *current_item); 299 + static void handle_f3(int *key, struct menu *current_item); 300 + static void handle_f4(int *key, struct menu *current_item); 301 + static void handle_f5(int *key, struct menu *current_item); 302 + static void handle_f6(int *key, struct menu *current_item); 303 + static void handle_f7(int *key, struct menu *current_item); 304 + static void handle_f8(int *key, struct menu *current_item); 305 + 306 + struct function_keys { 307 + const char *key_str; 308 + const char *func; 309 + function_key key; 310 + function_key_handler_t handler; 311 + }; 312 + 313 + static const int function_keys_num = 8; 314 + struct function_keys function_keys[] = { 315 + { 316 + .key_str = "F1", 317 + .func = "Help", 318 + .key = F_HELP, 319 + .handler = handle_f1, 320 + }, 321 + { 322 + .key_str = "F2", 323 + .func = "Symbol Info", 324 + .key = F_SYMBOL, 325 + .handler = handle_f2, 326 + }, 327 + { 328 + .key_str = "F3", 329 + .func = "Instructions", 330 + .key = F_INSTS, 331 + .handler = handle_f3, 332 + }, 333 + { 334 + .key_str = "F4", 335 + .func = "Config", 336 + .key = F_CONF, 337 + .handler = handle_f4, 338 + }, 339 + { 340 + .key_str = "F5", 341 + .func = "Back", 342 + .key = F_BACK, 343 + .handler = handle_f5, 344 + }, 345 + { 346 + .key_str = "F6", 347 + .func = "Save", 348 + .key = F_SAVE, 349 + .handler = handle_f6, 350 + }, 351 + { 352 + .key_str = "F7", 353 + .func = "Load", 354 + .key = F_LOAD, 355 + .handler = handle_f7, 356 + }, 357 + { 358 + .key_str = "F8", 359 + .func = "Exit", 360 + .key = F_EXIT, 361 + .handler = handle_f8, 362 + }, 363 + }; 364 + 365 + static void print_function_line(void) 366 + { 367 + int i; 368 + int offset = 1; 369 + const int skip = 1; 370 + 371 + for (i = 0; i < function_keys_num; i++) { 372 + wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); 373 + mvwprintw(main_window, LINES-3, offset, 374 + "%s", 375 + function_keys[i].key_str); 376 + wattrset(main_window, attributes[FUNCTION_TEXT]); 377 + offset += strlen(function_keys[i].key_str); 378 + mvwprintw(main_window, LINES-3, 379 + offset, "%s", 380 + function_keys[i].func); 381 + offset += strlen(function_keys[i].func) + skip; 382 + } 383 + wattrset(main_window, attributes[NORMAL]); 384 + } 385 + 386 + /* help */ 387 + static void handle_f1(int *key, struct menu *current_item) 388 + { 389 + show_scroll_win(main_window, 390 + _("README"), _(nconf_readme)); 391 + return; 392 + } 393 + 394 + /* symbole help */ 395 + static void handle_f2(int *key, struct menu *current_item) 396 + { 397 + show_help(current_item); 398 + return; 399 + } 400 + 401 + /* instructions */ 402 + static void handle_f3(int *key, struct menu *current_item) 403 + { 404 + show_scroll_win(main_window, 405 + _("Instructions"), 406 + _(current_instructions)); 407 + return; 408 + } 409 + 410 + /* config */ 411 + static void handle_f4(int *key, struct menu *current_item) 412 + { 413 + int res = btn_dialog(main_window, 414 + _("Show all symbols?"), 415 + 2, 416 + " <Show All> ", 417 + "<Don't show all>"); 418 + if (res == 0) 419 + show_all_items = 1; 420 + else if (res == 1) 421 + show_all_items = 0; 422 + 423 + return; 424 + } 425 + 426 + /* back */ 427 + static void handle_f5(int *key, struct menu *current_item) 428 + { 429 + *key = KEY_LEFT; 430 + return; 431 + } 432 + 433 + /* save */ 434 + static void handle_f6(int *key, struct menu *current_item) 435 + { 436 + conf_save(); 437 + return; 438 + } 439 + 440 + /* load */ 441 + static void handle_f7(int *key, struct menu *current_item) 442 + { 443 + conf_load(); 444 + return; 445 + } 446 + 447 + /* exit */ 448 + static void handle_f8(int *key, struct menu *current_item) 449 + { 450 + do_exit(); 451 + return; 452 + } 453 + 454 + /* return != 0 to indicate the key was handles */ 455 + static int process_special_keys(int *key, struct menu *menu) 456 + { 457 + int i; 458 + 459 + if (*key == KEY_RESIZE) { 460 + setup_windows(); 461 + return 1; 462 + } 463 + 464 + for (i = 0; i < function_keys_num; i++) { 465 + if (*key == KEY_F(function_keys[i].key) || 466 + *key == '0' + function_keys[i].key){ 467 + function_keys[i].handler(key, menu); 468 + return 1; 469 + } 470 + } 471 + 472 + return 0; 473 + } 474 + 475 + static void clean_items(void) 476 + { 477 + int i; 478 + for (i = 0; curses_menu_items[i]; i++) 479 + free_item(curses_menu_items[i]); 480 + bzero(curses_menu_items, sizeof(curses_menu_items)); 481 + bzero(k_menu_items, sizeof(k_menu_items)); 482 + bzero(hotkeys, sizeof(hotkeys)); 483 + items_num = 0; 484 + } 485 + 486 + /* return the index of the next hot item, or -1 if no such item exists */ 487 + static int get_next_hot(int c) 488 + { 489 + static int hot_index; 490 + static int hot_char; 491 + 492 + if (c < 0 || c > 255 || hotkeys[c].count <= 0) 493 + return -1; 494 + 495 + if (hot_char == c) { 496 + hot_index = (hot_index+1)%hotkeys[c].count; 497 + return hotkeys[c].ptrs[hot_index]; 498 + } else { 499 + hot_char = c; 500 + hot_index = 0; 501 + return hotkeys[c].ptrs[0]; 502 + } 503 + } 504 + 505 + /* can the char c be a hot key? no, if c is a common shortcut used elsewhere */ 506 + static int canbhot(char c) 507 + { 508 + c = tolower(c); 509 + return isalnum(c) && c != 'y' && c != 'm' && c != 'h' && 510 + c != 'n' && c != '?'; 511 + } 512 + 513 + /* check if str already contains a hot key. */ 514 + static int is_hot(int index) 515 + { 516 + return k_menu_items[index].is_hot; 517 + } 518 + 519 + /* find the first possible hot key, and mark it. 520 + * index is the index of the item in the menu 521 + * return 0 on success*/ 522 + static int make_hot(char *dest, int len, const char *org, int index) 523 + { 524 + int position = -1; 525 + int i; 526 + int tmp; 527 + int c; 528 + int org_len = strlen(org); 529 + 530 + if (org == NULL || is_hot(index)) 531 + return 1; 532 + 533 + /* make sure not to make hot keys out of markers. 534 + * find where to start looking for a hot key 535 + */ 536 + i = 0; 537 + /* skip white space */ 538 + while (i < org_len && org[i] == ' ') 539 + i++; 540 + if (i == org_len) 541 + return -1; 542 + /* if encountering '(' or '<' or '[', find the match and look from there 543 + **/ 544 + if (org[i] == '[' || org[i] == '<' || org[i] == '(') { 545 + i++; 546 + for (; i < org_len; i++) 547 + if (org[i] == ']' || org[i] == '>' || org[i] == ')') 548 + break; 549 + } 550 + if (i == org_len) 551 + return -1; 552 + for (; i < org_len; i++) { 553 + if (canbhot(org[i]) && org[i-1] != '<' && org[i-1] != '(') { 554 + position = i; 555 + break; 556 + } 557 + } 558 + if (position == -1) 559 + return 1; 560 + 561 + /* ok, char at org[position] should be a hot key to this item */ 562 + c = tolower(org[position]); 563 + tmp = hotkeys[c].count; 564 + hotkeys[c].ptrs[tmp] = index; 565 + hotkeys[c].count++; 566 + /* 567 + snprintf(dest, len, "%.*s(%c)%s", position, org, org[position], 568 + &org[position+1]); 569 + */ 570 + /* make org[position] uppercase, and all leading letter small case */ 571 + strncpy(dest, org, len); 572 + for (i = 0; i < position; i++) 573 + dest[i] = tolower(dest[i]); 574 + dest[position] = toupper(dest[position]); 575 + k_menu_items[index].is_hot = 1; 576 + return 0; 577 + } 578 + 579 + /* Make a new item. Add a hotkey mark in the first possible letter. 580 + * As ncurses does not allow any attributes inside menue item, we mark the 581 + * hot key as the first capitalized letter in the string */ 582 + static void item_make(struct menu *menu, char tag, const char *fmt, ...) 583 + { 584 + va_list ap; 585 + char tmp_str[256]; 586 + 587 + if (items_num > MAX_MENU_ITEMS-1) 588 + return; 589 + 590 + bzero(&k_menu_items[items_num], sizeof(k_menu_items[0])); 591 + k_menu_items[items_num].tag = tag; 592 + k_menu_items[items_num].usrptr = menu; 593 + if (menu != NULL) 594 + k_menu_items[items_num].is_visible = 595 + menu_is_visible(menu); 596 + else 597 + k_menu_items[items_num].is_visible = 1; 598 + 599 + va_start(ap, fmt); 600 + vsnprintf(tmp_str, sizeof(tmp_str), fmt, ap); 601 + if (!k_menu_items[items_num].is_visible) 602 + memcpy(tmp_str, "XXX", 3); 603 + va_end(ap); 604 + if (make_hot( 605 + k_menu_items[items_num].str, 606 + sizeof(k_menu_items[items_num].str), tmp_str, items_num) != 0) 607 + strncpy(k_menu_items[items_num].str, 608 + tmp_str, 609 + sizeof(k_menu_items[items_num].str)); 610 + 611 + curses_menu_items[items_num] = new_item( 612 + k_menu_items[items_num].str, 613 + k_menu_items[items_num].str); 614 + set_item_userptr(curses_menu_items[items_num], 615 + &k_menu_items[items_num]); 616 + /* 617 + if (!k_menu_items[items_num].is_visible) 618 + item_opts_off(curses_menu_items[items_num], O_SELECTABLE); 619 + */ 620 + 621 + items_num++; 622 + curses_menu_items[items_num] = NULL; 623 + } 624 + 625 + /* very hackish. adds a string to the last item added */ 626 + static void item_add_str(const char *fmt, ...) 627 + { 628 + va_list ap; 629 + int index = items_num-1; 630 + char new_str[256]; 631 + char tmp_str[256]; 632 + 633 + if (index < 0) 634 + return; 635 + 636 + va_start(ap, fmt); 637 + vsnprintf(new_str, sizeof(new_str), fmt, ap); 638 + va_end(ap); 639 + snprintf(tmp_str, sizeof(tmp_str), "%s%s", 640 + k_menu_items[index].str, new_str); 641 + if (make_hot(k_menu_items[index].str, 642 + sizeof(k_menu_items[index].str), tmp_str, index) != 0) 643 + strncpy(k_menu_items[index].str, 644 + tmp_str, 645 + sizeof(k_menu_items[index].str)); 646 + 647 + free_item(curses_menu_items[index]); 648 + curses_menu_items[index] = new_item( 649 + k_menu_items[index].str, 650 + k_menu_items[index].str); 651 + set_item_userptr(curses_menu_items[index], 652 + &k_menu_items[index]); 653 + } 654 + 655 + /* get the tag of the currently selected item */ 656 + static char item_tag(void) 657 + { 658 + ITEM *cur; 659 + struct mitem *mcur; 660 + 661 + cur = current_item(curses_menu); 662 + if (cur == NULL) 663 + return 0; 664 + mcur = (struct mitem *) item_userptr(cur); 665 + return mcur->tag; 666 + } 667 + 668 + static int curses_item_index(void) 669 + { 670 + return item_index(current_item(curses_menu)); 671 + } 672 + 673 + static void *item_data(void) 674 + { 675 + ITEM *cur; 676 + struct mitem *mcur; 677 + 678 + cur = current_item(curses_menu); 679 + mcur = (struct mitem *) item_userptr(cur); 680 + return mcur->usrptr; 681 + 682 + } 683 + 684 + static int item_is_tag(char tag) 685 + { 686 + return item_tag() == tag; 687 + } 688 + 689 + static char filename[PATH_MAX+1]; 690 + static char menu_backtitle[PATH_MAX+128]; 691 + static const char *set_config_filename(const char *config_filename) 692 + { 693 + int size; 694 + struct symbol *sym; 695 + 696 + sym = sym_lookup("KERNELVERSION", 0); 697 + sym_calc_value(sym); 698 + size = snprintf(menu_backtitle, sizeof(menu_backtitle), 699 + _("%s - Linux Kernel v%s Configuration"), 700 + config_filename, sym_get_string_value(sym)); 701 + if (size >= sizeof(menu_backtitle)) 702 + menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; 703 + 704 + size = snprintf(filename, sizeof(filename), "%s", config_filename); 705 + if (size >= sizeof(filename)) 706 + filename[sizeof(filename)-1] = '\0'; 707 + return menu_backtitle; 708 + } 709 + 710 + /* command = 0 is supress, 1 is restore */ 711 + static void supress_stdout(int command) 712 + { 713 + static FILE *org_stdout; 714 + static FILE *org_stderr; 715 + 716 + if (command == 0) { 717 + org_stdout = stdout; 718 + org_stderr = stderr; 719 + stdout = fopen("/dev/null", "a"); 720 + stderr = fopen("/dev/null", "a"); 721 + } else { 722 + fclose(stdout); 723 + fclose(stderr); 724 + stdout = org_stdout; 725 + stderr = org_stderr; 726 + } 727 + } 728 + 729 + /* return = 0 means we are successful. 730 + * -1 means go on doing what you were doing 731 + */ 732 + static int do_exit(void) 733 + { 734 + int res; 735 + if (!conf_get_changed()) { 736 + global_exit = 1; 737 + return 0; 738 + } 739 + res = btn_dialog(main_window, 740 + _("Do you wish to save your " 741 + "new kernel configuration?\n" 742 + "<ESC> to cancel and resume nconfig."), 743 + 2, 744 + " <save> ", 745 + "<don't save>"); 746 + if (res == KEY_EXIT) { 747 + global_exit = 0; 748 + return -1; 749 + } 750 + 751 + /* if we got here, the user really wants to exit */ 752 + switch (res) { 753 + case 0: 754 + supress_stdout(0); 755 + res = conf_write(filename); 756 + supress_stdout(1); 757 + if (res) 758 + btn_dialog( 759 + main_window, 760 + _("Error during writing of the kernel " 761 + "configuration.\n" 762 + "Your kernel configuration " 763 + "changes were NOT saved."), 764 + 1, 765 + "<OK>"); 766 + else { 767 + char buf[1024]; 768 + snprintf(buf, 1024, 769 + _("Configuration written to %s\n" 770 + "End of Linux kernel configuration.\n" 771 + "Execute 'make' to build the kernel or try" 772 + " 'make help'."), filename); 773 + btn_dialog( 774 + main_window, 775 + buf, 776 + 1, 777 + "<OK>"); 778 + } 779 + break; 780 + default: 781 + btn_dialog( 782 + main_window, 783 + _("Your kernel configuration changes were NOT saved."), 784 + 1, 785 + "<OK>"); 786 + break; 787 + } 788 + global_exit = 1; 789 + return 0; 790 + } 791 + 792 + 793 + static void search_conf(void) 794 + { 795 + struct symbol **sym_arr; 796 + struct gstr res; 797 + char dialog_input_result[100]; 798 + char *dialog_input; 799 + int dres; 800 + again: 801 + dres = dialog_inputbox(main_window, 802 + _("Search Configuration Parameter"), 803 + _("Enter CONFIG_ (sub)string to search for " 804 + "(with or without \"CONFIG\")"), 805 + "", dialog_input_result, 99); 806 + switch (dres) { 807 + case 0: 808 + break; 809 + case 1: 810 + show_scroll_win(main_window, 811 + _("Search Configuration"), search_help); 812 + goto again; 813 + default: 814 + return; 815 + } 816 + 817 + /* strip CONFIG_ if necessary */ 818 + dialog_input = dialog_input_result; 819 + if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0) 820 + dialog_input += 7; 821 + 822 + sym_arr = sym_re_search(dialog_input); 823 + res = get_relations_str(sym_arr); 824 + free(sym_arr); 825 + show_scroll_win(main_window, 826 + _("Search Results"), str_get(&res)); 827 + str_free(&res); 828 + } 829 + 830 + 831 + static void build_conf(struct menu *menu) 832 + { 833 + struct symbol *sym; 834 + struct property *prop; 835 + struct menu *child; 836 + int type, tmp, doint = 2; 837 + tristate val; 838 + char ch; 839 + 840 + if (!menu || (!show_all_items && !menu_is_visible(menu))) 841 + return; 842 + 843 + sym = menu->sym; 844 + prop = menu->prompt; 845 + if (!sym) { 846 + if (prop && menu != current_menu) { 847 + const char *prompt = menu_get_prompt(menu); 848 + enum prop_type ptype; 849 + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 850 + switch (ptype) { 851 + case P_MENU: 852 + child_count++; 853 + prompt = _(prompt); 854 + if (single_menu_mode) { 855 + item_make(menu, 'm', 856 + "%s%*c%s", 857 + menu->data ? "-->" : "++>", 858 + indent + 1, ' ', prompt); 859 + } else 860 + item_make(menu, 'm', 861 + " %*c%s --->", 862 + indent + 1, 863 + ' ', prompt); 864 + 865 + if (single_menu_mode && menu->data) 866 + goto conf_childs; 867 + return; 868 + case P_COMMENT: 869 + if (prompt) { 870 + child_count++; 871 + item_make(menu, ':', 872 + " %*c*** %s ***", 873 + indent + 1, ' ', 874 + _(prompt)); 875 + } 876 + break; 877 + default: 878 + if (prompt) { 879 + child_count++; 880 + item_make(menu, ':', "---%*c%s", 881 + indent + 1, ' ', 882 + _(prompt)); 883 + } 884 + } 885 + } else 886 + doint = 0; 887 + goto conf_childs; 888 + } 889 + 890 + type = sym_get_type(sym); 891 + if (sym_is_choice(sym)) { 892 + struct symbol *def_sym = sym_get_choice_value(sym); 893 + struct menu *def_menu = NULL; 894 + 895 + child_count++; 896 + for (child = menu->list; child; child = child->next) { 897 + if (menu_is_visible(child) && child->sym == def_sym) 898 + def_menu = child; 899 + } 900 + 901 + val = sym_get_tristate_value(sym); 902 + if (sym_is_changable(sym)) { 903 + switch (type) { 904 + case S_BOOLEAN: 905 + item_make(menu, 't', "[%c]", 906 + val == no ? ' ' : '*'); 907 + break; 908 + case S_TRISTATE: 909 + switch (val) { 910 + case yes: 911 + ch = '*'; 912 + break; 913 + case mod: 914 + ch = 'M'; 915 + break; 916 + default: 917 + ch = ' '; 918 + break; 919 + } 920 + item_make(menu, 't', "<%c>", ch); 921 + break; 922 + } 923 + } else { 924 + item_make(menu, def_menu ? 't' : ':', " "); 925 + } 926 + 927 + item_add_str("%*c%s", indent + 1, 928 + ' ', _(menu_get_prompt(menu))); 929 + if (val == yes) { 930 + if (def_menu) { 931 + item_add_str(" (%s)", 932 + _(menu_get_prompt(def_menu))); 933 + item_add_str(" --->"); 934 + if (def_menu->list) { 935 + indent += 2; 936 + build_conf(def_menu); 937 + indent -= 2; 938 + } 939 + } 940 + return; 941 + } 942 + } else { 943 + if (menu == current_menu) { 944 + item_make(menu, ':', 945 + "---%*c%s", indent + 1, 946 + ' ', _(menu_get_prompt(menu))); 947 + goto conf_childs; 948 + } 949 + child_count++; 950 + val = sym_get_tristate_value(sym); 951 + if (sym_is_choice_value(sym) && val == yes) { 952 + item_make(menu, ':', " "); 953 + } else { 954 + switch (type) { 955 + case S_BOOLEAN: 956 + if (sym_is_changable(sym)) 957 + item_make(menu, 't', "[%c]", 958 + val == no ? ' ' : '*'); 959 + else 960 + item_make(menu, 't', "-%c-", 961 + val == no ? ' ' : '*'); 962 + break; 963 + case S_TRISTATE: 964 + switch (val) { 965 + case yes: 966 + ch = '*'; 967 + break; 968 + case mod: 969 + ch = 'M'; 970 + break; 971 + default: 972 + ch = ' '; 973 + break; 974 + } 975 + if (sym_is_changable(sym)) { 976 + if (sym->rev_dep.tri == mod) 977 + item_make(menu, 978 + 't', "{%c}", ch); 979 + else 980 + item_make(menu, 981 + 't', "<%c>", ch); 982 + } else 983 + item_make(menu, 't', "-%c-", ch); 984 + break; 985 + default: 986 + tmp = 2 + strlen(sym_get_string_value(sym)); 987 + item_make(menu, 's', " (%s)", 988 + sym_get_string_value(sym)); 989 + tmp = indent - tmp + 4; 990 + if (tmp < 0) 991 + tmp = 0; 992 + item_add_str("%*c%s%s", tmp, ' ', 993 + _(menu_get_prompt(menu)), 994 + (sym_has_value(sym) || 995 + !sym_is_changable(sym)) ? "" : 996 + _(" (NEW)")); 997 + goto conf_childs; 998 + } 999 + } 1000 + item_add_str("%*c%s%s", indent + 1, ' ', 1001 + _(menu_get_prompt(menu)), 1002 + (sym_has_value(sym) || !sym_is_changable(sym)) ? 1003 + "" : _(" (NEW)")); 1004 + if (menu->prompt && menu->prompt->type == P_MENU) { 1005 + item_add_str(" --->"); 1006 + return; 1007 + } 1008 + } 1009 + 1010 + conf_childs: 1011 + indent += doint; 1012 + for (child = menu->list; child; child = child->next) 1013 + build_conf(child); 1014 + indent -= doint; 1015 + } 1016 + 1017 + static void reset_menu(void) 1018 + { 1019 + unpost_menu(curses_menu); 1020 + clean_items(); 1021 + } 1022 + 1023 + /* adjust the menu to show this item. 1024 + * prefer not to scroll the menu if possible*/ 1025 + static void center_item(int selected_index, int *last_top_row) 1026 + { 1027 + int toprow; 1028 + int maxy, maxx; 1029 + 1030 + scale_menu(curses_menu, &maxy, &maxx); 1031 + set_top_row(curses_menu, *last_top_row); 1032 + toprow = top_row(curses_menu); 1033 + if (selected_index >= toprow && selected_index < toprow+maxy) { 1034 + /* we can only move the selected item. no need to scroll */ 1035 + set_current_item(curses_menu, 1036 + curses_menu_items[selected_index]); 1037 + } else { 1038 + toprow = max(selected_index-maxy/2, 0); 1039 + if (toprow >= item_count(curses_menu)-maxy) 1040 + toprow = item_count(curses_menu)-mwin_max_lines; 1041 + set_top_row(curses_menu, toprow); 1042 + set_current_item(curses_menu, 1043 + curses_menu_items[selected_index]); 1044 + } 1045 + *last_top_row = toprow; 1046 + post_menu(curses_menu); 1047 + refresh_all_windows(main_window); 1048 + } 1049 + 1050 + /* this function assumes reset_menu has been called before */ 1051 + static void show_menu(const char *prompt, const char *instructions, 1052 + int selected_index, int *last_top_row) 1053 + { 1054 + int maxx, maxy; 1055 + WINDOW *menu_window; 1056 + 1057 + current_instructions = instructions; 1058 + 1059 + clear(); 1060 + wattrset(main_window, attributes[NORMAL]); 1061 + print_in_middle(stdscr, 1, 0, COLS, 1062 + menu_backtitle, 1063 + attributes[MAIN_HEADING]); 1064 + 1065 + wattrset(main_window, attributes[MAIN_MENU_BOX]); 1066 + box(main_window, 0, 0); 1067 + wattrset(main_window, attributes[MAIN_MENU_HEADING]); 1068 + mvwprintw(main_window, 0, 3, " %s ", prompt); 1069 + wattrset(main_window, attributes[NORMAL]); 1070 + 1071 + set_menu_items(curses_menu, curses_menu_items); 1072 + 1073 + /* position the menu at the middle of the screen */ 1074 + scale_menu(curses_menu, &maxy, &maxx); 1075 + maxx = min(maxx, mwin_max_cols-2); 1076 + maxy = mwin_max_lines-2; 1077 + menu_window = derwin(main_window, 1078 + maxy, 1079 + maxx, 1080 + 2, 1081 + (mwin_max_cols-maxx)/2); 1082 + keypad(menu_window, TRUE); 1083 + set_menu_win(curses_menu, menu_window); 1084 + set_menu_sub(curses_menu, menu_window); 1085 + 1086 + /* must reassert this after changing items, otherwise returns to a 1087 + * default of 16 1088 + */ 1089 + set_menu_format(curses_menu, maxy, 1); 1090 + center_item(selected_index, last_top_row); 1091 + set_menu_format(curses_menu, maxy, 1); 1092 + 1093 + print_function_line(); 1094 + 1095 + /* Post the menu */ 1096 + post_menu(curses_menu); 1097 + refresh_all_windows(main_window); 1098 + } 1099 + 1100 + 1101 + static void conf(struct menu *menu) 1102 + { 1103 + char pattern[256]; 1104 + struct menu *submenu = 0; 1105 + const char *prompt = menu_get_prompt(menu); 1106 + struct symbol *sym; 1107 + struct menu *active_menu = NULL; 1108 + int res; 1109 + int current_index = 0; 1110 + int last_top_row = 0; 1111 + 1112 + bzero(pattern, sizeof(pattern)); 1113 + 1114 + while (!global_exit) { 1115 + reset_menu(); 1116 + current_menu = menu; 1117 + build_conf(menu); 1118 + if (!child_count) 1119 + break; 1120 + 1121 + show_menu(prompt ? _(prompt) : _("Main Menu"), 1122 + _(menu_instructions), 1123 + current_index, &last_top_row); 1124 + keypad((menu_win(curses_menu)), TRUE); 1125 + while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1126 + if (process_special_keys(&res, 1127 + (struct menu *) item_data())) 1128 + break; 1129 + switch (res) { 1130 + case KEY_DOWN: 1131 + menu_driver(curses_menu, REQ_DOWN_ITEM); 1132 + break; 1133 + case KEY_UP: 1134 + menu_driver(curses_menu, REQ_UP_ITEM); 1135 + break; 1136 + case KEY_NPAGE: 1137 + menu_driver(curses_menu, REQ_SCR_DPAGE); 1138 + break; 1139 + case KEY_PPAGE: 1140 + menu_driver(curses_menu, REQ_SCR_UPAGE); 1141 + break; 1142 + case KEY_HOME: 1143 + menu_driver(curses_menu, REQ_FIRST_ITEM); 1144 + break; 1145 + case KEY_END: 1146 + menu_driver(curses_menu, REQ_LAST_ITEM); 1147 + break; 1148 + case 'h': 1149 + case '?': 1150 + show_help((struct menu *) item_data()); 1151 + break; 1152 + } 1153 + if (res == 10 || res == 27 || 1154 + res == 32 || res == 'n' || res == 'y' || 1155 + res == KEY_LEFT || res == KEY_RIGHT || 1156 + res == 'm' || res == '/') 1157 + break; 1158 + else if (canbhot(res)) { 1159 + /* check for hot keys: */ 1160 + int tmp = get_next_hot(res); 1161 + if (tmp != -1) 1162 + center_item(tmp, &last_top_row); 1163 + } 1164 + refresh_all_windows(main_window); 1165 + } 1166 + 1167 + refresh_all_windows(main_window); 1168 + /* if ESC or left*/ 1169 + if (res == 27 || (menu != &rootmenu && res == KEY_LEFT)) 1170 + break; 1171 + 1172 + /* remember location in the menu */ 1173 + last_top_row = top_row(curses_menu); 1174 + current_index = curses_item_index(); 1175 + 1176 + if (!item_tag()) 1177 + continue; 1178 + 1179 + submenu = (struct menu *) item_data(); 1180 + active_menu = (struct menu *)item_data(); 1181 + if (!submenu || !menu_is_visible(submenu)) 1182 + continue; 1183 + if (submenu) 1184 + sym = submenu->sym; 1185 + else 1186 + sym = NULL; 1187 + 1188 + switch (res) { 1189 + case ' ': 1190 + if (item_is_tag('t')) 1191 + sym_toggle_tristate_value(sym); 1192 + else if (item_is_tag('m')) 1193 + conf(submenu); 1194 + break; 1195 + case KEY_RIGHT: 1196 + case 10: /* ENTER WAS PRESSED */ 1197 + switch (item_tag()) { 1198 + case 'm': 1199 + if (single_menu_mode) 1200 + submenu->data = 1201 + (void *) (long) !submenu->data; 1202 + else 1203 + conf(submenu); 1204 + break; 1205 + case 't': 1206 + if (sym_is_choice(sym) && 1207 + sym_get_tristate_value(sym) == yes) 1208 + conf_choice(submenu); 1209 + else if (submenu->prompt && 1210 + submenu->prompt->type == P_MENU) 1211 + conf(submenu); 1212 + else if (res == 10) 1213 + sym_toggle_tristate_value(sym); 1214 + break; 1215 + case 's': 1216 + conf_string(submenu); 1217 + break; 1218 + } 1219 + break; 1220 + case 'y': 1221 + if (item_is_tag('t')) { 1222 + if (sym_set_tristate_value(sym, yes)) 1223 + break; 1224 + if (sym_set_tristate_value(sym, mod)) 1225 + btn_dialog(main_window, setmod_text, 0); 1226 + } 1227 + break; 1228 + case 'n': 1229 + if (item_is_tag('t')) 1230 + sym_set_tristate_value(sym, no); 1231 + break; 1232 + case 'm': 1233 + if (item_is_tag('t')) 1234 + sym_set_tristate_value(sym, mod); 1235 + break; 1236 + case '/': 1237 + search_conf(); 1238 + break; 1239 + } 1240 + } 1241 + } 1242 + 1243 + static void show_help(struct menu *menu) 1244 + { 1245 + struct gstr help = str_new(); 1246 + 1247 + if (menu && menu->sym && menu_has_help(menu)) { 1248 + if (menu->sym->name) { 1249 + str_printf(&help, "CONFIG_%s:\n\n", menu->sym->name); 1250 + str_append(&help, _(menu_get_help(menu))); 1251 + str_append(&help, "\n"); 1252 + get_symbol_str(&help, menu->sym); 1253 + } 1254 + } else { 1255 + str_append(&help, nohelp_text); 1256 + } 1257 + show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help)); 1258 + str_free(&help); 1259 + } 1260 + 1261 + static void conf_choice(struct menu *menu) 1262 + { 1263 + const char *prompt = _(menu_get_prompt(menu)); 1264 + struct menu *child = 0; 1265 + struct symbol *active; 1266 + int selected_index = 0; 1267 + int last_top_row = 0; 1268 + int res, i = 0; 1269 + 1270 + active = sym_get_choice_value(menu->sym); 1271 + /* this is mostly duplicated from the conf() function. */ 1272 + while (!global_exit) { 1273 + reset_menu(); 1274 + 1275 + for (i = 0, child = menu->list; child; child = child->next) { 1276 + if (!show_all_items && !menu_is_visible(child)) 1277 + continue; 1278 + 1279 + if (child->sym == sym_get_choice_value(menu->sym)) 1280 + item_make(child, ':', "<X> %s", 1281 + _(menu_get_prompt(child))); 1282 + else 1283 + item_make(child, ':', " %s", 1284 + _(menu_get_prompt(child))); 1285 + if (child->sym == active){ 1286 + last_top_row = top_row(curses_menu); 1287 + selected_index = i; 1288 + } 1289 + i++; 1290 + } 1291 + show_menu(prompt ? _(prompt) : _("Choice Menu"), 1292 + _(radiolist_instructions), 1293 + selected_index, 1294 + &last_top_row); 1295 + while (!global_exit && (res = wgetch(menu_win(curses_menu)))) { 1296 + if (process_special_keys( 1297 + &res, 1298 + (struct menu *) item_data())) 1299 + break; 1300 + switch (res) { 1301 + case KEY_DOWN: 1302 + menu_driver(curses_menu, REQ_DOWN_ITEM); 1303 + break; 1304 + case KEY_UP: 1305 + menu_driver(curses_menu, REQ_UP_ITEM); 1306 + break; 1307 + case KEY_NPAGE: 1308 + menu_driver(curses_menu, REQ_SCR_DPAGE); 1309 + break; 1310 + case KEY_PPAGE: 1311 + menu_driver(curses_menu, REQ_SCR_UPAGE); 1312 + break; 1313 + case KEY_HOME: 1314 + menu_driver(curses_menu, REQ_FIRST_ITEM); 1315 + break; 1316 + case KEY_END: 1317 + menu_driver(curses_menu, REQ_LAST_ITEM); 1318 + break; 1319 + case 'h': 1320 + case '?': 1321 + show_help((struct menu *) item_data()); 1322 + break; 1323 + } 1324 + if (res == 10 || res == 27 || res == ' ' || 1325 + res == KEY_LEFT) 1326 + break; 1327 + else if (canbhot(res)) { 1328 + /* check for hot keys: */ 1329 + int tmp = get_next_hot(res); 1330 + if (tmp != -1) 1331 + center_item(tmp, &last_top_row); 1332 + } 1333 + refresh_all_windows(main_window); 1334 + } 1335 + /* if ESC or left */ 1336 + if (res == 27 || res == KEY_LEFT) 1337 + break; 1338 + 1339 + child = item_data(); 1340 + if (!child || !menu_is_visible(child)) 1341 + continue; 1342 + switch (res) { 1343 + case ' ': 1344 + case 10: 1345 + case KEY_RIGHT: 1346 + sym_set_tristate_value(child->sym, yes); 1347 + return; 1348 + case 'h': 1349 + case '?': 1350 + show_help(child); 1351 + active = child->sym; 1352 + break; 1353 + case KEY_EXIT: 1354 + return; 1355 + } 1356 + } 1357 + } 1358 + 1359 + static void conf_string(struct menu *menu) 1360 + { 1361 + const char *prompt = menu_get_prompt(menu); 1362 + char dialog_input_result[256]; 1363 + 1364 + while (1) { 1365 + int res; 1366 + const char *heading; 1367 + 1368 + switch (sym_get_type(menu->sym)) { 1369 + case S_INT: 1370 + heading = _(inputbox_instructions_int); 1371 + break; 1372 + case S_HEX: 1373 + heading = _(inputbox_instructions_hex); 1374 + break; 1375 + case S_STRING: 1376 + heading = _(inputbox_instructions_string); 1377 + break; 1378 + default: 1379 + heading = _("Internal nconf error!"); 1380 + } 1381 + res = dialog_inputbox(main_window, 1382 + prompt ? _(prompt) : _("Main Menu"), 1383 + heading, 1384 + sym_get_string_value(menu->sym), 1385 + dialog_input_result, 1386 + sizeof(dialog_input_result)); 1387 + switch (res) { 1388 + case 0: 1389 + if (sym_set_string_value(menu->sym, 1390 + dialog_input_result)) 1391 + return; 1392 + btn_dialog(main_window, 1393 + _("You have made an invalid entry."), 0); 1394 + break; 1395 + case 1: 1396 + show_help(menu); 1397 + break; 1398 + case KEY_EXIT: 1399 + return; 1400 + } 1401 + } 1402 + } 1403 + 1404 + static void conf_load(void) 1405 + { 1406 + char dialog_input_result[256]; 1407 + while (1) { 1408 + int res; 1409 + res = dialog_inputbox(main_window, 1410 + NULL, load_config_text, 1411 + filename, 1412 + dialog_input_result, 1413 + sizeof(dialog_input_result)); 1414 + switch (res) { 1415 + case 0: 1416 + if (!dialog_input_result[0]) 1417 + return; 1418 + if (!conf_read(dialog_input_result)) { 1419 + set_config_filename(dialog_input_result); 1420 + sym_set_change_count(1); 1421 + return; 1422 + } 1423 + btn_dialog(main_window, _("File does not exist!"), 0); 1424 + break; 1425 + case 1: 1426 + show_scroll_win(main_window, 1427 + _("Load Alternate Configuration"), 1428 + load_config_help); 1429 + break; 1430 + case KEY_EXIT: 1431 + return; 1432 + } 1433 + } 1434 + } 1435 + 1436 + static void conf_save(void) 1437 + { 1438 + char dialog_input_result[256]; 1439 + while (1) { 1440 + int res; 1441 + res = dialog_inputbox(main_window, 1442 + NULL, save_config_text, 1443 + filename, 1444 + dialog_input_result, 1445 + sizeof(dialog_input_result)); 1446 + switch (res) { 1447 + case 0: 1448 + if (!dialog_input_result[0]) 1449 + return; 1450 + supress_stdout(0); 1451 + res = conf_write(dialog_input_result); 1452 + supress_stdout(1); 1453 + if (!res) { 1454 + char buf[1024]; 1455 + sprintf(buf, "%s %s", 1456 + _("configuration file saved to: "), 1457 + dialog_input_result); 1458 + btn_dialog(main_window, 1459 + buf, 1, "<OK>"); 1460 + set_config_filename(dialog_input_result); 1461 + return; 1462 + } 1463 + btn_dialog(main_window, _("Can't create file! " 1464 + "Probably a nonexistent directory."), 1465 + 1, "<OK>"); 1466 + break; 1467 + case 1: 1468 + show_scroll_win(main_window, 1469 + _("Save Alternate Configuration"), 1470 + save_config_help); 1471 + break; 1472 + case KEY_EXIT: 1473 + return; 1474 + } 1475 + } 1476 + } 1477 + 1478 + void setup_windows(void) 1479 + { 1480 + if (main_window != NULL) 1481 + delwin(main_window); 1482 + 1483 + /* set up the menu and menu window */ 1484 + main_window = newwin(LINES-2, COLS-2, 2, 1); 1485 + keypad(main_window, TRUE); 1486 + mwin_max_lines = LINES-6; 1487 + mwin_max_cols = COLS-6; 1488 + 1489 + /* panels order is from bottom to top */ 1490 + new_panel(main_window); 1491 + } 1492 + 1493 + int main(int ac, char **av) 1494 + { 1495 + char *mode; 1496 + 1497 + setlocale(LC_ALL, ""); 1498 + bindtextdomain(PACKAGE, LOCALEDIR); 1499 + textdomain(PACKAGE); 1500 + 1501 + conf_parse(av[1]); 1502 + conf_read(NULL); 1503 + 1504 + mode = getenv("NCONFIG_MODE"); 1505 + if (mode) { 1506 + if (!strcasecmp(mode, "single_menu")) 1507 + single_menu_mode = 1; 1508 + } 1509 + 1510 + /* Initialize curses */ 1511 + initscr(); 1512 + /* set color theme */ 1513 + set_colors(); 1514 + 1515 + cbreak(); 1516 + noecho(); 1517 + keypad(stdscr, TRUE); 1518 + curs_set(0); 1519 + 1520 + if (COLS < 75 || LINES < 20) { 1521 + endwin(); 1522 + printf("Your terminal should have at " 1523 + "least 20 lines and 75 columns\n"); 1524 + return 1; 1525 + } 1526 + 1527 + notimeout(stdscr, FALSE); 1528 + ESCDELAY = 1; 1529 + 1530 + /* set btns menu */ 1531 + curses_menu = new_menu(curses_menu_items); 1532 + menu_opts_off(curses_menu, O_SHOWDESC); 1533 + menu_opts_off(curses_menu, O_SHOWMATCH); 1534 + menu_opts_on(curses_menu, O_ONEVALUE); 1535 + menu_opts_on(curses_menu, O_NONCYCLIC); 1536 + set_menu_mark(curses_menu, " "); 1537 + set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); 1538 + set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); 1539 + set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); 1540 + 1541 + set_config_filename(conf_get_configname()); 1542 + setup_windows(); 1543 + 1544 + /* check for KEY_FUNC(1) */ 1545 + if (has_key(KEY_F(1)) == FALSE) { 1546 + show_scroll_win(main_window, 1547 + _("Instructions"), 1548 + _(menu_no_f_instructions)); 1549 + } 1550 + 1551 + 1552 + 1553 + /* do the work */ 1554 + while (!global_exit) { 1555 + conf(&rootmenu); 1556 + if (!global_exit && do_exit() == 0) 1557 + break; 1558 + } 1559 + /* ok, we are done */ 1560 + unpost_menu(curses_menu); 1561 + free_menu(curses_menu); 1562 + delwin(main_window); 1563 + clear(); 1564 + refresh(); 1565 + endwin(); 1566 + return 0; 1567 + } 1568 +
+617
scripts/kconfig/nconf.gui.c
··· 1 + /* 2 + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com? 3 + * Released under the terms of the GNU GPL v2.0. 4 + * 5 + * Derived from menuconfig. 6 + * 7 + */ 8 + #include "nconf.h" 9 + 10 + /* a list of all the different widgets we use */ 11 + attributes_t attributes[ATTR_MAX+1] = {0}; 12 + 13 + /* available colors: 14 + COLOR_BLACK 0 15 + COLOR_RED 1 16 + COLOR_GREEN 2 17 + COLOR_YELLOW 3 18 + COLOR_BLUE 4 19 + COLOR_MAGENTA 5 20 + COLOR_CYAN 6 21 + COLOR_WHITE 7 22 + */ 23 + static void set_normal_colors(void) 24 + { 25 + init_pair(NORMAL, -1, -1); 26 + init_pair(MAIN_HEADING, COLOR_MAGENTA, -1); 27 + 28 + /* FORE is for the selected item */ 29 + init_pair(MAIN_MENU_FORE, -1, -1); 30 + /* BACK for all the rest */ 31 + init_pair(MAIN_MENU_BACK, -1, -1); 32 + init_pair(MAIN_MENU_GREY, -1, -1); 33 + init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1); 34 + init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1); 35 + 36 + init_pair(SCROLLWIN_TEXT, -1, -1); 37 + init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1); 38 + init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1); 39 + 40 + init_pair(DIALOG_TEXT, -1, -1); 41 + init_pair(DIALOG_BOX, COLOR_YELLOW, -1); 42 + init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1); 43 + init_pair(DIALOG_MENU_FORE, COLOR_RED, -1); 44 + 45 + init_pair(INPUT_BOX, COLOR_YELLOW, -1); 46 + init_pair(INPUT_HEADING, COLOR_GREEN, -1); 47 + init_pair(INPUT_TEXT, -1, -1); 48 + init_pair(INPUT_FIELD, -1, -1); 49 + 50 + init_pair(FUNCTION_HIGHLIGHT, -1, -1); 51 + init_pair(FUNCTION_TEXT, COLOR_BLUE, -1); 52 + } 53 + 54 + /* available attributes: 55 + A_NORMAL Normal display (no highlight) 56 + A_STANDOUT Best highlighting mode of the terminal. 57 + A_UNDERLINE Underlining 58 + A_REVERSE Reverse video 59 + A_BLINK Blinking 60 + A_DIM Half bright 61 + A_BOLD Extra bright or bold 62 + A_PROTECT Protected mode 63 + A_INVIS Invisible or blank mode 64 + A_ALTCHARSET Alternate character set 65 + A_CHARTEXT Bit-mask to extract a character 66 + COLOR_PAIR(n) Color-pair number n 67 + */ 68 + static void normal_color_theme(void) 69 + { 70 + /* automatically add color... */ 71 + #define mkattr(name, attr) do { \ 72 + attributes[name] = attr | COLOR_PAIR(name); } while (0) 73 + mkattr(NORMAL, NORMAL); 74 + mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE); 75 + 76 + mkattr(MAIN_MENU_FORE, A_REVERSE); 77 + mkattr(MAIN_MENU_BACK, A_NORMAL); 78 + mkattr(MAIN_MENU_GREY, A_NORMAL); 79 + mkattr(MAIN_MENU_HEADING, A_BOLD); 80 + mkattr(MAIN_MENU_BOX, A_NORMAL); 81 + 82 + mkattr(SCROLLWIN_TEXT, A_NORMAL); 83 + mkattr(SCROLLWIN_HEADING, A_BOLD); 84 + mkattr(SCROLLWIN_BOX, A_BOLD); 85 + 86 + mkattr(DIALOG_TEXT, A_BOLD); 87 + mkattr(DIALOG_BOX, A_BOLD); 88 + mkattr(DIALOG_MENU_FORE, A_STANDOUT); 89 + mkattr(DIALOG_MENU_BACK, A_NORMAL); 90 + 91 + mkattr(INPUT_BOX, A_NORMAL); 92 + mkattr(INPUT_HEADING, A_BOLD); 93 + mkattr(INPUT_TEXT, A_NORMAL); 94 + mkattr(INPUT_FIELD, A_UNDERLINE); 95 + 96 + mkattr(FUNCTION_HIGHLIGHT, A_BOLD); 97 + mkattr(FUNCTION_TEXT, A_REVERSE); 98 + } 99 + 100 + static void no_colors_theme(void) 101 + { 102 + /* automatically add highlight, no color */ 103 + #define mkattrn(name, attr) { attributes[name] = attr; } 104 + 105 + mkattrn(NORMAL, NORMAL); 106 + mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE); 107 + 108 + mkattrn(MAIN_MENU_FORE, A_STANDOUT); 109 + mkattrn(MAIN_MENU_BACK, A_NORMAL); 110 + mkattrn(MAIN_MENU_GREY, A_NORMAL); 111 + mkattrn(MAIN_MENU_HEADING, A_BOLD); 112 + mkattrn(MAIN_MENU_BOX, A_NORMAL); 113 + 114 + mkattrn(SCROLLWIN_TEXT, A_NORMAL); 115 + mkattrn(SCROLLWIN_HEADING, A_BOLD); 116 + mkattrn(SCROLLWIN_BOX, A_BOLD); 117 + 118 + mkattrn(DIALOG_TEXT, A_NORMAL); 119 + mkattrn(DIALOG_BOX, A_BOLD); 120 + mkattrn(DIALOG_MENU_FORE, A_STANDOUT); 121 + mkattrn(DIALOG_MENU_BACK, A_NORMAL); 122 + 123 + mkattrn(INPUT_BOX, A_BOLD); 124 + mkattrn(INPUT_HEADING, A_BOLD); 125 + mkattrn(INPUT_TEXT, A_NORMAL); 126 + mkattrn(INPUT_FIELD, A_UNDERLINE); 127 + 128 + mkattrn(FUNCTION_HIGHLIGHT, A_BOLD); 129 + mkattrn(FUNCTION_TEXT, A_REVERSE); 130 + } 131 + 132 + void set_colors() 133 + { 134 + start_color(); 135 + use_default_colors(); 136 + set_normal_colors(); 137 + if (has_colors()) { 138 + normal_color_theme(); 139 + } else { 140 + /* give deafults */ 141 + no_colors_theme(); 142 + } 143 + } 144 + 145 + 146 + /* this changes the windows attributes !!! */ 147 + void print_in_middle(WINDOW *win, 148 + int starty, 149 + int startx, 150 + int width, 151 + const char *string, 152 + chtype color) 153 + { int length, x, y; 154 + float temp; 155 + 156 + 157 + if (win == NULL) 158 + win = stdscr; 159 + getyx(win, y, x); 160 + if (startx != 0) 161 + x = startx; 162 + if (starty != 0) 163 + y = starty; 164 + if (width == 0) 165 + width = 80; 166 + 167 + length = strlen(string); 168 + temp = (width - length) / 2; 169 + x = startx + (int)temp; 170 + wattrset(win, color); 171 + mvwprintw(win, y, x, "%s", string); 172 + refresh(); 173 + } 174 + 175 + int get_line_no(const char *text) 176 + { 177 + int i; 178 + int total = 1; 179 + 180 + if (!text) 181 + return 0; 182 + 183 + for (i = 0; text[i] != '\0'; i++) 184 + if (text[i] == '\n') 185 + total++; 186 + return total; 187 + } 188 + 189 + const char *get_line(const char *text, int line_no) 190 + { 191 + int i; 192 + int lines = 0; 193 + 194 + if (!text) 195 + return 0; 196 + 197 + for (i = 0; text[i] != '\0' && lines < line_no; i++) 198 + if (text[i] == '\n') 199 + lines++; 200 + return text+i; 201 + } 202 + 203 + int get_line_length(const char *line) 204 + { 205 + int res = 0; 206 + while (*line != '\0' && *line != '\n') { 207 + line++; 208 + res++; 209 + } 210 + return res; 211 + } 212 + 213 + /* print all lines to the window. */ 214 + void fill_window(WINDOW *win, const char *text) 215 + { 216 + int x, y; 217 + int total_lines = get_line_no(text); 218 + int i; 219 + 220 + getmaxyx(win, y, x); 221 + /* do not go over end of line */ 222 + total_lines = min(total_lines, y); 223 + for (i = 0; i < total_lines; i++) { 224 + char tmp[x+10]; 225 + const char *line = get_line(text, i); 226 + int len = get_line_length(line); 227 + strncpy(tmp, line, min(len, x)); 228 + tmp[len] = '\0'; 229 + mvwprintw(win, i, 0, tmp); 230 + } 231 + } 232 + 233 + /* get the message, and buttons. 234 + * each button must be a char* 235 + * return the selected button 236 + * 237 + * this dialog is used for 2 different things: 238 + * 1) show a text box, no buttons. 239 + * 2) show a dialog, with horizontal buttons 240 + */ 241 + int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...) 242 + { 243 + va_list ap; 244 + char *btn; 245 + int btns_width = 0; 246 + int msg_lines = 0; 247 + int msg_width = 0; 248 + int total_width; 249 + int win_rows = 0; 250 + WINDOW *win; 251 + WINDOW *msg_win; 252 + WINDOW *menu_win; 253 + MENU *menu; 254 + ITEM *btns[btn_num+1]; 255 + int i, x, y; 256 + int res = -1; 257 + 258 + 259 + va_start(ap, btn_num); 260 + for (i = 0; i < btn_num; i++) { 261 + btn = va_arg(ap, char *); 262 + btns[i] = new_item(btn, ""); 263 + btns_width += strlen(btn)+1; 264 + } 265 + va_end(ap); 266 + btns[btn_num] = NULL; 267 + 268 + /* find the widest line of msg: */ 269 + msg_lines = get_line_no(msg); 270 + for (i = 0; i < msg_lines; i++) { 271 + const char *line = get_line(msg, i); 272 + int len = get_line_length(line); 273 + if (msg_width < len) 274 + msg_width = len; 275 + } 276 + 277 + total_width = max(msg_width, btns_width); 278 + /* place dialog in middle of screen */ 279 + y = (LINES-(msg_lines+4))/2; 280 + x = (COLS-(total_width+4))/2; 281 + 282 + 283 + /* create the windows */ 284 + if (btn_num > 0) 285 + win_rows = msg_lines+4; 286 + else 287 + win_rows = msg_lines+2; 288 + 289 + win = newwin(win_rows, total_width+4, y, x); 290 + keypad(win, TRUE); 291 + menu_win = derwin(win, 1, btns_width, win_rows-2, 292 + 1+(total_width+2-btns_width)/2); 293 + menu = new_menu(btns); 294 + msg_win = derwin(win, win_rows-2, msg_width, 1, 295 + 1+(total_width+2-msg_width)/2); 296 + 297 + set_menu_fore(menu, attributes[DIALOG_MENU_FORE]); 298 + set_menu_back(menu, attributes[DIALOG_MENU_BACK]); 299 + 300 + wattrset(win, attributes[DIALOG_BOX]); 301 + box(win, 0, 0); 302 + 303 + /* print message */ 304 + wattrset(msg_win, attributes[DIALOG_TEXT]); 305 + fill_window(msg_win, msg); 306 + 307 + set_menu_win(menu, win); 308 + set_menu_sub(menu, menu_win); 309 + set_menu_format(menu, 1, btn_num); 310 + menu_opts_off(menu, O_SHOWDESC); 311 + menu_opts_off(menu, O_SHOWMATCH); 312 + menu_opts_on(menu, O_ONEVALUE); 313 + menu_opts_on(menu, O_NONCYCLIC); 314 + set_menu_mark(menu, ""); 315 + post_menu(menu); 316 + 317 + 318 + touchwin(win); 319 + refresh_all_windows(main_window); 320 + while ((res = wgetch(win))) { 321 + switch (res) { 322 + case KEY_LEFT: 323 + menu_driver(menu, REQ_LEFT_ITEM); 324 + break; 325 + case KEY_RIGHT: 326 + menu_driver(menu, REQ_RIGHT_ITEM); 327 + break; 328 + case 10: /* ENTER */ 329 + case 27: /* ESCAPE */ 330 + case ' ': 331 + case KEY_F(F_BACK): 332 + case KEY_F(F_EXIT): 333 + break; 334 + } 335 + touchwin(win); 336 + refresh_all_windows(main_window); 337 + 338 + if (res == 10 || res == ' ') { 339 + res = item_index(current_item(menu)); 340 + break; 341 + } else if (res == 27 || res == KEY_F(F_BACK) || 342 + res == KEY_F(F_EXIT)) { 343 + res = KEY_EXIT; 344 + break; 345 + } 346 + } 347 + 348 + unpost_menu(menu); 349 + free_menu(menu); 350 + for (i = 0; i < btn_num; i++) 351 + free_item(btns[i]); 352 + 353 + delwin(win); 354 + return res; 355 + } 356 + 357 + int dialog_inputbox(WINDOW *main_window, 358 + const char *title, const char *prompt, 359 + const char *init, char *result, int result_len) 360 + { 361 + int prompt_lines = 0; 362 + int prompt_width = 0; 363 + WINDOW *win; 364 + WINDOW *prompt_win; 365 + WINDOW *form_win; 366 + PANEL *panel; 367 + int i, x, y; 368 + int res = -1; 369 + int cursor_position = strlen(init); 370 + 371 + 372 + /* find the widest line of msg: */ 373 + prompt_lines = get_line_no(prompt); 374 + for (i = 0; i < prompt_lines; i++) { 375 + const char *line = get_line(prompt, i); 376 + int len = get_line_length(line); 377 + prompt_width = max(prompt_width, len); 378 + } 379 + 380 + if (title) 381 + prompt_width = max(prompt_width, strlen(title)); 382 + 383 + /* place dialog in middle of screen */ 384 + y = (LINES-(prompt_lines+4))/2; 385 + x = (COLS-(prompt_width+4))/2; 386 + 387 + strncpy(result, init, result_len); 388 + 389 + /* create the windows */ 390 + win = newwin(prompt_lines+6, prompt_width+7, y, x); 391 + prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2); 392 + form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); 393 + keypad(form_win, TRUE); 394 + 395 + wattrset(form_win, attributes[INPUT_FIELD]); 396 + 397 + wattrset(win, attributes[INPUT_BOX]); 398 + box(win, 0, 0); 399 + wattrset(win, attributes[INPUT_HEADING]); 400 + if (title) 401 + mvwprintw(win, 0, 3, "%s", title); 402 + 403 + /* print message */ 404 + wattrset(prompt_win, attributes[INPUT_TEXT]); 405 + fill_window(prompt_win, prompt); 406 + 407 + mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); 408 + mvwprintw(form_win, 0, 0, "%s", result); 409 + 410 + /* create panels */ 411 + panel = new_panel(win); 412 + 413 + /* show the cursor */ 414 + curs_set(1); 415 + 416 + touchwin(win); 417 + refresh_all_windows(main_window); 418 + while ((res = wgetch(form_win))) { 419 + int len = strlen(result); 420 + switch (res) { 421 + case 10: /* ENTER */ 422 + case 27: /* ESCAPE */ 423 + case KEY_F(F_HELP): 424 + case KEY_F(F_EXIT): 425 + case KEY_F(F_BACK): 426 + break; 427 + case 127: 428 + case KEY_BACKSPACE: 429 + if (cursor_position > 0) { 430 + memmove(&result[cursor_position-1], 431 + &result[cursor_position], 432 + len-cursor_position+1); 433 + cursor_position--; 434 + } 435 + break; 436 + case KEY_DC: 437 + if (cursor_position >= 0 && cursor_position < len) { 438 + memmove(&result[cursor_position], 439 + &result[cursor_position+1], 440 + len-cursor_position+1); 441 + } 442 + break; 443 + case KEY_UP: 444 + case KEY_RIGHT: 445 + if (cursor_position < len && 446 + cursor_position < min(result_len, prompt_width)) 447 + cursor_position++; 448 + break; 449 + case KEY_DOWN: 450 + case KEY_LEFT: 451 + if (cursor_position > 0) 452 + cursor_position--; 453 + break; 454 + default: 455 + if ((isgraph(res) || isspace(res)) && 456 + len-2 < result_len) { 457 + /* insert the char at the proper position */ 458 + memmove(&result[cursor_position+1], 459 + &result[cursor_position], 460 + len+1); 461 + result[cursor_position] = res; 462 + cursor_position++; 463 + } else { 464 + mvprintw(0, 0, "unknow key: %d\n", res); 465 + } 466 + break; 467 + } 468 + wmove(form_win, 0, 0); 469 + wclrtoeol(form_win); 470 + mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); 471 + mvwprintw(form_win, 0, 0, "%s", result); 472 + wmove(form_win, 0, cursor_position); 473 + touchwin(win); 474 + refresh_all_windows(main_window); 475 + 476 + if (res == 10) { 477 + res = 0; 478 + break; 479 + } else if (res == 27 || res == KEY_F(F_BACK) || 480 + res == KEY_F(F_EXIT)) { 481 + res = KEY_EXIT; 482 + break; 483 + } else if (res == KEY_F(F_HELP)) { 484 + res = 1; 485 + break; 486 + } 487 + } 488 + 489 + /* hide the cursor */ 490 + curs_set(0); 491 + del_panel(panel); 492 + delwin(prompt_win); 493 + delwin(form_win); 494 + delwin(win); 495 + return res; 496 + } 497 + 498 + /* refresh all windows in the correct order */ 499 + void refresh_all_windows(WINDOW *main_window) 500 + { 501 + update_panels(); 502 + touchwin(main_window); 503 + refresh(); 504 + } 505 + 506 + /* layman's scrollable window... */ 507 + void show_scroll_win(WINDOW *main_window, 508 + const char *title, 509 + const char *text) 510 + { 511 + int res; 512 + int total_lines = get_line_no(text); 513 + int x, y; 514 + int start_x = 0, start_y = 0; 515 + int text_lines = 0, text_cols = 0; 516 + int total_cols = 0; 517 + int win_cols = 0; 518 + int win_lines = 0; 519 + int i = 0; 520 + WINDOW *win; 521 + WINDOW *pad; 522 + PANEL *panel; 523 + 524 + /* find the widest line of msg: */ 525 + total_lines = get_line_no(text); 526 + for (i = 0; i < total_lines; i++) { 527 + const char *line = get_line(text, i); 528 + int len = get_line_length(line); 529 + total_cols = max(total_cols, len+2); 530 + } 531 + 532 + /* create the pad */ 533 + pad = newpad(total_lines+10, total_cols+10); 534 + wattrset(pad, attributes[SCROLLWIN_TEXT]); 535 + fill_window(pad, text); 536 + 537 + win_lines = min(total_lines+4, LINES-2); 538 + win_cols = min(total_cols+2, COLS-2); 539 + text_lines = max(win_lines-4, 0); 540 + text_cols = max(win_cols-2, 0); 541 + 542 + /* place window in middle of screen */ 543 + y = (LINES-win_lines)/2; 544 + x = (COLS-win_cols)/2; 545 + 546 + win = newwin(win_lines, win_cols, y, x); 547 + keypad(win, TRUE); 548 + /* show the help in the help window, and show the help panel */ 549 + wattrset(win, attributes[SCROLLWIN_BOX]); 550 + box(win, 0, 0); 551 + wattrset(win, attributes[SCROLLWIN_HEADING]); 552 + mvwprintw(win, 0, 3, " %s ", title); 553 + panel = new_panel(win); 554 + 555 + /* handle scrolling */ 556 + do { 557 + 558 + copywin(pad, win, start_y, start_x, 2, 2, text_lines, 559 + text_cols, 0); 560 + print_in_middle(win, 561 + text_lines+2, 562 + 0, 563 + text_cols, 564 + "<OK>", 565 + attributes[DIALOG_MENU_FORE]); 566 + wrefresh(win); 567 + 568 + res = wgetch(win); 569 + switch (res) { 570 + case KEY_NPAGE: 571 + case ' ': 572 + start_y += text_lines-2; 573 + break; 574 + case KEY_PPAGE: 575 + start_y -= text_lines+2; 576 + break; 577 + case KEY_HOME: 578 + start_y = 0; 579 + break; 580 + case KEY_END: 581 + start_y = total_lines-text_lines; 582 + break; 583 + case KEY_DOWN: 584 + case 'j': 585 + start_y++; 586 + break; 587 + case KEY_UP: 588 + case 'k': 589 + start_y--; 590 + break; 591 + case KEY_LEFT: 592 + case 'h': 593 + start_x--; 594 + break; 595 + case KEY_RIGHT: 596 + case 'l': 597 + start_x++; 598 + break; 599 + } 600 + if (res == 10 || res == 27 || res == 'q' 601 + || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) { 602 + break; 603 + } 604 + if (start_y < 0) 605 + start_y = 0; 606 + if (start_y >= total_lines-text_lines) 607 + start_y = total_lines-text_lines; 608 + if (start_x < 0) 609 + start_x = 0; 610 + if (start_x >= total_cols-text_cols) 611 + start_x = total_cols-text_cols; 612 + } while (res); 613 + 614 + del_panel(panel); 615 + delwin(win); 616 + refresh_all_windows(main_window); 617 + }
+95
scripts/kconfig/nconf.h
··· 1 + /* 2 + * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com? 3 + * Released under the terms of the GNU GPL v2.0. 4 + * 5 + * Derived from menuconfig. 6 + * 7 + */ 8 + 9 + #include <ctype.h> 10 + #include <errno.h> 11 + #include <fcntl.h> 12 + #include <limits.h> 13 + #include <stdarg.h> 14 + #include <stdlib.h> 15 + #include <string.h> 16 + #include <unistd.h> 17 + #include <locale.h> 18 + #include <curses.h> 19 + #include <menu.h> 20 + #include <panel.h> 21 + #include <form.h> 22 + 23 + #include <stdio.h> 24 + #include <time.h> 25 + #include <sys/time.h> 26 + 27 + #include "ncurses.h" 28 + 29 + #define max(a, b) ({\ 30 + typeof(a) _a = a;\ 31 + typeof(b) _b = b;\ 32 + _a > _b ? _a : _b; }) 33 + 34 + #define min(a, b) ({\ 35 + typeof(a) _a = a;\ 36 + typeof(b) _b = b;\ 37 + _a < _b ? _a : _b; }) 38 + 39 + typedef enum { 40 + NORMAL = 1, 41 + MAIN_HEADING, 42 + MAIN_MENU_BOX, 43 + MAIN_MENU_FORE, 44 + MAIN_MENU_BACK, 45 + MAIN_MENU_GREY, 46 + MAIN_MENU_HEADING, 47 + SCROLLWIN_TEXT, 48 + SCROLLWIN_HEADING, 49 + SCROLLWIN_BOX, 50 + DIALOG_TEXT, 51 + DIALOG_MENU_FORE, 52 + DIALOG_MENU_BACK, 53 + DIALOG_BOX, 54 + INPUT_BOX, 55 + INPUT_HEADING, 56 + INPUT_TEXT, 57 + INPUT_FIELD, 58 + FUNCTION_TEXT, 59 + FUNCTION_HIGHLIGHT, 60 + ATTR_MAX 61 + } attributes_t; 62 + extern attributes_t attributes[]; 63 + 64 + typedef enum { 65 + F_HELP = 1, 66 + F_SYMBOL = 2, 67 + F_INSTS = 3, 68 + F_CONF = 4, 69 + F_BACK = 5, 70 + F_SAVE = 6, 71 + F_LOAD = 7, 72 + F_EXIT = 8 73 + } function_key; 74 + 75 + void set_colors(void); 76 + 77 + /* this changes the windows attributes !!! */ 78 + void print_in_middle(WINDOW *win, 79 + int starty, 80 + int startx, 81 + int width, 82 + const char *string, 83 + chtype color); 84 + int get_line_length(const char *line); 85 + int get_line_no(const char *text); 86 + const char *get_line(const char *text, int line_no); 87 + void fill_window(WINDOW *win, const char *text); 88 + int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...); 89 + int dialog_inputbox(WINDOW *main_window, 90 + const char *title, const char *prompt, 91 + const char *init, char *result, int result_len); 92 + void refresh_all_windows(WINDOW *main_window); 93 + void show_scroll_win(WINDOW *main_window, 94 + const char *title, 95 + const char *text);
+18 -12
scripts/kconfig/symbol.c
··· 651 651 return sym->visible > sym->rev_dep.tri; 652 652 } 653 653 654 + static unsigned strhash(const char *s) 655 + { 656 + /* fnv32 hash */ 657 + unsigned hash = 2166136261U; 658 + for (; *s; s++) 659 + hash = (hash ^ *s) * 0x01000193; 660 + return hash; 661 + } 662 + 654 663 struct symbol *sym_lookup(const char *name, int flags) 655 664 { 656 665 struct symbol *symbol; 657 - const char *ptr; 658 666 char *new_name; 659 - int hash = 0; 667 + int hash; 660 668 661 669 if (name) { 662 670 if (name[0] && !name[1]) { ··· 674 666 case 'n': return &symbol_no; 675 667 } 676 668 } 677 - for (ptr = name; *ptr; ptr++) 678 - hash += *ptr; 679 - hash &= 0xff; 669 + hash = strhash(name) % SYMBOL_HASHSIZE; 680 670 681 671 for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { 682 - if (!strcmp(symbol->name, name) && 672 + if (symbol->name && 673 + !strcmp(symbol->name, name) && 683 674 (flags ? symbol->flags & flags 684 675 : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE)))) 685 676 return symbol; ··· 686 679 new_name = strdup(name); 687 680 } else { 688 681 new_name = NULL; 689 - hash = 256; 682 + hash = 0; 690 683 } 691 684 692 685 symbol = malloc(sizeof(*symbol)); ··· 704 697 struct symbol *sym_find(const char *name) 705 698 { 706 699 struct symbol *symbol = NULL; 707 - const char *ptr; 708 700 int hash = 0; 709 701 710 702 if (!name) ··· 716 710 case 'n': return &symbol_no; 717 711 } 718 712 } 719 - for (ptr = name; *ptr; ptr++) 720 - hash += *ptr; 721 - hash &= 0xff; 713 + hash = strhash(name) % SYMBOL_HASHSIZE; 722 714 723 715 for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { 724 - if (!strcmp(symbol->name, name) && 716 + if (symbol->name && 717 + !strcmp(symbol->name, name) && 725 718 !(symbol->flags & SYMBOL_CONST)) 726 719 break; 727 720 } ··· 755 750 return NULL; 756 751 } 757 752 } 753 + sym_calc_value(sym); 758 754 sym_arr[cnt++] = sym; 759 755 } 760 756 if (sym_arr)
+2
scripts/kconfig/util.c
··· 78 78 struct gstr gs; 79 79 gs.s = malloc(sizeof(char) * 64); 80 80 gs.len = 64; 81 + gs.max_width = 0; 81 82 strcpy(gs.s, "\0"); 82 83 return gs; 83 84 } ··· 89 88 struct gstr gs; 90 89 gs.s = strdup(s); 91 90 gs.len = strlen(s) + 1; 91 + gs.max_width = 0; 92 92 return gs; 93 93 } 94 94
+19 -6
scripts/kconfig/zconf.tab.c_shipped
··· 104 104 static void zconferror(const char *err); 105 105 static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken); 106 106 107 - struct symbol *symbol_hash[257]; 107 + struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 108 108 109 109 static struct menu *current_menu, *current_entry; 110 110 ··· 2220 2220 zconf_initscan(name); 2221 2221 2222 2222 sym_init(); 2223 - menu_init(); 2223 + _menu_init(); 2224 2224 modules_sym = sym_lookup(NULL, 0); 2225 2225 modules_sym->type = S_BOOLEAN; 2226 2226 modules_sym->flags |= SYMBOL_AUTO; ··· 2336 2336 struct property *prop; 2337 2337 2338 2338 if (sym_is_choice(sym)) 2339 - fprintf(out, "choice\n"); 2339 + fprintf(out, "\nchoice\n"); 2340 2340 else 2341 - fprintf(out, "config %s\n", sym->name); 2341 + fprintf(out, "\nconfig %s\n", sym->name); 2342 2342 switch (sym->type) { 2343 2343 case S_BOOLEAN: 2344 2344 fputs(" boolean\n", out); ··· 2384 2384 case P_CHOICE: 2385 2385 fputs(" #choice value\n", out); 2386 2386 break; 2387 + case P_SELECT: 2388 + fputs( " select ", out); 2389 + expr_fprint(prop->expr, out); 2390 + fputc('\n', out); 2391 + break; 2392 + case P_RANGE: 2393 + fputs( " range ", out); 2394 + expr_fprint(prop->expr, out); 2395 + fputc('\n', out); 2396 + break; 2397 + case P_MENU: 2398 + fputs( " menu ", out); 2399 + print_quoted_string(out, prop->text); 2400 + fputc('\n', out); 2401 + break; 2387 2402 default: 2388 2403 fprintf(out, " unknown prop %d!\n", prop->type); 2389 2404 break; ··· 2410 2395 menu->help[len] = 0; 2411 2396 fprintf(out, " help\n%s\n", menu->help); 2412 2397 } 2413 - fputc('\n', out); 2414 2398 } 2415 2399 2416 2400 void zconfdump(FILE *out) ··· 2442 2428 expr_fprint(prop->visible.expr, out); 2443 2429 fputc('\n', out); 2444 2430 } 2445 - fputs("\n", out); 2446 2431 } 2447 2432 2448 2433 if (menu->list)
+19 -6
scripts/kconfig/zconf.y
··· 27 27 static void zconferror(const char *err); 28 28 static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken); 29 29 30 - struct symbol *symbol_hash[257]; 30 + struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 31 31 32 32 static struct menu *current_menu, *current_entry; 33 33 ··· 475 475 zconf_initscan(name); 476 476 477 477 sym_init(); 478 - menu_init(); 478 + _menu_init(); 479 479 modules_sym = sym_lookup(NULL, 0); 480 480 modules_sym->type = S_BOOLEAN; 481 481 modules_sym->flags |= SYMBOL_AUTO; ··· 591 591 struct property *prop; 592 592 593 593 if (sym_is_choice(sym)) 594 - fprintf(out, "choice\n"); 594 + fprintf(out, "\nchoice\n"); 595 595 else 596 - fprintf(out, "config %s\n", sym->name); 596 + fprintf(out, "\nconfig %s\n", sym->name); 597 597 switch (sym->type) { 598 598 case S_BOOLEAN: 599 599 fputs(" boolean\n", out); ··· 639 639 case P_CHOICE: 640 640 fputs(" #choice value\n", out); 641 641 break; 642 + case P_SELECT: 643 + fputs( " select ", out); 644 + expr_fprint(prop->expr, out); 645 + fputc('\n', out); 646 + break; 647 + case P_RANGE: 648 + fputs( " range ", out); 649 + expr_fprint(prop->expr, out); 650 + fputc('\n', out); 651 + break; 652 + case P_MENU: 653 + fputs( " menu ", out); 654 + print_quoted_string(out, prop->text); 655 + fputc('\n', out); 656 + break; 642 657 default: 643 658 fprintf(out, " unknown prop %d!\n", prop->type); 644 659 break; ··· 665 650 menu->help[len] = 0; 666 651 fprintf(out, " help\n%s\n", menu->help); 667 652 } 668 - fputc('\n', out); 669 653 } 670 654 671 655 void zconfdump(FILE *out) ··· 697 683 expr_fprint(prop->visible.expr, out); 698 684 fputc('\n', out); 699 685 } 700 - fputs("\n", out); 701 686 } 702 687 703 688 if (menu->list)
+39 -15
scripts/markup_oops.pl
··· 2 2 3 3 use File::Basename; 4 4 use Math::BigInt; 5 + use Getopt::Long; 5 6 6 7 # Copyright 2008, Intel Corporation 7 8 # ··· 16 15 # Arjan van de Ven <arjan@linux.intel.com> 17 16 18 17 18 + my $cross_compile = ""; 19 + my $vmlinux_name = ""; 20 + my $modulefile = ""; 21 + 22 + # Get options 23 + Getopt::Long::GetOptions( 24 + 'cross-compile|c=s' => \$cross_compile, 25 + 'module|m=s' => \$modulefile, 26 + 'help|h' => \&usage, 27 + ) || usage (); 19 28 my $vmlinux_name = $ARGV[0]; 20 29 if (!defined($vmlinux_name)) { 21 30 my $kerver = `uname -r`; ··· 34 23 print "No vmlinux specified, assuming $vmlinux_name\n"; 35 24 } 36 25 my $filename = $vmlinux_name; 37 - # 38 - # Step 1: Parse the oops to find the EIP value 39 - # 26 + 27 + # Parse the oops to find the EIP value 40 28 41 29 my $target = "0"; 42 30 my $function; ··· 187 177 my $decodestop = Math::BigInt->from_hex("0x$target") + 8192; 188 178 if ($target eq "0") { 189 179 print "No oops found!\n"; 190 - print "Usage: \n"; 191 - print " dmesg | perl scripts/markup_oops.pl vmlinux\n"; 192 - exit; 180 + usage(); 193 181 } 194 182 195 183 # if it's a module, we need to find the .ko file and calculate a load offset 196 184 if ($module ne "") { 197 - my $modulefile = `modinfo $module | grep '^filename:' | awk '{ print \$2 }'`; 198 - chomp($modulefile); 185 + if ($modulefile eq "") { 186 + $modulefile = `modinfo -F filename $module`; 187 + chomp($modulefile); 188 + } 199 189 $filename = $modulefile; 200 190 if ($filename eq "") { 201 191 print "Module .ko file for $module not found. Aborting\n"; 202 192 exit; 203 193 } 204 194 # ok so we found the module, now we need to calculate the vma offset 205 - open(FILE, "objdump -dS $filename |") || die "Cannot start objdump"; 195 + open(FILE, $cross_compile."objdump -dS $filename |") || die "Cannot start objdump"; 206 196 while (<FILE>) { 207 197 if ($_ =~ /^([0-9a-f]+) \<$function\>\:/) { 208 198 my $fu = $1; 209 - $vmaoffset = hex($target) - hex($fu) - hex($func_offset); 199 + $vmaoffset = Math::BigInt->from_hex("0x$target") - Math::BigInt->from_hex("0x$fu") - Math::BigInt->from_hex("0x$func_offset"); 210 200 } 211 201 } 212 202 close(FILE); ··· 214 204 215 205 my $counter = 0; 216 206 my $state = 0; 217 - my $center = 0; 207 + my $center = -1; 218 208 my @lines; 219 209 my @reglines; 220 210 ··· 222 212 my ($address, $target) = @_; 223 213 my $ad = "0x".$address; 224 214 my $ta = "0x".$target; 225 - my $delta = hex($ad) - hex($ta); 215 + my $delta = Math::BigInt->from_hex($ad) - Math::BigInt->from_hex($ta); 226 216 227 217 if (($delta > -4096) && ($delta < 4096)) { 228 218 return 1; ··· 235 225 # first, parse the input into the lines array, but to keep size down, 236 226 # we only do this for 4Kb around the sweet spot 237 227 238 - open(FILE, "objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename |") || die "Cannot start objdump"; 228 + open(FILE, $cross_compile."objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename |") || die "Cannot start objdump"; 239 229 240 230 while (<FILE>) { 241 231 my $line = $_; ··· 246 236 $state = 1; 247 237 } 248 238 } 249 - } else { 239 + } 240 + if ($state == 1) { 250 241 if ($line =~ /^([a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]+)\:/) { 251 242 my $val = $1; 252 243 if (!InRange($val, $target)) { ··· 270 259 exit; 271 260 } 272 261 273 - if ($center == 0) { 262 + if ($center == -1) { 274 263 print "No matching code found \n"; 275 264 exit; 276 265 } ··· 353 342 } 354 343 print "\n"; 355 344 $i = $i +1; 345 + } 346 + 347 + sub usage { 348 + print <<EOT; 349 + Usage: 350 + dmesg | perl $0 [OPTION] [VMLINUX] 351 + 352 + OPTION: 353 + -c, --cross-compile CROSS_COMPILE Specify the prefix used for toolchain. 354 + -m, --module MODULE_DIRNAME Specify the module filename. 355 + -h, --help Help. 356 + EOT 357 + exit; 356 358 } 357 359
+2 -3
scripts/mkcompile_h
··· 67 67 echo \#define LINUX_COMPILE_BY \"`whoami`\" 68 68 echo \#define LINUX_COMPILE_HOST \"`hostname | $UTS_TRUNCATE`\" 69 69 70 - if [ -x /bin/dnsdomainname ]; then 71 - domain=`dnsdomainname 2> /dev/null` 72 - elif [ -x /bin/domainname ]; then 70 + domain=`dnsdomainname 2> /dev/null` 71 + if [ -z "$domain" ]; then 73 72 domain=`domainname 2> /dev/null` 74 73 fi 75 74
+88 -64
scripts/mod/modpost.c
··· 781 781 #define ALL_EXIT_TEXT_SECTIONS \ 782 782 ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$" 783 783 784 - #define ALL_INIT_SECTIONS INIT_SECTIONS, DEV_INIT_SECTIONS, \ 785 - CPU_INIT_SECTIONS, MEM_INIT_SECTIONS 786 - #define ALL_EXIT_SECTIONS EXIT_SECTIONS, DEV_EXIT_SECTIONS, \ 787 - CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS 784 + #define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \ 785 + MEM_INIT_SECTIONS 786 + #define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \ 787 + MEM_EXIT_SECTIONS 788 + 789 + #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS 790 + #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS 788 791 789 792 #define DATA_SECTIONS ".data$", ".data.rel$" 790 793 #define TEXT_SECTIONS ".text$" ··· 817 814 818 815 819 816 /* symbols in .data that may refer to init/exit sections */ 820 - static const char *symbol_white_list[] = 821 - { 822 - "*driver", 823 - "*_template", /* scsi uses *_template a lot */ 824 - "*_timer", /* arm uses ops structures named _timer a lot */ 825 - "*_sht", /* scsi also used *_sht to some extent */ 826 - "*_ops", 827 - "*_probe", 828 - "*_probe_one", 829 - "*_console", 830 - NULL 831 - }; 817 + #define DEFAULT_SYMBOL_WHITE_LIST \ 818 + "*driver", \ 819 + "*_template", /* scsi uses *_template a lot */ \ 820 + "*_timer", /* arm uses ops structures named _timer a lot */ \ 821 + "*_sht", /* scsi also used *_sht to some extent */ \ 822 + "*_ops", \ 823 + "*_probe", \ 824 + "*_probe_one", \ 825 + "*_console" 832 826 833 827 static const char *head_sections[] = { ".head.text*", NULL }; 834 828 static const char *linker_symbols[] = 835 829 { "__init_begin", "_sinittext", "_einittext", NULL }; 836 830 837 831 enum mismatch { 838 - NO_MISMATCH, 839 - TEXT_TO_INIT, 840 - DATA_TO_INIT, 841 - TEXT_TO_EXIT, 842 - DATA_TO_EXIT, 843 - XXXINIT_TO_INIT, 844 - XXXEXIT_TO_EXIT, 845 - INIT_TO_EXIT, 846 - EXIT_TO_INIT, 832 + TEXT_TO_ANY_INIT, 833 + DATA_TO_ANY_INIT, 834 + TEXT_TO_ANY_EXIT, 835 + DATA_TO_ANY_EXIT, 836 + XXXINIT_TO_SOME_INIT, 837 + XXXEXIT_TO_SOME_EXIT, 838 + ANY_INIT_TO_ANY_EXIT, 839 + ANY_EXIT_TO_ANY_INIT, 847 840 EXPORT_TO_INIT_EXIT, 848 841 }; 849 842 ··· 847 848 const char *fromsec[20]; 848 849 const char *tosec[20]; 849 850 enum mismatch mismatch; 851 + const char *symbol_white_list[20]; 850 852 }; 851 853 852 854 const struct sectioncheck sectioncheck[] = { ··· 857 857 { 858 858 .fromsec = { TEXT_SECTIONS, NULL }, 859 859 .tosec = { ALL_INIT_SECTIONS, NULL }, 860 - .mismatch = TEXT_TO_INIT, 860 + .mismatch = TEXT_TO_ANY_INIT, 861 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 861 862 }, 862 863 { 863 864 .fromsec = { DATA_SECTIONS, NULL }, 864 - .tosec = { ALL_INIT_SECTIONS, NULL }, 865 - .mismatch = DATA_TO_INIT, 865 + .tosec = { ALL_XXXINIT_SECTIONS, NULL }, 866 + .mismatch = DATA_TO_ANY_INIT, 867 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 868 + }, 869 + { 870 + .fromsec = { DATA_SECTIONS, NULL }, 871 + .tosec = { INIT_SECTIONS, NULL }, 872 + .mismatch = DATA_TO_ANY_INIT, 873 + .symbol_white_list = { 874 + "*_template", "*_timer", "*_sht", "*_ops", 875 + "*_probe", "*_probe_one", "*_console", NULL 876 + }, 866 877 }, 867 878 { 868 879 .fromsec = { TEXT_SECTIONS, NULL }, 869 880 .tosec = { ALL_EXIT_SECTIONS, NULL }, 870 - .mismatch = TEXT_TO_EXIT, 881 + .mismatch = TEXT_TO_ANY_EXIT, 882 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 871 883 }, 872 884 { 873 885 .fromsec = { DATA_SECTIONS, NULL }, 874 886 .tosec = { ALL_EXIT_SECTIONS, NULL }, 875 - .mismatch = DATA_TO_EXIT, 887 + .mismatch = DATA_TO_ANY_EXIT, 888 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 876 889 }, 877 890 /* Do not reference init code/data from devinit/cpuinit/meminit code/data */ 878 891 { 879 - .fromsec = { DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, MEM_INIT_SECTIONS, NULL }, 892 + .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, 880 893 .tosec = { INIT_SECTIONS, NULL }, 881 - .mismatch = XXXINIT_TO_INIT, 894 + .mismatch = XXXINIT_TO_SOME_INIT, 895 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 882 896 }, 883 897 /* Do not reference cpuinit code/data from meminit code/data */ 884 898 { 885 899 .fromsec = { MEM_INIT_SECTIONS, NULL }, 886 900 .tosec = { CPU_INIT_SECTIONS, NULL }, 887 - .mismatch = XXXINIT_TO_INIT, 901 + .mismatch = XXXINIT_TO_SOME_INIT, 902 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 888 903 }, 889 904 /* Do not reference meminit code/data from cpuinit code/data */ 890 905 { 891 906 .fromsec = { CPU_INIT_SECTIONS, NULL }, 892 907 .tosec = { MEM_INIT_SECTIONS, NULL }, 893 - .mismatch = XXXINIT_TO_INIT, 908 + .mismatch = XXXINIT_TO_SOME_INIT, 909 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 894 910 }, 895 911 /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */ 896 912 { 897 - .fromsec = { DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS, NULL }, 913 + .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, 898 914 .tosec = { EXIT_SECTIONS, NULL }, 899 - .mismatch = XXXEXIT_TO_EXIT, 915 + .mismatch = XXXEXIT_TO_SOME_EXIT, 916 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 900 917 }, 901 918 /* Do not reference cpuexit code/data from memexit code/data */ 902 919 { 903 920 .fromsec = { MEM_EXIT_SECTIONS, NULL }, 904 921 .tosec = { CPU_EXIT_SECTIONS, NULL }, 905 - .mismatch = XXXEXIT_TO_EXIT, 922 + .mismatch = XXXEXIT_TO_SOME_EXIT, 923 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 906 924 }, 907 925 /* Do not reference memexit code/data from cpuexit code/data */ 908 926 { 909 927 .fromsec = { CPU_EXIT_SECTIONS, NULL }, 910 928 .tosec = { MEM_EXIT_SECTIONS, NULL }, 911 - .mismatch = XXXEXIT_TO_EXIT, 929 + .mismatch = XXXEXIT_TO_SOME_EXIT, 930 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 912 931 }, 913 932 /* Do not use exit code/data from init code */ 914 933 { 915 934 .fromsec = { ALL_INIT_SECTIONS, NULL }, 916 935 .tosec = { ALL_EXIT_SECTIONS, NULL }, 917 - .mismatch = INIT_TO_EXIT, 936 + .mismatch = ANY_INIT_TO_ANY_EXIT, 937 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 918 938 }, 919 939 /* Do not use init code/data from exit code */ 920 940 { 921 941 .fromsec = { ALL_EXIT_SECTIONS, NULL }, 922 942 .tosec = { ALL_INIT_SECTIONS, NULL }, 923 - .mismatch = EXIT_TO_INIT, 943 + .mismatch = ANY_EXIT_TO_ANY_INIT, 944 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 924 945 }, 925 946 /* Do not export init/exit functions or data */ 926 947 { 927 948 .fromsec = { "__ksymtab*", NULL }, 928 949 .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, 929 - .mismatch = EXPORT_TO_INIT_EXIT 950 + .mismatch = EXPORT_TO_INIT_EXIT, 951 + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, 930 952 } 931 953 }; 932 954 933 - static int section_mismatch(const char *fromsec, const char *tosec) 955 + static const struct sectioncheck *section_mismatch( 956 + const char *fromsec, const char *tosec) 934 957 { 935 958 int i; 936 959 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck); ··· 962 939 for (i = 0; i < elems; i++) { 963 940 if (match(fromsec, check->fromsec) && 964 941 match(tosec, check->tosec)) 965 - return check->mismatch; 942 + return check; 966 943 check++; 967 944 } 968 - return NO_MISMATCH; 945 + return NULL; 969 946 } 970 947 971 948 /** ··· 984 961 * Pattern 2: 985 962 * Many drivers utilise a *driver container with references to 986 963 * add, remove, probe functions etc. 987 - * These functions may often be marked __init and we do not want to 964 + * These functions may often be marked __devinit and we do not want to 988 965 * warn here. 989 966 * the pattern is identified by: 990 967 * tosec = init or exit section ··· 1005 982 * refsymname = __init_begin, _sinittext, _einittext 1006 983 * 1007 984 **/ 1008 - static int secref_whitelist(const char *fromsec, const char *fromsym, 985 + static int secref_whitelist(const struct sectioncheck *mismatch, 986 + const char *fromsec, const char *fromsym, 1009 987 const char *tosec, const char *tosym) 1010 988 { 1011 989 /* Check for pattern 1 */ ··· 1018 994 /* Check for pattern 2 */ 1019 995 if (match(tosec, init_exit_sections) && 1020 996 match(fromsec, data_sections) && 1021 - match(fromsym, symbol_white_list)) 997 + match(fromsym, mismatch->symbol_white_list)) 1022 998 return 0; 1023 999 1024 1000 /* Check for pattern 3 */ ··· 1179 1155 * Try to find symbols near it so user can find it. 1180 1156 * Check whitelist before warning - it may be a false positive. 1181 1157 */ 1182 - static void report_sec_mismatch(const char *modname, enum mismatch mismatch, 1158 + static void report_sec_mismatch(const char *modname, 1159 + const struct sectioncheck *mismatch, 1183 1160 const char *fromsec, 1184 1161 unsigned long long fromaddr, 1185 1162 const char *fromsym, ··· 1211 1186 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec, 1212 1187 tosym, to_p); 1213 1188 1214 - switch (mismatch) { 1215 - case TEXT_TO_INIT: 1189 + switch (mismatch->mismatch) { 1190 + case TEXT_TO_ANY_INIT: 1216 1191 fprintf(stderr, 1217 1192 "The function %s%s() references\n" 1218 1193 "the %s %s%s%s.\n" ··· 1222 1197 to, sec2annotation(tosec), tosym, to_p, 1223 1198 fromsym, sec2annotation(tosec), tosym); 1224 1199 break; 1225 - case DATA_TO_INIT: { 1226 - const char **s = symbol_white_list; 1200 + case DATA_TO_ANY_INIT: { 1201 + const char *const *s = mismatch->symbol_white_list; 1227 1202 fprintf(stderr, 1228 1203 "The variable %s references\n" 1229 1204 "the %s %s%s%s\n" ··· 1236 1211 fprintf(stderr, "\n"); 1237 1212 break; 1238 1213 } 1239 - case TEXT_TO_EXIT: 1214 + case TEXT_TO_ANY_EXIT: 1240 1215 fprintf(stderr, 1241 1216 "The function %s() references a %s in an exit section.\n" 1242 1217 "Often the %s %s%s has valid usage outside the exit section\n" 1243 1218 "and the fix is to remove the %sannotation of %s.\n", 1244 1219 fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym); 1245 1220 break; 1246 - case DATA_TO_EXIT: { 1247 - const char **s = symbol_white_list; 1221 + case DATA_TO_ANY_EXIT: { 1222 + const char *const *s = mismatch->symbol_white_list; 1248 1223 fprintf(stderr, 1249 1224 "The variable %s references\n" 1250 1225 "the %s %s%s%s\n" ··· 1257 1232 fprintf(stderr, "\n"); 1258 1233 break; 1259 1234 } 1260 - case XXXINIT_TO_INIT: 1261 - case XXXEXIT_TO_EXIT: 1235 + case XXXINIT_TO_SOME_INIT: 1236 + case XXXEXIT_TO_SOME_EXIT: 1262 1237 fprintf(stderr, 1263 1238 "The %s %s%s%s references\n" 1264 1239 "a %s %s%s%s.\n" ··· 1268 1243 to, sec2annotation(tosec), tosym, to_p, 1269 1244 tosym, fromsym, tosym); 1270 1245 break; 1271 - case INIT_TO_EXIT: 1246 + case ANY_INIT_TO_ANY_EXIT: 1272 1247 fprintf(stderr, 1273 1248 "The %s %s%s%s references\n" 1274 1249 "a %s %s%s%s.\n" ··· 1281 1256 to, sec2annotation(tosec), tosym, to_p, 1282 1257 sec2annotation(tosec), tosym, to_p); 1283 1258 break; 1284 - case EXIT_TO_INIT: 1259 + case ANY_EXIT_TO_ANY_INIT: 1285 1260 fprintf(stderr, 1286 1261 "The %s %s%s%s references\n" 1287 1262 "a %s %s%s%s.\n" ··· 1300 1275 "Fix this by removing the %sannotation of %s " 1301 1276 "or drop the export.\n", 1302 1277 tosym, sec2annotation(tosec), sec2annotation(tosec), tosym); 1303 - case NO_MISMATCH: 1304 - /* To get warnings on missing members */ 1305 1278 break; 1306 1279 } 1307 1280 fprintf(stderr, "\n"); ··· 1309 1286 Elf_Rela *r, Elf_Sym *sym, const char *fromsec) 1310 1287 { 1311 1288 const char *tosec; 1312 - enum mismatch mismatch; 1289 + const struct sectioncheck *mismatch; 1313 1290 1314 1291 tosec = sec_name(elf, sym->st_shndx); 1315 1292 mismatch = section_mismatch(fromsec, tosec); 1316 - if (mismatch != NO_MISMATCH) { 1293 + if (mismatch) { 1317 1294 Elf_Sym *to; 1318 1295 Elf_Sym *from; 1319 1296 const char *tosym; ··· 1325 1302 tosym = sym_name(elf, to); 1326 1303 1327 1304 /* check whitelist - we may ignore it */ 1328 - if (secref_whitelist(fromsec, fromsym, tosec, tosym)) { 1305 + if (secref_whitelist(mismatch, 1306 + fromsec, fromsym, tosec, tosym)) { 1329 1307 report_sec_mismatch(modname, mismatch, 1330 1308 fromsec, r->r_offset, fromsym, 1331 1309 is_function(from), tosec, tosym,
+33 -32
scripts/namespace.pl
··· 175 175 } 176 176 if (! -e "$source.c" && ! -e "$source.S") { 177 177 # No obvious source, exclude the object if it is conglomerate 178 - if (! open(OBJDUMPDATA, "$objdump $basename|")) { 179 - printf STDERR "$objdump $fullname failed $!\n"; 180 - return; 181 - } 178 + open(my $objdumpdata, "$objdump $basename|") 179 + or die "$objdump $fullname failed $!\n"; 180 + 182 181 my $comment; 183 - while (<OBJDUMPDATA>) { 182 + while (<$objdumpdata>) { 184 183 chomp(); 185 184 if (/^In archive/) { 186 185 # Archives are always conglomerate ··· 189 190 next if (! /^[ 0-9a-f]{5,} /); 190 191 $comment .= substr($_, 43); 191 192 } 192 - close(OBJDUMPDATA); 193 + close($objdumpdata); 194 + 193 195 if (!defined($comment) || $comment !~ /GCC\:.*GCC\:/m) { 194 196 printf STDERR "No source file found for $fullname\n"; 195 197 } 196 198 return; 197 199 } 198 - if (! open(NMDATA, "$nm $basename|")) { 199 - printf STDERR "$nm $fullname failed $!\n"; 200 - return; 201 - } 200 + open (my $nmdata, "$nm $basename|") 201 + or die "$nm $fullname failed $!\n"; 202 + 202 203 my @nmdata; 203 - while (<NMDATA>) { 204 + while (<$nmdata>) { 204 205 chop; 205 206 ($type, $name) = (split(/ +/, $_, 3))[1..2]; 206 207 # Expected types ··· 267 268 } 268 269 } 269 270 } 270 - close(NMDATA); 271 + close($nmdata); 272 + 271 273 if ($#nmdata < 0) { 272 274 if ( 273 275 $fullname ne "lib/brlock.o" ··· 316 316 317 317 sub list_multiply_defined 318 318 { 319 - my ($name, $module); 320 - foreach $name (keys(%def)) { 319 + foreach my $name (keys(%def)) { 321 320 if ($#{$def{$name}} > 0) { 322 321 # Special case for cond_syscall 323 322 if ($#{$def{$name}} == 1 && $name =~ /^sys_/ && ··· 332 333 &drop_def("arch/x86/kernel/vsyscall-sysenter_32.o", $name); 333 334 next; 334 335 } 336 + 335 337 printf "$name is multiply defined in :-\n"; 336 - foreach $module (@{$def{$name}}) { 338 + foreach my $module (@{$def{$name}}) { 337 339 printf "\t$module\n"; 338 340 } 339 341 } ··· 343 343 344 344 sub resolve_external_references 345 345 { 346 - my ($object, $type, $name, $i, $j, $kstrtab, $ksymtab, $export); 346 + my ($kstrtab, $ksymtab, $export); 347 + 347 348 printf "\n"; 348 - foreach $object (keys(%nmdata)) { 349 + foreach my $object (keys(%nmdata)) { 349 350 my $nmdata = $nmdata{$object}; 350 - for ($i = 0; $i <= $#{$nmdata}; ++$i) { 351 - ($type, $name) = split(' ', $nmdata->[$i], 2); 351 + for (my $i = 0; $i <= $#{$nmdata}; ++$i) { 352 + my ($type, $name) = split(' ', $nmdata->[$i], 2); 352 353 if ($type eq "U" || $type eq "w") { 353 354 if (exists($def{$name}) || exists($ksymtab{$name})) { 354 355 # add the owning object to the nmdata ··· 358 357 $kstrtab = "R __kstrtab_$name"; 359 358 $ksymtab = "R __ksymtab_$name"; 360 359 $export = 0; 361 - for ($j = 0; $j <= $#{$nmdata}; ++$j) { 360 + for (my $j = 0; $j <= $#{$nmdata}; ++$j) { 362 361 if ($nmdata->[$j] eq $kstrtab || 363 362 $nmdata->[$j] eq $ksymtab) { 364 363 $export = 1; ··· 425 424 sub list_extra_externals 426 425 { 427 426 my %noref = (); 428 - my ($name, @module, $module, $export); 429 - foreach $name (keys(%def)) { 427 + 428 + foreach my $name (keys(%def)) { 430 429 if (! exists($ref{$name})) { 431 - @module = @{$def{$name}}; 432 - foreach $module (@module) { 430 + my @module = @{$def{$name}}; 431 + foreach my $module (@module) { 433 432 if (! exists($noref{$module})) { 434 433 $noref{$module} = []; 435 434 } ··· 439 438 } 440 439 if (%noref) { 441 440 printf "\nExternally defined symbols with no external references\n"; 442 - foreach $module (sort(keys(%noref))) { 441 + foreach my $module (sort(keys(%noref))) { 443 442 printf " $module\n"; 444 443 foreach (sort(@{$noref{$module}})) { 445 - if (exists($export{$_})) { 446 - $export = " (export only)"; 447 - } 448 - else { 449 - $export = ""; 450 - } 451 - printf " $_$export\n"; 444 + my $export; 445 + if (exists($export{$_})) { 446 + $export = " (export only)"; 447 + } else { 448 + $export = ""; 449 + } 450 + printf " $_$export\n"; 452 451 } 453 452 } 454 453 }
+2
scripts/package/builddeb
··· 18 18 cp debian/copyright "$pdir/usr/share/doc/$pname/" 19 19 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" 20 20 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" 21 + sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ 22 + | xargs -r0 md5sum > DEBIAN/md5sums" 21 23 22 24 # Fix ownership and permissions 23 25 chown -R root:root "$pdir"
+1 -1
scripts/package/mkspec
··· 39 39 echo "Source: kernel-$__KERNELRELEASE.tar.gz" 40 40 fi 41 41 42 - echo "BuildRoot: /var/tmp/%{name}-%{PACKAGE_VERSION}-root" 42 + echo "BuildRoot: %{_tmppath}/%{name}-%{PACKAGE_VERSION}-root" 43 43 echo "Provides: $PROVIDES" 44 44 echo "%define __spec_install_post /usr/lib/rpm/brp-compress || :" 45 45 echo "%define debug_package %{nil}"
+3 -5
scripts/profile2linkerlist.pl
··· 7 7 # usage: 8 8 # readprofile | sort -rn | perl profile2linkerlist.pl > functionlist 9 9 # 10 + use strict; 10 11 11 12 while (<>) { 12 13 my $line = $_; 13 14 14 15 $_ =~ /\W*[0-9]+\W*([a-zA-Z\_0-9]+)\W*[0-9]+/; 15 16 16 - if ( ($line =~ /unknown/) || ($line =~ /total/)) { 17 - 18 - } else { 19 - print "*(.text.$1)\n"; 20 - } 17 + print "*(.text.$1)\n" 18 + unless ($line =~ /unknown/) || ($line =~ /total/); 21 19 }
+1 -1
scripts/rt-tester/rt-tester.py
··· 1 - #!/usr/bin/env python 1 + #!/usr/bin/python 2 2 # 3 3 # rt-mutex tester 4 4 #
+1 -1
scripts/show_delta
··· 1 - #!/usr/bin/env python 1 + #!/usr/bin/python 2 2 # 3 3 # show_deltas: Read list of printk messages instrumented with 4 4 # time data, and format with time deltas.
+30 -15
scripts/tags.sh
··· 5 5 # mode may be any of: tags, TAGS, cscope 6 6 # 7 7 # Uses the following environment variables: 8 - # ARCH, SUBARCH, srctree, src, obj 8 + # ARCH, SUBARCH, SRCARCH, srctree, src, obj 9 9 10 10 if [ "$KBUILD_VERBOSE" = "1" ]; then 11 11 set -x ··· 17 17 -name .git ) \ 18 18 -prune -o" 19 19 20 - # Do not use full path is we do not use O=.. builds 20 + # Do not use full path if we do not use O=.. builds 21 + # Use make O=. {tags|cscope} 22 + # to force full paths for a non-O= build 21 23 if [ "${KBUILD_SRC}" = "" ]; then 22 24 tree= 23 25 else 24 26 tree=${srctree}/ 25 27 fi 26 28 29 + # Find all available archs 30 + find_all_archs() 31 + { 32 + ALLSOURCE_ARCHS="" 33 + for arch in `ls ${tree}arch`; do 34 + ALLSOURCE_ARCHS="${ALLSOURCE_ARCHS} "${arch##\/} 35 + done 36 + } 37 + 27 38 # Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH 28 39 if [ "${ALLSOURCE_ARCHS}" = "" ]; then 29 40 ALLSOURCE_ARCHS=${SRCARCH} 41 + elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then 42 + find_all_archs 30 43 fi 31 44 32 45 # find sources in arch/$ARCH 33 46 find_arch_sources() 34 47 { 35 - find ${tree}arch/$1 $ignore -name "$2" -print; 48 + for i in $archincludedir; do 49 + prune="$prune -wholename $i -prune -o" 50 + done 51 + find ${tree}arch/$1 $ignore $prune -name "$2" -print; 36 52 } 37 53 38 54 # find sources in arch/$1/include 39 55 find_arch_include_sources() 40 56 { 41 - find ${tree}arch/$1/include $ignore -name "$2" -print; 57 + include=$(find ${tree}arch/$1/ -name include -type d); 58 + if [ -n "$include" ]; then 59 + archincludedir="$archincludedir $include" 60 + find $include $ignore -name "$2" -print; 61 + fi 42 62 } 43 63 44 64 # find sources in include/ ··· 83 63 84 64 all_sources() 85 65 { 86 - for arch in $ALLSOURCE_ARCHS 87 - do 88 - find_sources $arch '*.[chS]' 89 - done 66 + find_arch_include_sources ${SRCARCH} '*.[chS]' 90 67 if [ ! -z "$archinclude" ]; then 91 68 find_arch_include_sources $archinclude '*.[chS]' 92 69 fi 93 70 find_include_sources '*.[chS]' 71 + for arch in $ALLSOURCE_ARCHS 72 + do 73 + find_sources $arch '*.[chS]' 74 + done 94 75 find_other_sources '*.[chS]' 95 76 } 96 77 ··· 110 89 111 90 docscope() 112 91 { 113 - # always use absolute paths for cscope, as recommended by cscope 114 - # upstream 115 - case "$tree" in 116 - /*) ;; 117 - *) tree=$PWD/$tree ;; 118 - esac 119 - (cd /; echo \-k; echo \-q; all_sources) > cscope.files 92 + (echo \-k; echo \-q; all_sources) > cscope.files 120 93 cscope -b -f cscope.out 121 94 } 122 95