mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-01 20:55:19 +02:00
vim entered the distribution, now we only need usb vga and keyboard support, to have a perfect desktop ;), thx Michael Cohen
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@3481 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
48fb699ff3
commit
8d716619c2
@ -54,6 +54,7 @@ source "package/rrdtool/Config.in"
|
|||||||
source "package/rrdtool1/Config.in"
|
source "package/rrdtool1/Config.in"
|
||||||
source "package/rrdcollect/Config.in"
|
source "package/rrdcollect/Config.in"
|
||||||
endmenu
|
endmenu
|
||||||
|
source "package/vim/Config.in"
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Networking"
|
menu "Networking"
|
||||||
|
@ -254,6 +254,7 @@ package-$(BR2_COMPILE_USBUTILS) += usbutils
|
|||||||
package-$(BR2_PACKAGE_USTL) += ustl
|
package-$(BR2_PACKAGE_USTL) += ustl
|
||||||
package-$(BR2_COMPILE_UTIL_LINUX) += util-linux
|
package-$(BR2_COMPILE_UTIL_LINUX) += util-linux
|
||||||
package-$(BR2_PACKAGE_UDEV) += udev
|
package-$(BR2_PACKAGE_UDEV) += udev
|
||||||
|
package-$(BR2_PACKAGE_VIM) += vim
|
||||||
package-$(BR2_PACKAGE_VGP) += vgp
|
package-$(BR2_PACKAGE_VGP) += vgp
|
||||||
package-$(BR2_PACKAGE_VNC_REFLECTOR) += vnc-reflector
|
package-$(BR2_PACKAGE_VNC_REFLECTOR) += vnc-reflector
|
||||||
package-$(BR2_PACKAGE_VNSTAT) += vnstat
|
package-$(BR2_PACKAGE_VNSTAT) += vnstat
|
||||||
@ -323,6 +324,7 @@ irssi-compile: glib-compile ncurses-compile
|
|||||||
iperf-compile: uclibc++-compile
|
iperf-compile: uclibc++-compile
|
||||||
iptables-snmp-compile: net-snmp-compile
|
iptables-snmp-compile: net-snmp-compile
|
||||||
iptraf-compile: ncurses-compile
|
iptraf-compile: ncurses-compile
|
||||||
|
ipsec-tools-compile: openssl-compile
|
||||||
jamvm-compile: libffi-sable-compile zlib-compile sablevm-classpath-compile
|
jamvm-compile: libffi-sable-compile zlib-compile sablevm-classpath-compile
|
||||||
hostapd-compile: openssl-compile wireless-tools-compile
|
hostapd-compile: openssl-compile wireless-tools-compile
|
||||||
httping-compile: openssl-compile
|
httping-compile: openssl-compile
|
||||||
@ -397,6 +399,7 @@ tcpdump-compile: libpcap-compile
|
|||||||
tinc-compile: zlib-compile openssl-compile liblzo-compile
|
tinc-compile: zlib-compile openssl-compile liblzo-compile
|
||||||
tor-compile: libevent-compile openssl-compile zlib-compile
|
tor-compile: libevent-compile openssl-compile zlib-compile
|
||||||
usbutils-compile: libusb-compile
|
usbutils-compile: libusb-compile
|
||||||
|
vim-compile: ncurses-compile
|
||||||
vnc-reflector-compile: jpeg-compile zlib-compile
|
vnc-reflector-compile: jpeg-compile zlib-compile
|
||||||
vpnc-compile: libgcrypt-compile libgpg-error-compile
|
vpnc-compile: libgcrypt-compile libgpg-error-compile
|
||||||
vtun-compile: zlib-compile openssl-compile liblzo-compile
|
vtun-compile: zlib-compile openssl-compile liblzo-compile
|
||||||
@ -406,7 +409,6 @@ wknock-compile: libpcap-compile
|
|||||||
wpa_supplicant-compile: openssl-compile
|
wpa_supplicant-compile: openssl-compile
|
||||||
wx200d-compile: postgresql-compile
|
wx200d-compile: postgresql-compile
|
||||||
xsupplicant-compile: openssl-compile
|
xsupplicant-compile: openssl-compile
|
||||||
ipsec-tools-compile: openssl-compile
|
|
||||||
|
|
||||||
asterisk-compile: bluez-libs-compile ncurses-compile openssl-compile openh323-compile
|
asterisk-compile: bluez-libs-compile ncurses-compile openssl-compile openh323-compile
|
||||||
ifneq ($(BR2_PACKAGE_ASTERISK_CODEC_SPEEX),)
|
ifneq ($(BR2_PACKAGE_ASTERISK_CODEC_SPEEX),)
|
||||||
|
10
openwrt/package/vim/Config.in
Normal file
10
openwrt/package/vim/Config.in
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
config BR2_PACKAGE_VIM
|
||||||
|
prompt "vim............................. VI Improved"
|
||||||
|
tristate
|
||||||
|
default m if CONFIG_DEVEL
|
||||||
|
select BR2_PACKAGE_LIBNCURSES
|
||||||
|
help
|
||||||
|
An improved version of VI.
|
||||||
|
|
||||||
|
http://www.vim.org
|
||||||
|
|
65
openwrt/package/vim/Makefile
Normal file
65
openwrt/package/vim/Makefile
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# $Id$
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=vim
|
||||||
|
PKG_VERSION:=5.8
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
PKG_SOURCE_URL:=ftp://ftp.vim.org/pub/vim/unix/
|
||||||
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-src.tar.gz
|
||||||
|
PKG_MD5SUM:=
|
||||||
|
PKG_CAT:=zcat
|
||||||
|
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
|
include $(TOPDIR)/package/rules.mk
|
||||||
|
|
||||||
|
$(eval $(call PKG_template,VIM,vim,$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))
|
||||||
|
|
||||||
|
$(PKG_BUILD_DIR)/.configured:
|
||||||
|
(cd $(PKG_BUILD_DIR)/src; rm -rf config.cache; \
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" \
|
||||||
|
LDFLAGS="-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib" \
|
||||||
|
ac_cv_c_bigendian=no \
|
||||||
|
ac_cv_sizeof_off_t=8 \
|
||||||
|
ac_cv_sizeof_int=4 \
|
||||||
|
./configure \
|
||||||
|
--target=$(GNU_TARGET_NAME) \
|
||||||
|
--host=$(GNU_TARGET_NAME) \
|
||||||
|
--build=$(GNU_HOST_NAME) \
|
||||||
|
--prefix=/usr \
|
||||||
|
--exec-prefix=/usr \
|
||||||
|
--bindir=/usr/bin \
|
||||||
|
--sbindir=/usr/sbin \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--sysconfdir=/etc \
|
||||||
|
--datadir=/usr/share \
|
||||||
|
--localstatedir=/var \
|
||||||
|
--mandir=/usr/man \
|
||||||
|
--infodir=/usr/info \
|
||||||
|
--program-prefix="" \
|
||||||
|
$(DISABLE_NLS) \
|
||||||
|
--enable-min-features \
|
||||||
|
--disable-gui \
|
||||||
|
--without-x \
|
||||||
|
--disable-multibyte \
|
||||||
|
--disable-cscope \
|
||||||
|
--disable-gpm \
|
||||||
|
--with-tlib=ncurses \
|
||||||
|
);
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
$(PKG_BUILD_DIR)/.built: $(PKG_BUILD_DIR)/.configured
|
||||||
|
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||||
|
CC=$(TARGET_CC)
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
$(IPKG_VIM):
|
||||||
|
mkdir -p $(IDIR_VIM)/usr/bin
|
||||||
|
mkdir -p $(IDIR_VIM)//usr/share/vim
|
||||||
|
$(CP) ./files/vimrc $(IDIR_VIM)//usr/share/vim
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(IDIR_VIM)/usr/bin/
|
||||||
|
$(RSTRIP) $(IDIR_VIM)
|
||||||
|
$(IPKG_BUILD) $(IDIR_VIM) $(PACKAGE_DIR)
|
13
openwrt/package/vim/files/vimrc
Normal file
13
openwrt/package/vim/files/vimrc
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
set showcmd " Show (partial) command in status line.
|
||||||
|
set showmatch " Show matching brackets.
|
||||||
|
set ignorecase " Do case insensitive matching
|
||||||
|
set incsearch " Incremental search
|
||||||
|
set autowrite " Automatically save before commands like :next and :make
|
||||||
|
set nocompatible " Use Vim defaults instead of 100% vi compatibility
|
||||||
|
set backspace=indent,eol,start " more powerful backspacing
|
||||||
|
set autoindent " always set autoindenting on
|
||||||
|
set linebreak " Don't wrap words by default
|
||||||
|
set textwidth=0 " Don't wrap lines by default
|
||||||
|
set ruler " show the cursor position all the time
|
||||||
|
|
||||||
|
|
5
openwrt/package/vim/ipkg/vim.control
Normal file
5
openwrt/package/vim/ipkg/vim.control
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Package: vim
|
||||||
|
Priority: optional
|
||||||
|
Section: text
|
||||||
|
Depends: libncurses
|
||||||
|
Description: Vi Improved
|
248
openwrt/package/vim/patches/vim_configure.patch
Normal file
248
openwrt/package/vim/patches/vim_configure.patch
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
This patch is required to stop vim's configure script from insisting on
|
||||||
|
compiling test programs which obviously do not work in a cross compiled
|
||||||
|
environment.
|
||||||
|
|
||||||
|
--- vim-5.8_original/src/configure 2001-05-11 04:59:18.000000000 +1000
|
||||||
|
+++ vim-5.8/src/configure 2006-03-24 01:04:55.000000000 +1100
|
||||||
|
@@ -995,10 +995,6 @@
|
||||||
|
|
||||||
|
test "$GCC" = yes && CFLAGS="$CFLAGS -Wall"
|
||||||
|
|
||||||
|
-if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: cannot compile a simple program, check CC and CFLAGS" 1>&2; exit 1; }
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
test "$GCC" = yes && CPP_MM=M;
|
||||||
|
|
||||||
|
if test -f ./toolcheck; then
|
||||||
|
@@ -3365,29 +3361,7 @@
|
||||||
|
|
||||||
|
echo $ac_n "checking quality of toupper""... $ac_c" 1>&6
|
||||||
|
echo "configure:3368: checking quality of toupper" >&5
|
||||||
|
-if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 3373 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-#include <ctype.h>
|
||||||
|
-main() { exit(toupper('A') == 'A' && tolower('z') == 'z'); }
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:3378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
-#define BROKEN_TOUPPER 1
|
||||||
|
-EOF
|
||||||
|
- echo "$ac_t""bad" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- echo "$ac_t""good" 1>&6
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
+echo "$ac_t""good" 1>&6
|
||||||
|
|
||||||
|
|
||||||
|
echo $ac_n "checking whether __DATE__ and __TIME__ work""... $ac_c" 1>&6
|
||||||
|
@@ -4340,34 +4314,10 @@
|
||||||
|
if test "x$olibs" != "x$LIBS"; then
|
||||||
|
echo $ac_n "checking whether we talk terminfo""... $ac_c" 1>&6
|
||||||
|
echo "configure:4343: checking whether we talk terminfo" >&5
|
||||||
|
- if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program." 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4348 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-
|
||||||
|
-#ifdef HAVE_TERMCAP_H
|
||||||
|
-# include <termcap.h>
|
||||||
|
-#endif
|
||||||
|
-main()
|
||||||
|
-{char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(!strcmp(s==0 ? "" : s, "1")); }
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- echo "$ac_t""no -- we are in termcap land" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- echo "$ac_t""yes -- terminfo spoken here" 1>&6; cat >> confdefs.h <<\EOF
|
||||||
|
+echo "$ac_t""yes -- terminfo spoken here" 1>&6; cat >> confdefs.h <<\EOF
|
||||||
|
#define TERMINFO 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
else
|
||||||
|
echo "$ac_t""none found" 1>&6
|
||||||
|
fi
|
||||||
|
@@ -4600,70 +4550,14 @@
|
||||||
|
|
||||||
|
echo $ac_n "checking for struct sigcontext""... $ac_c" 1>&6
|
||||||
|
echo "configure:4603: checking for struct sigcontext" >&5
|
||||||
|
-cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4605 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
|
||||||
|
-#include <signal.h>
|
||||||
|
-test_sig()
|
||||||
|
-{
|
||||||
|
- struct sigcontext *scont;
|
||||||
|
- scont = (struct sigcontext *)0;
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-int main() {
|
||||||
|
-
|
||||||
|
-; return 0; }
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4619: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||||
|
- rm -rf conftest*
|
||||||
|
- echo "$ac_t""yes" 1>&6
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
+cat >> confdefs.h <<\EOF
|
||||||
|
#define HAVE_SIGCONTEXT 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -rf conftest*
|
||||||
|
- echo "$ac_t""no" 1>&6
|
||||||
|
-fi
|
||||||
|
-rm -f conftest*
|
||||||
|
-
|
||||||
|
echo $ac_n "checking getcwd implementation""... $ac_c" 1>&6
|
||||||
|
echo "configure:4635: checking getcwd implementation" >&5
|
||||||
|
-if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4640 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-
|
||||||
|
-char *dagger[] = { "IFS=pwd", 0 };
|
||||||
|
-main()
|
||||||
|
-{
|
||||||
|
- char buffer[500];
|
||||||
|
- extern char **environ;
|
||||||
|
- environ = dagger;
|
||||||
|
- return getcwd(buffer, 500) ? 0 : 1;
|
||||||
|
-}
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- echo "$ac_t""it is usable" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- echo "$ac_t""it stinks" 1>&6
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
-#define BAD_GETCWD 1
|
||||||
|
-EOF
|
||||||
|
-
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
+echo "$ac_t""it is usable" 1>&6
|
||||||
|
|
||||||
|
for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpwnam getpwuid \
|
||||||
|
gettimeofday getwd lstat memcmp memset nanosleep opendir putenv qsort \
|
||||||
|
@@ -4872,89 +4766,11 @@
|
||||||
|
|
||||||
|
echo $ac_n "checking whether memmove/bcopy/memcpy handle overlaps""... $ac_c" 1>&6
|
||||||
|
echo "configure:4875: checking whether memmove/bcopy/memcpy handle overlaps" >&5
|
||||||
|
-bcopy_test_prog='
|
||||||
|
-main() {
|
||||||
|
- char buf[10];
|
||||||
|
- strcpy(buf, "abcdefghi");
|
||||||
|
- mch_memmove(buf, buf + 2, 3);
|
||||||
|
- if (strncmp(buf, "ababcf", 6))
|
||||||
|
- exit(1);
|
||||||
|
- strcpy(buf, "abcdefghi");
|
||||||
|
- mch_memmove(buf + 2, buf, 3);
|
||||||
|
- if (strncmp(buf, "cdedef", 6))
|
||||||
|
- exit(1);
|
||||||
|
- exit(0); /* libc version works properly. */
|
||||||
|
-}'
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4895 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-#define mch_memmove(s,d,l) memmove(d,s,l) $bcopy_test_prog
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
+cat >> confdefs.h <<\EOF
|
||||||
|
#define USEMEMMOVE 1
|
||||||
|
-EOF
|
||||||
|
- echo "$ac_t""memmove does" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4913 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-#define mch_memmove(s,d,l) bcopy(d,s,l) $bcopy_test_prog
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
#define USEBCOPY 1
|
||||||
|
-EOF
|
||||||
|
- echo "$ac_t""bcopy does" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- if test "$cross_compiling" = yes; then
|
||||||
|
- { echo "configure: error: failed to compile test program" 1>&2; exit 1; }
|
||||||
|
-else
|
||||||
|
- cat > conftest.$ac_ext <<EOF
|
||||||
|
-#line 4931 "configure"
|
||||||
|
-#include "confdefs.h"
|
||||||
|
-#define mch_memmove(s,d,l) memcpy(d,s,l) $bcopy_test_prog
|
||||||
|
-EOF
|
||||||
|
-if { (eval echo configure:4935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
-then
|
||||||
|
- cat >> confdefs.h <<\EOF
|
||||||
|
#define USEMEMCPY 1
|
||||||
|
EOF
|
||||||
|
- echo "$ac_t""memcpy does" 1>&6
|
||||||
|
-else
|
||||||
|
- echo "configure: failed program was:" >&5
|
||||||
|
- cat conftest.$ac_ext >&5
|
||||||
|
- rm -fr conftest*
|
||||||
|
- echo "$ac_t""no" 1>&6
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-fi
|
||||||
|
-rm -fr conftest*
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-
|
||||||
|
|
||||||
|
if test "$enable_multibyte" = "yes"; then
|
||||||
|
cflags_save=$CFLAGS
|
Loading…
Reference in New Issue
Block a user